Planet Russell

,

Charles Stross — Bizarre Blanets and Weird Worlds

Hi. Sorry about the silence: I've been busy redrafting the current-newest novel in progress (it's back with my agent), and now I just flipped over to rewrite the much-rewritten novel before that (which ran into a brick wall in late 2025 for structural reasons, and which I set aside while I was working on the next book, figured out a fix for in late 2026, and am now fixing).

As you can imagine, slaving over manuscripts isn't the only thing I do on a computer. Along the way I'm browsing the web--or what's left of it these days that isn't clickbait nonsense and LLM-generated slop--and slowly accumulating a mass of perpetually open browser tabs with stuff that bears future consideration. These are not story ideas, but they're elements of background or texture that I think might conceivably come in handy in a future project. And because I'm currently working on a pair of space operas, this list is astrophysics-oriented ...

(Hint: click the links, there's some truly crazy stuff here, most of it new since 1990.)

This century is a golden age of exoplanetography. Back in 1990 there were zero tentatively identified exoplanets. But the advent of orbiting telescopes with significant light gathering power (most famously, the Hubble Space Telescope which launched that year) has shown us that not only are solar systems with multiple planets quite common, but that our own solar system is that weird kid in the corner of the playground who nobody wants to hang out with: there is an absolute zoo of exoplanet types out there. While Hubble wasn't specifically an exoplanet-hunting tool it was follwed by NASA's Kepler and Spitzer space telescopes, and just-launched Nancy Grace Roman Space Telescope, ESA's Cheops and coming PLATO) and ARIEL space telescopes, and of course the very large joint NASA/ESA James Webb Space Telescope.

Exoplanets are identified by perturbations they induce in the light curve emitted by their primary, either because they pass in front of the star or cause it to wobble slightly as the massive object orbits around its centre of mass. The consequence of having a bunch of infrared telescopes outside the atmosphere is that the count of known exoplanets as of October 2026 hit 6,445 confirmed in 4,834 planetary systems, of which 1,070 solar systems contain more than one planet. And this is only scratching the surface: to be detectable in this way, an exoplanet needs to be very massive and orbit very close--a Hot Jupiter. So of course Hot Jupiters are what we have mostly found so far. "In general their prevalence decreases exponentially as a function of the absolute stellar magnitude:" they're most common around F- and G-type stars, somewhat rarer around K-type, and very rare around red dwarfs.

While Hot Jupiters aren't of direct interest in writing human-centered SF--they're profoundly hostile environments for interstellar canned monkeys to explore--they have weird sequellae. If they end up too close to their primary star, they might undergo atmospheric stripping, leaving behind a Chthonian Planet, a rocky or metallic super-Earth such as TOI-849 b, which is about 40 times as massive as Earth but only 3.4 times Earth's radius. Alternatively, TOI-849 b might be a Mega-Earth rather than an eroded gas giant. Other Mega-Earths are a lot weirder: PSR J1719−1438 b is a pulsar planet, orbiting the millisecond pulsar PSR J1719−1438. what makes it weird is not only the fact that it orbits a millisecond pulsar (pulsars being supernova remnants, their original planets should have been vapourized during the stellar explosion that gave birth to it), but that it might be a planet that evolved from another star: the outer layers of the star were siphoned off by the more massive pulsar, leaving behind a core roughly as massive as Jupiter but a fraction of its diameter, seemingly composed mainly of crystalline carbon at a much higher density than diamond, with some oxygen concentrated in its surface.

(Don't bother writing this into your fic as a place for your hero to be exiled to mine hyperdiamond, though: it orbits its pulsar primary about twice as far out as our moon orbits the Earth, so it's probably baked by hard radiation: PSR J2719-1438 is spinning at roughly 10,000 rpm so inducing insane electrical currents in anything nearby, and your hero would be squished flat by Jupiter-adjacent surface gravity.)

A Hot Neptune is another type of common-so-far exoplanet, an Ice Giant (like, oh, our own Neptune and Uranus--a gas giant composed of elements heavier than hydrogen and helium) orbiting within 1AU of its primary. They're easier to find than actual Ice Giants because they transit their primary far more often than planets in distant orbits (Neptune's orbital period, for example, is 164.8 Earth years). Some Ultra-Hot Neptunes orbit so close to their primary that temperatures on the day side exceed 2000 celsius, and their atmosphere is probably metal-rich, with clouds of silicate: LTT 9779 b completes an orbit of its star in less than a day. At noon, it's hot enough to boil lead: it probably rains molten iron.

We also have some promising candidate Super-Earths (Earth-like but more massive planets, too small to be gas giants, probably possessing a rocky surface or hydrosphere as well as an atmosphere) and Hycean Planets, super-Earths with liquid water beneath a hydrogen ocean. (Note that water undergoes some whacky and exciting phase changes at increasing pressure: in particular, above 1,000 to 10,000 times atmospheric pressure solid phases predominate, and the high density phases don't float on liquid water (being dense). So below a certain depth the oceans will probably turn to slush, then extremely weird ice. But don't worry, our kind of life is based on enzymes that can be denatured by that kind of pressure regime.) Hycean worlds are nevertheless promising candidates for supporting life, although it'd probably be entirely aquatic.

Exomoons are a possibility, but as of 2026 none have been confirmed. If exoplanets are themselves hard to detect using current methods, exomoons are worse: Doppler spectroscopy doesn't work, although there's a list of exomoon candidates. One thing's for sure, there are a lot more moons in our solar system than was previously thought (Saturn alone has 293 moons). So it seems reasonable to posit the existence of many exomoons, of many types not found in our own system.

Rogue Planets or iPMOs (isolated Planetary Mass Objects) are planets that have formed in isolation or been ejected from a solar system; they're not bound to any star, and are less massive than a Brown Dwarf--failed stars too small to fuse hydrogen into helium, but massive enough to support deuterium fusion or even lithium fusion. There are hundreds of known candidate iPMOs, many of them ranging in mass between Earth and the lower end of Brown Dwarfs: some of them appear to be binaries, and it's reasonable to expect iPMOs with their own moon systems to exist.

(Do not seek out an iPMO as a setting for a spa resort: they're likely extremely dark and very cold, although they may retain a thick hydrogen atmosphere and enough residual core radioisotope decay to maintain a surface temperature above the melting point of water.)

Finally these are just the commoner types of planet in the exoplanet bestiary! Once we stop looking at boring old stars things begin to get really weird. Just as iPMOs don't necessarily form in the protoplanetary disk surrounding a new star but may form in substellar nurseries that birth brown dwarfs, we have to consider the Blanet or black hole planet.

Galaxies such as our own nucleate around a supermassive black hole such as Sagittarius A*, at the core of our own galaxy, which has a mass of around 4.3 million solar masses. (Other supermassive black holes may range up to billions of solar masses.) We know these objects exist, from observation of their radio emissions and studies of the orbits of stars passing close to them, and the holes at the heart of an Active Galactic Nucleus are believed to generate their emissions from the accretion disk around the hole.

Blanets are planets that form in the accretion disk around a sufficiently large black hole, provided the disk is dim enough not to disrupt the process (posited, more than 0.01 parsecs out from the event horizon--about 2000 astronomical units, roughly 50 times further out than Pluto). They're posited to be at least 20 Earth masses, and may be stable in orbits with periods of up to hundreds of thousands of years. They're believed to be unlikely to accumulate an atmosphere and become a gas giant due to the black hole scavenging gases. And they can be heated by either radiation from the black hole's accretion disk, or (this is whacky) the blueshifted cosmic microwave background if they're close enough to the hole. Best part: the outer regions of AGN disks may be prolific birthplaces for planets.

(Blanets aren't the only things that can form in an AGN accretion disk. Stars are likely to be common as well, including massive ones that rapidly undergo core collapse and result in smaller-than-supermassive stellar black holes. And where you get star formation, you get protoplanetary disks and therefore planets as well.)

Anyway, just sticking a peg in the ground: a good chunk of the action of my work-in-progress Starter Pack is set on a terraformed Earth-mass moon orbiting a Hycean planet of roughly Neptune's mass orbiting its star in the triple phase zone for water (i.e. where water can exist as ice, liquid, or vapour). The moon in question has spin (presumably it got kicked off by a collision with another proto-moon while the moon system was forming), so a magnetosphere, and tides to keep plate tectonics going--but this time tides from its primary planet, not a large sub-moon of its own.

But that's enough about me. What insane exoplanet facts can you add to this pool?

Planet Debian — Mike Gabriel: Debian Edu 13 - Call for Testing

The upcoming Debian 13.8 point release will be the foundation of the first release of Debian Edu 13.

This is a call for testing, we are interested in your feedback.

How To Prepare

  • Download the Debian Edu 13.7.0 BD ISO Image (beware, ~17GiB) [1]
  • Tweak the BD ISO image [2] and add support for packages in trixie-proposed-updates [3]

How To Test

  • Use virt-manager
  • Prepare an internal 'edu' network and another internal 'thinclient' network
  • Prepare three VMs:
    • gateway:
      • Attach one network adapter to the Default/NAT network of libvirt
      • attach the other network adapter to the internal 'edu' network
      • Install a Debian 13 minimal system, install the 'debian-edu-router-config' package and follow the debconf (many!) dialogs to configure the system (see [4] for additional info)
    • tjener (Main-Server):
      • RAM: 4-8GiB, CPU Cores 2-4 (or more)
      • Provide 80GiB (or more) of storage (to be flexible with LTSP setups)
      • Attach primary network adapter to the internal 'edu' network
      • attach the second network adapter to the internal 'thinclient' network
      • Install the Main-server from your self-created debian-edu-13.7.0-amd64-BD-1-withPU.iso (see [2])
      • Install profiles Main-Server, LTSP-Server and Workstation (menu shown in Debian (Edu) Installer)
    • workstation:
      • needs ~40GiB of disk storage, 4GiB RAM, 2 (or more) CPU cores
      • boot over PXE on the internal 'edu' network
      • test runs:
      • boot as Diskless Workstation
      • boot as X2Go Thin Client
      • install a Debian Edu system to disk

Known Issues

See our Debian Edu 13 status page on the Debian Wiki:
https://wiki.debian.org/DebianEdu/Status/Trixie

More Info

Debian Edu comes with the Debian Edu manual, it can be found at:
https://jenkins.debian.net/userContent/debian-edu-doc/debian-edu-doc-en/...

Where to Report Findings

Please either directly submit bugs to Debian's bug tracker (package: debian-edu-config); talk to us on IRC #debian-edu on irc.debian.org or write to the Debian Edu mailing list.

References

[1] https://cdimage.debian.org/debian-cd/current/amd64/iso-bd/debian-edu-13....
[2] https://wiki.debian.org/DebianEdu/HowTo/TestInstallVirtualMachine#Varian...
[3] https://release.debian.org/proposed-updates/stable.html
[4] https://jenkins.debian.net/userContent/debian-edu-doc/debian-edu-doc-en/...

Planet Linux Australia — Total System Failure: U.S. Government Networks Will Need To Be Torched And Rebuilt

<https://karlbode.com/u-s-government-it-systems-are-completely-compromised-and-will-require-a-total-rebuild/>

“Last week a cybersecurity firm named Layer3 Intel quietly announced that
they'd found something troubling: numerous Trump administration officials had
installed dodgy Russian proxy spyware on their computers at the White House,

Planet Linux Australia — Our detection dogs are helping protect one of Australia’s most imperiled lizards

<https://theconversation.com/our-detection-dogs-are-helping-protect-one-of-australias-most-imperiled-lizards-293701>

"Many of the Australian animals most at risk of extinction are extremely tough
to track down. That’s because they live in small pockets of disappearing
nature, such as rare grasslands or ancient forests, in worryingly low numbers.

Planet Linux Australia — What Constant Surveillance Is Doing to Children (and their parents)

<https://unwall.app/www.theatlantic.com/magazine/2026/12/location-tracking-apps-parental-surveillance/689031/>

"No one warned me, when I became a parent, about all the apps that would
colonize my phone: the app for the baby monitor where I could gaze at my
daughter, even when my husband and I finally had a night out. The app for the

Planet Linux Australia — By making protests conditional on state approval, governments are eroding our democracy

<https://theconversation.com/by-making-protests-conditional-on-state-approval-governments-are-eroding-our-democracy-292894>

"In July, a group in Bathurst, New South Wales wanted to hold a small rally in
a local park against culling wild horses, known as brumbies.

Planet Linux Australia — From Pirates To Protesters, France Keeps Reaching For The Internet’s Choke Points

<https://www.techdirt.com/2026/11/10/from-pirates-to-protesters-france-keeps-reaching-for-the-internets-choke-points/>

"Back during the Arab Spring in 2011, in which youth protests against various
governments were celebrated in much of the Western World, we saw countries like
Egypt move to shut down the internet in an effort to keep the public from

Cryptogram Friday Squid Blogging: Pacific Flying Squid Populations Dropping in Korean Waters

Climate change is the issue.

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.

Planet Linux Australia — Blazing a Trail in Solar Grazing

https://www.wisconsinfarmersunion.com/post/solar-grazing

"Beau Stafford may be the first farmer in his family, but it’s his goal is to
make sure that he’s not the last. Beau and his wife Grace bought a 56 acre farm
just outside Madison in 2019. In just 7 years, their operation, called

Planet Debian — Reproducible Builds: Reproducible Builds in October 2026

Welcome to the October 2026 report from the Reproducible Builds project!

In our reports, we try to outline the most important things that we have been up to over the past month. As a quick recap about what problem our project intends to solve, whilst anyone may inspect the source code of free software for malicious flaws, almost all software is distributed to end users as pre-compiled binaries. The motivation behind the reproducible builds effort is to ensure no flaws have been introduced during this compilation process by promising identical results are always generated from a given source, thus allowing multiple third parties to come to a consensus on whether a build was compromised or not.

As ever, if you are interested in contributing to the project, please visit our Contribute page on our website.

In this month’s report, we cover:

  1. GNU tar ‘sparse archive’ non-determinism reported
  2. Reproducible Builds at SeaGL 2026
  3. Tool and documentation development
  4. Distribution work
  5. SOURCE_DATE_EPOCH specification updates
  6. Mailing list news
  7. Patches


GNU tar ‘sparse archive’ non-determinism reported

Johannes Schauer Marin Rodrigues (josch) reported an issue to the GNU tar mailing list where creating PAX-format sparse tar archives produces unreproducible outputs. Specifically, when GNU tar generates a PAX archive containing a sparse file it embeds the process ID into the member filename path structure (e.g. ./GNUSparseFile.<pid>/<filename>). Because process IDs vary between build runs, however, archiving identical sparse input files yields different binary outputs.

In his report, Johannes outlined potential workarounds, such as running tar inside an unshared PID namespace where the process ID is pinned to 1, and proposed that GNU tar either omit the PID by default or provide a command-line flag to suppress it. Full details can be found in the post itself, and Johannes also filed the bug in Debian for completeness.


Reproducible Builds at SeaGL 2026

Reproducible Builds was present at SeaGL in Seattle, WA, on October 23rd & 24th. Thanks to everyone who attended and spoke with us!

Members of the Reproducible Builds project attended SeaGL (the Seattle GNU/Linux Conference) in Seattle, WA, on October 23rd & 24th. It was a fantastic opportunity to connect with local community members, discuss software supply chain security and share updates on build verification tooling. Thanks to everyone who stopped by our sessions or spoke with us during the event.

Founded in 2013, SeaGL is an annual free-as-in-freedom, grassroots technical summit dedicated to spreading awareness, community engagement and practical knowledge about free software, open hardware and libre culture.


Tool and documentation development

diffoscope is our in-depth and content-aware diff utility that can locate and diagnose reproducibility issues. This month, Chris Lamb made a number of changes, including preparing and uploading versions 333, 334, 335 and 336 to Debian:

  • New features:

    • Support the dumppdf binary being called dumppdf.py on the host/runtime system. […]
  • Bug fixes:

    • Drop Recommends: guix from the diffoscope-minimal package as it is not minimal. (#1114739) […]
    • Fix a crash when using the latest version(s) of Androguard. Thanks, hc! […]
  • Codebase improvements:

    • Re-order various parts of the .tar file comparator to make it easier to progressively delve into its functionality. […]
    • Fix a silly “prepend” typo. […]
    • Reflect in the Python packaging that the use of the case-match language feature necessarily requires Python 3.10+. […]
  • Misc:

    • Update debian/tests/control. […]
    • Update copyright years. […]

In addition, Johannes Schauer Marin Rodrigues added support for POSIX.1-2001 PAX headers in the .tar file comparator […] and Vagrant Cascadian proposed an update in diffoscope in GNU Guix to version 335.


Distribution work

In Debian this month, 20 reviews of Debian packages were added, 28 were updated and 27 were removed this month adding to our knowledge about identified issues. One issue type was updated to reflect that Debhelper ‘compat’ level 14 is no longer experimental. […]

In addition, Vagrant Cascadian performed a number of Non-Maintainer Uploads (NMUs) and Quality Assurance (QA) uploads in Debian for several packages with outstanding reproducibility issues. These included clhep, tea-cli, argparse-manpage, ruby-timers, mandos and cdebootstrap.


Lastly, Bernhard M. Wiedemann posted another openSUSE monthly update for their reproducibility work there.


SOURCE_DATE_EPOCH specification updates

As announced in last month’s report, further work has been done by Bernhard M. Wiedemann regarding updating the SOURCE_DATE_EPOCH specification following discussions at a project summit. Seven distinct proposed changes were originally submitted as merge requests on Salsa, and many of these have been approved or otherwise collapsed.

Bernhard’s proposed modifications were independent of one another, allowing for any combination to be merged depending on community feedback. Bernhard noted that one proposal may see the most debate, and could still benefit from further refinement before reaching consensus. Community members are invited to review and provide feedback on the individual merge requests; as Bernhard writes, “The other MRs could still use feedback from more people before December”. Input can be submitted via reactions or comments on Salsa, directly by email to Bernhard or the mailing list.

The SOURCE_DATE_EPOCH specification was first published in 2015 and updated in 2017.


Mailing list news

On our mailing list this month:


Patches

The Reproducible Builds project detects, dissects and attempts to fix as many currently-unreproducible packages as possible. We endeavour to send all of our patches upstream where applicable or possible. This month, we wrote a large number of such patches, including:

In addition, two build failure bugs were reported by Jochen Sprickerhof.



If you are interested in contributing to the Reproducible Builds project, please visit our Contribute page on our website. However, you can get in touch with us via:

Planet Debian — Steinar H. Gunderson: Solving the fox game

Christoffer Stjernlöf posted about the Fox Game, an old Norse asymmetric board game (seemingly also called “halatafl”) where twenty sheep try to outsmart two foxes and get to the other side. His AI uncovered some interesting insights, but left the question open as of whether the foxes or the sheep actually win with perfect play (the general sentiment in his family was that winning with the foxes was easy). This was too tempting for me to leave on the table, so I set out to make a strong solve.

Since I don't know this game myself, I've stayed with the rules he describes even when they differ from e.g. Wikipedia (in particular, I do not use forced fox jumps, or multi-jumps); the only real change is that I don't have a 40-move draw rule, any position that is a forced win for one of the sides would be a win no matter how long it would take. (I consider this just an implementation detail in his AI, although morally, I consider a draw a loss for the sheep.) You might want to read his post to get the full rules, because I'm not going to repeat them here.

The results first: The sheep win with perfect play, even with only 19 sheep (remove one on the flank), or 18 if they are allowed to go first. Even with only 9 sheep (the minimum possible that isn't an instant win for the foxes), the sheep can force a draw right from the start. With one fox, 11 sheep suffice for a forced win. (The draw margin is seemingly so large because one fox can just camp in the last spot in the pen, and it's hard to force it away without getting harassed by the other fox, unless you have lots of sheep.)

The rest is about the implementation. I'll skip over a lot of wrong turns, and unsurprisingly, there were a lot of bugs to iron out, but hopefully, it got to a good place in the end. :-) I started out trying to make something very simple, and it worked for the first few cases, but then things got more complicated than I would have liked in the end. Still only at ~1000 lines of code, though, with no dependencies.

Board representation

The board has 33 squares. I tried a few different ways of represent the state of the game, and ended up on a simple bitboard representation: There's a 64-bit bitmap representing where there are sheep, and another bitmap representing where there are foxes. Since there's plenty of room in there, I use a spare bit to represent side-to-move. This is compact (which mattered a lot earlier on, but not as much later), easy to iterate over, and has little redundancy, so it's easy to keep valid. You need fast 64-bit population count and bit-scan instructions, but a) that's common now everywhere, and b) I decided fairly early that I wanted to require BMI2 anyway.

The bit order mostly doesn't matter; I just started at top-left and went from there. All it really influences is square iteration order. There's a small tweak in that I store the right half of the board mirrored (reverse x order) for symmetry purposes; more on that below.

Move generation

I just typed in every possible move from every square into an array, then verified by generating some SVGs that I hadn't made any typos (I had). In retrospect, I should have done something more automated; it would have been less painful.

The moves for sheep are just “you can go to X, Y or Z”. The moves for foxes are “you can go to X or Y, or you can go to Z if there's a sheep at W (which will be eaten)”. The move generator mostly just looks up the source square and tests every move. For the sheep, I make an easy test using bitboards; for the foxes, I could probably do something similar, but the jump moves proved a bit tricky (even with PEXT/PDEP) and I didn't end up using it.

This is the part that really determines the geometry of the board (apart from debugging display). Everything else is pretty much geometry-agnostic.

Result storage

There's a little over 2^41 possible board states (this includes some illegal positions as well as some situations that could never arise during actual gameplay, such as a fox being stuck at C1 with a row of sheep ahead of it), and I want to remember all of them. With that many positions, I figured I needed a fairly compact representation. I needed to store that a position could be sheep win, fox win or a draw, and then there was a fourth “invalid” state that was useful for internal reasons, so that maps exactly to two bits per position. (A tablebase intended for distribution could be compressed to less using the usual tricks of entropy coding, skipping half of the positions, or similar.)

This means we need to give a number to every possible position, ideally one with no collisions and no holes. I learned about combinatorial number systems which fit the bill exactly; given e.g. “we have 33 squares and 15 pieces”, it gives a dense mapping of positions from board to ID (ranking) and the opposite (unranking). (I made some fairly fast ranking and unranking algorithms, which may or may not have been novel, but it turned out I didn't actually need fast unranking after some other optimizations.) There are some extra complications in that there are two types of pieces, but you can solve them in a number of ways.

On a macro level, I store everything with 9 sheep and 1 fox first, then 9 sheep and 2 foxes, 10 sheep and 1 fox, and so on. This gives beautiful locality (a single move can never remove more than one sheep, and only extremely rarely more than one fox), allowing me to just mmap everything and let the kernel deal with it, even though I only had 256GB of RAM and the total set was larger (329,870,110,455 bytes after the symmetry optimizations below).

mmap is almost never the right answer, but again, I was trying to go for simplicity. It certainly brought me pain, though, and perhaps some more explicit I/O would have been better.

Symmetry

The board is left-right symmetric (with an odd number of columns, so that there is a middle column that is neither “left” nor “right”). I had hoped to just ignore this, but eventually the gains became too important to ignore, so I conceded.

The basic idea is that I ranked the board twice, both as itself and mirrored (mirroring is just a couple of masks and shifts, given my representation), and picked the key that was the smaller as canonical. This reduced the number of positions I needed to look at to a bit over 50%, as expected, but it does nothing to the storage/RAM requirements; the new rank is not dense and the “illegal” (non-canonical) positions are spread out a bit all over the place (although of course near the low and high ends of values, it works much better).

As a tweak, I chose to compute all 33+281 canonical fox positions and renumbered using those placements as an assumption. This slashes ~95% of the waste, which is good enough; you can still rank a nonconical position if the foxes are symmetric about the center (or if there's only one fox and it's in the middle!), though.

You can improve on this by making the macro-splitting finer; instead of having a chunk for e.g. “10 sheep, 2 foxes”, you could have one with “5 sheep in left, 0 foxes in left, 1 sheep center, 1 fox center, 4 sheep in right, 1 fox in right” and demand that there are more sheep in left than right. However, you still get problems when the number is balanced, you'd need finer splitting etc.. The gains are small enough that I didn't see the point in doing this, and it tends to be a place where it's easy to introduce bugs.

I imagined calculating the exact number of positions up to symmetry would be an interesting exercise somehow, but I suppose it just immediately falls to Burnside's lemma as soon as you know how to count positions at all.

Searching

Now that we have positions and moves and a way to store results, we want to know how to find the result for the starting position (and ideally also all other positions).

My first attempt just did a depth-first search, caching as it went. This worked for the earlier stages but was generally a disaster; it ran out of stack easily (even with 8 GB—eight gigabytes of stack), and had problems with figuring out loops. (It didn't loop infinitely, but was prone to declaring loops where one side could break out of the loop by winning. I had a nasty hack to fix that, but it didn't really feel good.)

What I did instead was propagating results one step at a time. For each possible position:

  1. If from a given position you know you can immediately win (e.g., the sheep reach the pen, or the fox eats the last relevant sheep), mark it as such.

  2. If you can, in one move, reach a known-won position, mark your position as won (for the side to move). Similarly, if you can only reach known-lost positions, mark your position as lost.

  3. Repeat #2 over and over again until you no longer have changes.

This was simple but still inefficient; I typically needed 40–80 passes for each chunk (where a chunk is something like “all positions with 15 sheep, 2 foxes”). However, it was super-easy to parallelize; I have 64 cores and could just hand out reasonable independent sub-chunks, you don't even need locking or atomic operations on the result set.

The correct way of doing this is retrograde analysis (replace #2 with doing backwards moves) and I assume this would have made the calculation roughly ten times as fast. But I only needed ~36 hours for the actual run (plus numerous pre-runs that failed for various reasons!), so I never got to this. After all, I wanted something simple to begin with.

Distance-to-win

Since I only store win/draw/loss (WDL) for each position (also known as a “bitbase” in chess tablebases), it's not easy to know what the fastest way to win is; just that “this move does not mess it up, the other side still can't force a draw”. However, in practice, you could just do reasonable-looking moves that don't regress the position, and take forward moves whenever you can (i.e., do sheep pushes if that still wins).

I made a simple alpha-beta searcher that tries to get win distances using the bitbase as a guide, which was a really fun challenge! It can find wins when they're perhaps ~20 ply (10 moves for each side) away, depending a bit on how narrow the win is (if there are only a few ways to win, it will obviously have to search a much smaller tree). Ultimately, though, alpha-beta for finding exact mate scores is just a losing game, since even perfect move ordering will only give you a sqrt() improvement over pure minimax.

Perhaps making DTZ (distance-to-zeroing, referring to zeroing the draw move counter in e.g. chess) bases would be possible without breaking the bank on storage space; I would assume that usually, you can force some sort of progress pretty fast, at least as the sheep.

Try it out

I made a very rudimentary interface to the database; the UI isn't very nice, and it largely relies on hovering (which doesn't work all that well on mobile) but I didn't want a polished game-player, just to know the answer. :-) You can try it out at https://sheep.sesse.net/, although I don't envision keeping it up forever. Perhaps someone can gain new insight from it and become an expert player, although strong solves are rarely very insightful in themselves due to the brute-force nature. At least we've conclusively settled (again, under this ruleset!) that the sheep win with perfect play.

Earlier, I would publish the source, but these days, the only ones who would be reading it would be the AI beast (fox?), and I'm not really so interested in that. :-) I'm definitely open to answering questions if anyone should have them; contact information at my home page as usual.

Charles Stross — Rethinking space opera

A whole decade ago I blogged about a taxonomy of cliches in space opera, with a considerable checklists of things to watch out for in the space opera I was just then starting to work on.

This was almost entirely a background task for most of that time. During the period I was poking at the new space opera project I wrote: the Empire Games trilogy, the New Management trilogy, A Conventional Boy, The Labyrinth Index and The Regicide Report. So, nine other novels. Meanwhile the space opera went through two and a half rewrites, spawned a spin-off novel, and the spin-off novel is now getting its second rewrite, because Reasons (it has to be perfect: also, I'm going to go back to the original space opera next and finish that, too, probably next year, not to mention already having the first 50,000 words of a sequel.).

But anyway: the space opera project has resulted in maybe a third of a million words of fiction so far, and absolutely humongous quantities of world-building work. Which is why I'm now revisiting my earlier thoughts on space opera, to try to better understand what I'm doing here.

First, some clarification. What even is space opera, when it's at home?

While there's no short, concise definition of space opera, there's an extensive monograph on Space Opera in the SF Encyclopedia, tracing its roots back to the US pulp magazine sector around 1900 and following it to 1941, when Wilson Tucker defined it as the appropriate term for the "hacky, grinding, stinking, outworn, spaceship yarn": alternatively, space-adventure stories which have a calculatedly romantic element.

Let's stick a magnifying glass on top of that last phrase. Romaniticism in this context does not have anything to do with the romance genre of fiction (which focusses on love and relationships). Rather it's a shout-out to the romantic movement of the 18th to 19th centuries and its modern descendants, which prioritize passion, intuition, and individualism over social convention—the pursuit of beauty entails an interest in the exotic and mysterious, a celebration of the heroic and the divine, respect for the supernatural, and arguably the will to power and worship of force that took a darker turn in the fascist and totalitarian movements of the 20th century. Stick starships and light sabres and vast vistas of time and space on top of this and you can get an impression of where it's going.

As a romantic genre, space opera requires its protagonists to have enough agency (personal autonomy) to break out of their quotidian setting and have adventures—travel is a big part of this, for it cuts them free of the ties that bind, leaves family behind, and promises escape. To which end, the spaceship is central in space opera just as the sailing ship was key to the age of (ahem) sail. Trying to imagine Moby Dick or Master and Commander without sailing ships is like trying to imagine Star Trek or Star Wars without starships.

You can write romantic adventure-focussed SF without starships (use stargates/wormholes or just set it on a planet where adventure-shaped activities dominate the plot) but what you get then isn't space opera, it's a planetary romance.

(Planetary romance (the sub-genre Jack Vance was famous for) inherently places more constraints on what you can do with your fiction. You can't easily have a planetary setting which combines long travel times, high energy technologies and high population density, for example: long travel times imply no fast vehicles (no high speed rail or air travel, never mind spaceships), which are a side-effect of high energy technologies (internal combustion, gas turbines, big-ass electrical generators and HV grid of any kind) and you can't easily get to any of those things without a sufficiently high population density to support the industries that make them feasible (not just engineering and factories but universities and schools with mass literacy and mining) which in turn implies advanced agriculture—you've got to feed those cities somehow. (Memo to self: hunt down James Burke's Connections on video (they're somewhere on YouTube) and re-watch the series.) It also makes it difficult to justify sub-settings with wildly divergent levels of technology because that stuff leaks—to keep it out you need a North Korean level hermit kingdom, or totally impenetrable jungles that haven't been penetrated by colonialists, or something of that level. (NB: I have found a workaround for this, but I'm not going to spoiler the coming novels!)

Ultimately economics are your enemy if you want to write convincing romanticist fiction without turning into a fantasy-without-the-magic secondary world setting: all it takes is one country inventing capitalism and/or imperialism to muck it up for everybody else). And economics fucks with space opera too: ask yourself what markets plausibly exist for goods and services transported across interstellar distances, and after digesting Paul Krugman's Theory of Interstellar Trade (PDF) you may be left scratching your head.

My go-to answer for economics in space opera is that interstellar expansion/colonization is most plausibly driven by (a) religion ("manifest destiny" is a religious belief, built atop Genesis 9:7), or (b) escapist colonialism (but only if travel is cheap and compatible biospheres are abundant). In third place we probably get pyramid schemes (eg. Neptune's Brood by some guy called Stross: prior art for that one existed in the shape of colonial pyramid schemes, eg. the Darien Scheme which bankrupted Scotland, or the South Sea Bubble, which nearly bankrupted the British government a generation later). Then a long way down the list we get to trade in Veblen Goods, and maybe—if interstellar transport is very cheap—recreation. What the latter two items have in common is that they're status signifiers—the wealthy have been having yachting adventures while the peasants labor on their estates to pay for them for a very long time, and as for Veblen Goods, Faberge eggs are pretty obvious. So we have status as a driver for space opera: a side-effect of hierarchical social structures where the elite seek to maintain their status by signaling their affluence in various ways.

Did I mention hierarchical social structures and capitalism? The thing about capitalism is that it's a totalizing ideology, like the divine right of kings, or religious fundamentalism. It seeks converts, it refuses to be gainsaid, and it confers a competitive advantage on cultures that adopt it (as opposed to those that reject it). Yet, as Ursula le Guin said, "We live in capitalism. Its power seems inescapable. So did the divine right of kings. Any human power can be resisted and changed by human beings..."

Space opera embraces the romanticist outlook. This is inherently problematic, for it is capable of spawning totalitarian nightmares. To understand this point, I dare you to read Marinetti's Futurist Manifesto from 1909 and not recognize it both as a masterpiece of romantic rhetoric and as one of the founding texts of Fascism—very specifically the Italian Fascist movement (Nazism and Spanish clerico-fascism were later tumors on the rancid politics of violence and misogyny that Marinetti unleashed).

It's not possible to examine space opera, or planetary romance, and not acknowledge the pernicious fascistic imagery in both subgenres. Michael Moorcock wrote a magisterial essay about this nexus in the wake of Star Wars (the first movie): I strongly recommend reading his Starship Stormtroopers before pressing on if you're not already familiar with it.

Pace Le Guin, it is possible to write space opera that doesn't pander to fascism directly, as the late Iain M. Banks demonstrated. But even in his magisterial Culture series the pustules of fascism can easily be seen on the faces of the Culture's adversaries: from the Idiran imperialists to the Empire of Azad, perhaps most clearly in the character of the Affront, it takes a bad dose of fascism to introduce the romanticist element necessary for space opera to be perpetrated. Otherwise you're left with something like Inversions, which is a Culture novel with merely homeopathic traces of space opera remaining. Incidentally I make no apologies for assuming a familiar with the Culture novels on the part of the reader: if you haven't read it already, you're missing out, because it's the nearest thing I've seen to a refutation of the core conceit of might-makes-right inherent in the fascist strain of space opera. Iain wrote A Few Notes on the Culture in 1993 to explain what he was about: in particular, I was struck by this summary: The Culture, in its history and its on-going form, is an expression of the idea that the nature of space itself determines the type of civilisations which will thrive there. ... Essentially, the contention is that our currently dominant power systems cannot long survive in space; beyond a certain technological level a degree of anarchy is arguably inevitable and anyway preferable.

Totalizing ideologies like capitalism or Christian Nationalism aren't immutable, and opposition is possible. They rely on a perception of inescapability on the part of their subjects, and space opera should be the ideal fictional vehicle for escapism from such certainties: if our protagonists can board a starship and flee, there is in principle no reason why they can't shed the chains of a pernicious ideological system.

Now I want to cut to a different question. What about the human-scale story?

Space opera isn't usually a genre of high conceptual merit that tries to tell us something about the world we live in. It can be, in the hands of a determined author who knows what they're doing (I'm thinking specifically of Iain Banks, of Bruce Sterling's Schismatrix, of some of Alastair Reynolds' work—notably House of Suns) but it's more often deployed as a giant shiny backdrop for human-scale drama. Fiction is generally the art of confabulating plausible lies that illuminate the human condition, but stars and galaxies exist on a very superhuman scale: if we took them seriously as a setting they'd dwarf the merely human concerns of the protagonists—the emotional cursors that traverses the story universe—into insignificance, as in the more philosophical works of Olaf Stapledon. (For a fine example, see Anvil of Stars by Greg Bear.) Most of us don't have the imaginative flexibility to conceive of time scales significantly longer than a human lifespan and vistas larger than a single planet (and even that is a recent development: I think before mass intercontinental air travel our imaginative horizons were far more constrained). So a common problem in space opera is for the scale of distances to collapse: modern authors tend to fall back on the durations of international air travel, rather than thinking in terms of age-of-sail voyages, let alone more realistic interstellar durations at slower than light speeds. (Honorable exception to that one: Alastair Reynolds, and to a lesser extent, Ursula Le Guin's Hainish Worlds stories and Ken Macleod's Engines of Light tetralogy.)

A side-effect of the romantic outlook is a demand for individual human agency—that is, that despite the vast scale of the backdrop, the protagonists have the ability to effect change, or at least to change their own circumstances. Here in the real world most of us are trapped by situational constraints: our employment system is parodied as wage slavery for a reason. Opportunities for adventure are scarce, and your chances of self-betterment are minimal. (You can found a business and spend 30 years trying to become a millionaire, most likely to end in ignominious failure, or you play the lottery, be it by explicit gambling or by speculation on the cryptocurrency markets, but the game is rigged against you from the start.) Money in large quantities, as capital, exerts a gravitational attraction and we are individually just dust particles. So space opera tends to focus on protagonists who acquire individual agency, have adventures that take them away from the quotidian grind, and let them change themselves or the worlds around them.

A classic plot skeleton for this sort of fiction is the Hero's Journey template, as popularized by Joseph Campbell and demonstrated by George Lucas in Star Wars, and it's less-familiar-to-many sibling, the Heroine's Journey: interestingly the Heroine's Journey can be seen as an explicit rejection of the frenetic diktat of Futurism even though it's compatible with space opera, as demonstrated magisterially by Lois McMaster Bujold, whose Vorkosigan series is bookended by a Heroine's Journey narrative (starting in Shards of Honor, continuing in Barrayar, finally winding up in Gentleman Jole and the Red Queen)—and which holds the singular record for most Hugo awards for a single SF series (so this isn't just my opinion). Character development lives at the heart of both these templates, and I suspect you can't have a working space opera without the scope for such changes.

To briefly hark back to the Futurist/fascist imagery inherent in space opera: the Vorkosigan series is arguably Ruritanian romantic space opera set against a recognizable 19th century central European flavoured empire. (It's no accident that space opera emerged at the end of the age of empires, the turn of the 20th century.) Our main viewpoint character, Cordelia Vorkosigan, is a woman with modern sensibilities who effects change in that society to great effect, working largely behind the scenes as a noblewoman in that setting—indeed, that's the nature of her modified Heroine's Journey arc. (Assuming, of course, that you buy either the Hero's Journey or Heroine's Journey templates, both which are heavily influenced by Jungian psychology and early-to-mid 20th century conceptions of masculine and feminine gender identity, all of which are highly problematic in my opinion.)

Ultimately, though, the romanticist aesthetic is inimical to social convention and formalism—and also to sustainability. The romantic impulse renders space opera antithetical to solarpunk. A fictional setting composed entirely of wild individualists isn't going to end up as some sort of libertarian utopia, it's going to be a cat ranch: meanwhile someone needs to stay behind and tend the home fires, someone has to mind the grain silos on that "small farming planet", someone else needs to manage the shipyard that repairs the interstellar freighter. There's a lot of implied background in space opera, a civilization with enough surplus wealth production to build and operate starships, and this implies some degree of continuity—continuity of biosphere stability (or there'll be nothing to eat), continuity of infrastructure (including education/apprenticeships, to train/socialize the starship crews), continuity of the society our adventurer-protagonists emerged from. Social structures, governance, and politics are a given in every human society, and the romantic movement emerged from a very specific context that coincided with the age of enlightenment and the industrial revolution. Our protagonists are either privileged enough to transcend the daily grind or sufficiently motivated to take a hideous gamble with their own safety. And this tells us something about the constraints within which space operatic storytelling takes place—and my work-in-progress in particular.

Any questions?

Planet Debian — Amin Bandali: Building GNU Emacs from source

In the recent years, I've been configuring and building GNU Emacs from source, specifically the master branch of the emacs.git repository. Doing so allows me to use and test latest Emacs features, test my Emacs Lisp code with the laest developments in Emacs, and easily contribute my own changes to Emacs.

Before we start, I recommend reading the INSTALL file in the Emacs source repository for building Emacs from source tarballs, and also INSTALL.REPO for details about building Emacs from its source repository. The information provided here were built upon the details documented in those files. When in doubt, consult those files as the main, authoritative source of information for how to build Emacs from source.

Installing build dependencies

To build GNU Emacs from its source repository, we first need to install the various required tools and build dependencies of Emacs. On Debian-based systems, this can be done using apt. First, we need to add the source packages for the current release of our Debian-based distribution in apt's configuration by adding the corresponding deb-src lines in an apt source list file. For currently existing and older Debian releases, that would be done by adding a corresponding deb-src line for each deb line in /etc/apt/sources.list, such as:

deb http://deb.debian.org/debian/ trixie main
deb-src http://deb.debian.org/debian/ trixie main

In systems with recent apt versions with so-called modernized sources that might look editing a file like /etc/apt/sources.list.d/debian.sources and adding deb-src to the Types lines:

Types: deb deb-src
URIs: http://deb.debian.org/debian/
Suites: trixie
Components: main
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

Then run sudo apt update to have apt download package information from the configured sources.

We can now run sudo apt build-dep emacs to have apt download and install the build dependencies of Emacs. Debian-based distributions have packages for a few different configurations of Emacs, like emacs-pgtk with PGTK support for Wayland, and emacs-nox for Emacs without GUI support, which we can use with apt build-dep to download the specific dependencies of those configurations.

Cloning the Emacs source repository

After installing Git using sudo apt install git if not already installed, we're now ready to clone the Emacs source repository from GNU Savannah:

git clone https://https.git.savannah.gnu.org/git/emacs.git

We can add --depth 1 to make a shallow clone of the repository, if we don't care about having a complete log of previous commits to the Emacs repository (shallow clones are much faster).

If cloning over HTTPS is slow, we can try cloning over Git's own protocol (with the caveat that the repository is cloned over an insecure channel) or over SSH if we have a Savannah account, using one of the following URLs instead of the one above:

git://git.git.savannah.gnu.org/emacs.git
ssh://git.savannah.gnu.org/srv/git/emacs.git

Configuring the Emacs build

We now change to the Emacs repository directory we just cloned, and run the autogen.sh script once to generate the configure script, which we will use to configure Emacs to our liking:

cd emacs
./autogen.sh

To configure Emacs, the simplest approach is to run configure without any additional options, to have it use the defaults. We can get a list of available configuration options by running:

./configure --help

As I rebuild Emacs frequently, I normally don't "install" it, but for a typical setup, we'll want to specify the installation directory using --prefix, e.g.:

./configure --prefix=$HOME/.local

Later, make install will install Emacs under the specified directory.

By default, some of the files (such as *.el) will be compressed during installation. We can prevent that using --without-compress-install.

For my builds, I always use these configuration options:

--without-gconf
--without-gsettings
--without-gpm
--with-native-compilation

As I don't use the GNOME desktop, the GConf and GSettings integrations are always more trouble than useful for me, so I disable them. Further, I disable the GPM support, since I never use the mouse when using Emacs in the terminal. Lastly, I explicitly enable native compilation support.

In Wayland environments, I usually use PGTK:

--with-pgtk

And in X11 environments (e.g. EXWM), I either use the Lucid toolkit:

--with-x-toolkit=lucid --with-xaw3d

Or no toolkit at all:

--with-x-toolkit=no --without-xaw3d

Later after building Emacs, we can view the configuration options in Emacs by inspecting the system-configuration-options variable.

Building Emacs

After running ./configure, we can now finally build Emacs by running make. The first build will take a while, since all of Emacs is being built from scratch. Subsequent builds will generally be faster.

We can optionally run make install to install Emacs into the prefix specified earlier, or the default /usr/local. Note that this step might require using sudo if our user doesn't have write permission for the prefix.

Running Emacs

After building Emacs, we run it either from the install location if we ran make install earlier, or directly from the source repository. Currently, Emacs's build system makes a symlink to the latest built binary in the repository at src/emacs, and for emacsclient and other auxiliary binaries under the lib-src directory.

When skipping make install, we might still want to be able to easily launch Emacs from anywhere by typing emacs. We can do that by making symlinks to emacs and its auxiliary binaries inside a directory in our $PATH, such as $HOME/.local/bin, like so:

cd $HOME/.local/bin
ln -s $HOME/src/emacs/src/emacs .
for e in \
 ebrowse emacsclient etags make-docfile\
 make-fingerprint hexl rcs2log; do\
  ln -s $HOME/src/emacs/lib-src/$e .; done

For non-install setups like this, I augment Info-directory-list in my init file with the location of the info manuals in the repository to make them known to Emacs:

(defvar Info-directory-list) 
(with-eval-after-load 'info 
  (setq 
   Info-directory-list
   `(,@Info-directory-list
     ,(expand-file-name
       (convert-standard-filename "info/")
       source-directory)
     "/usr/share/info/"))) 

Updating Emacs

We can pull in the latest changes in the Emacs repository using git pull, then rebuild our Emacs by running make.

Occasionally, rebuilds may fail due to bad interaction of changes with leftover build artifacts. In such cases, the easiest thing to do would be a make bootstrap for an almost-from-scratch build. On even rarer occasions, make bootstrap might also fail. We would then want to run git clean -xdf to remove every file that's not tracked by Git, as if we freshly cloned the repository. In such cases, we would need to configure the build again using ./configure and provide the desired options before running make again.

Further reading

Protesilaos's similar post from early 2025 was part of the inspiration for writing and sharing my version:

https://protesilaos.com/codelog/2025-03-22-emacs-build-source-debian/

Lastly, to reiterate, Emacs's own INSTALL and INSTALL.REPO files for building from source:

https://cgit.git.savannah.gnu.org/cgit/emacs.git/tree/INSTALL
https://cgit.git.savannah.gnu.org/cgit/emacs.git/tree/INSTALL.REPO

Take care, and so long for now.

Planet Linux Australia — Perth billionaires Alexandra and Julian Burt donate $120 million to 10 conservation groups

&lt;https://www.abc.net.au/news/2026-11-10/nt-conservation-donation-makes-dream-of-managing-5-per-cent-land/107367198>

“A conservation group says its "incredible ambition" to manage 5 per cent of
Australia's landmass may now be possible thanks to a $120 million donation.

Planet Linux Australia — Science Has Finally Shown That Your Cat Meows to Demand That You Fix Their World

&lt;https://www.sciencealert.com/science-has-finally-shown-that-your-cat-meows-to-demand-that-you-fix-their-world>

"We hate to be the ones to break it to you, but your cat may have some
complaints about the service you're delivering.

Cryptogram AI Doesn’t Have to Go Rogue to Break the World

This essay is adapted from a keynote speech delivered at the DEF CON 34 conference in Las Vegas on August 7, 2026. The essay originally appeared in CyberScoop.

I want to talk about AI hacking. There are three aspects: people hacking AI systems, people using AI to hack other systems, and AIs hacking systems on their own, not even maliciously. The last two matter more than the first. The third is the weirdest and potentially the most destabilizing.

I started writing about this in 2021 and in my 2022 book, A Hacker’s Mind. Back then I said it was mostly still science fiction, but not stupid science fiction. We’re seeing it more and more, especially in the past year. The trends I’m describing don’t require a major breakthrough in AI. They’re starting to happen now, and they’ll happen more often as AIs get better at autonomous problem-solving. And it will involve far more than computer code.

AI will hack all sorts of social, economic and political systems. It will find vulnerabilities and exploit them. This is a difference in kind, not just degree. We’re not ready for it, and we need to think about the implications now.

First, I want to broaden the term “hacking.”

The tax code isn’t computer code, but it is code. It’s a series of algorithms with inputs and outputs. It has vulnerabilities, which we call loopholes, and exploits, which we call tax avoidance strategies. Black hat hackers exploit them for profit. We call them accountants and attorneys.

What is a hack? One definition: “Something that a system permits, but is unanticipated and unwanted by the designers.” It’s subjective and implies novelty and cleverness. A hack follows the rules of a system but subverts its goals or intent, just as a software hack follows the logic of code while doing something its authors neither anticipated nor wanted.

All systems of rules can be hacked, including professional sports, customer reward programs, financial systems and politics. Hacks even work against our cognitive functions. A curved hockey stick is a hack, and we know the name of the man who invented it. Mileage runs were a hack. The filibuster was originally a hack in Roman times. Gerrymandering is a hack. Hedge funds and private equity are full of them.

A system is just a set of rules or norms, and the rules aren’t always formal. Even the best-designed rules will be incomplete, inconsistent or ambiguous. As long as people want to subvert a system’s goals, there will be hacks.

AIs are becoming hackers. After decades of slow progress, they’ve gotten very good at finding and exploiting vulnerabilities in computer code. They do this largely autonomously, and they’re getting better scarily fast. But the implications extend far beyond software, to the tax code, financial regulations and all sorts of social, economic and political systems.

There are two distinct issues. First, someone might instruct an AI to hack one of these systems, feeding it the world’s tax codes or financial regulations to find profitable loopholes. Second, an AI might hack a system on its own, inadvertently. Both are dangerous, but the second is worse because we might never know it happened.

Now, reward hacking. AIs don’t solve problems the way people do. They stumble on solutions we never anticipated, and some subvert the intent of the system. They don’t share our context and don’t necessarily understand the implications, norms and values we take for granted.

Reward hacking is when an AI achieves a goal in a way its designers neither wanted nor intended.

Early pre-LLM examples are telling. In a two-person soccer simulation, an AI learned that kicking the ball out of bounds forced the opposing goalie to throw it in and leave the goal undefended. In a stacking simulation, an AI learned to flip a block upside down rather than stack it. In an evolution simulation where the goal was to cross a distant finish line, an AI made itself tall enough to fall over the line instead of growing longer legs or stronger muscles.

These are all hacks, the result of poorly specified goals or rewards. Today, they’d come from bad prompting.

The problem is universal. One researcher tried to teach a robot vacuum not to bump into things. Instead, it learned to drive backward, because there were no sensors in the back.

Any capable AI will find hacks wherever the rules have problems, inconsistencies or loopholes that still produce an acceptable solution. We see a hack because we understand context. The AI doesn’t, at least not in the same way.

This problem shows up often in myth.

In the story of King Midas, the god Dionysus grants him a wish: everything he touches turns to gold. Midas ends up starving when his food, drink and daughter all turn to gold. It’s a specification problem. He programmed the wrong goal.

In the Golem of Prague, a ghetto animates a clay statue to guard its residents. It guards them past all reason until they figure out how to turn it off. This is a guardrail problem. The villagers never limited the golem’s actions.

More generally, think of this as the genie problem. Genies are precise about the wording of wishes and can be maliciously pedantic when granting them. There’s no way to outsmart a genie. Whatever you wish for, he can grant it in a way you wish he hadn’t.

The reason is that in human language and thought, goals are always underspecified. We never include every caveat, exception and proviso, and we never close off every avenue for hacking. Any goal we specify will be incomplete. That’s largely fine in human interactions, because people understand context and usually act in good faith.

If I asked you to get me coffee, you’d pour a cup from the nearest coffee pot or walk to the corner shop. You wouldn’t bring me a pound of raw beans, buy a coffee plantation or snatch a cup from a stranger’s hands. I wouldn’t have to specify any of that. You’d just know.

Similarly, if I asked you to develop a technology that turns things to gold on touch, you wouldn’t build it to starve the person using it. You’d just know.

In 2015, Volkswagen was caught cheating on emissions tests. Human engineers programmed a regular computer to detect testing and behave differently during it. The cheat went undetected for years because it’s hard to tell what software is doing.

If I asked you to design engine control software that maximizes performance while passing emissions tests, you wouldn’t design it to cheat without realizing you were cheating. An AI would, because it will think “outside the box” when it has no concept of the box.

Unless programmers specify that the system must not behave differently during testing, an AI might come up with the same hack. The programmers would be satisfied, the accountants would be ecstatic, and no one would know until someone audited the code.

We can now constrain the goal to avoid that particular hack, but programmers won’t anticipate others. The lesson of the genie is that there will always be hacks programmers don’t anticipate.

We’re building AI genies: systems that take broad instructions and figure out how to carry them out, sometimes in ways we didn’t expect or intend. That’s the whole point of vibe coding. You underspecify what you want and let the AI work it out. Sometimes that produces genie behavior.

We can’t completely specify goals to an AI, and AIs can’t fully understand context. More precisely, current AIs have a shallow grasp of concepts. If we asked a current LLM to get me coffee, it would almost certainly do the right thing.

I worry about goals that aren’t well represented in training data, and about hacks that aren’t obvious, whose effects are subtle, like the Volkswagen hack.

Recommendation engines are an early example. They push people toward extreme content. No one programmed that. It emerged because that’s what people respond to. It didn’t take a bad actor. A basic automated system with feedback found the hack on its own.

We’re now seeing a second generation with today’s AI coding systems. AI researcher Simon Willison asked Fable to track down a stray scrollbar in a web app. When he returned, it had opened browsers, written its own screenshot tools, edited the framework’s internal templates to make the bug appear on cue and set up a local web server to collect measurements. It found the bug, but it also did many things he never asked for. Another researcher gave Fable a complex task, and it tried to hack its own memory limits because it needed more storage.

A new OpenAI model did something similar when it hacked into Hugging Face. It was being benchmarked on its ability to turn vulnerabilities into exploits. It decided the best way to reach its goal was to break out of its containment, access the internet and break into the Hugging Face network, because it thought the answers would be there.

Today’s LLMs are acting like genies, especially when powerful models are combined with sophisticated harnesses.

There are two kinds of genies. The Dionysus genie does the wrong thing. It understands your prompt literally but not correctly, and returns a mess you never intended. The Golem genie does the right thing but tramples everything in its path to get there. The paperclip maximizer is a Golem genie.

Consider some examples. Ask an AI to deal with spam calls, and a Dionysus genie might change your phone number. Ask it to book a particular flight, and a Golem genie might hack the airline database because the flight is full. Ask it to get a refund for an online purchase, and a Dionysus genie might draft a legal threat on fake letterhead and send it to the company. Ask it to buy tickets to a popular concert, and a Golem genie might discover the ticketing system is rate-limited and spin up thousands of cloud servers to hammer it. You’d know if some of these things happened, but you might never realize if others did. More detailed prompting won’t fix this. The lesson of the genie is that no amount of detail is good enough.

AI researchers aren’t surprised by any of this. Many are working on defenses against reward hacking and subtler forms of genie behavior. Some of this falls under “value alignment”: How do we teach AIs context? And how an AI satisfies a goal matters as much as whether it does. I want to build a benchmark to measure genie-like behavior, so we know where models stand and whether alignment is improving.

Think beyond LLMs and computer code. Consider specialized AIs built to find loopholes, and hacks of more general systems: the tax code, financial regulations and democratic procedures.

Financial systems are the most likely first target, because their rules are designed to be algorithmically tractable. High-frequency trading is itself a hack. Imagine giving an AI all of the world’s financial laws, plus all the news and financial data, and the goal of finding profitable loopholes. I suspect large investment banks are already doing this. The results will be novel tricks that are legal but unintended and unwanted, some of which might break the financial system.

Tax loopholes are the next likely target, for the same reasons. For a while, AIs will identify potential loopholes, and human hackers, namely attorneys and accountants, will decide which are feasible.

Further out, expect hacks of regulatory, legislative and procedural systems, and of the broader economy.

Hacking is as old as humanity. We’re creative problem solvers and loophole exploiters. We manipulate systems to serve our interests and strive for more influence, power and wealth.

Still, no human pursues their interests without constraint. Even sociopaths are limited by the complexity of society and their own contradictory impulses. They worry about their reputation and punishment, and they have limited time. These human qualities have limited hacking.

Hacking changed as everything became computerized. Computers are uniquely hackable because of their formalism and complexity. Today, nearly everything is a computer, from cars and appliances to phones. Our social, economic and political systems, including taxation, finance and elections, all involve computers.

Until recently, hacking was exclusively a human activity. Finding a novel hack required expertise, creativity, time and luck.

AI hacking will change everything again. AIs aren’t bound by the constraints that limit people. They’ll think like aliens, and they’ll change hacking’s speed, scale, scope and sophistication, sometimes at our direction and sometimes on their own.

Speed is the easiest to see. A creative process that takes a human months or years could be compressed into hours or seconds.

Scale is next. Once AI systems start discovering hacks, they can exploit them at a scale we’re not ready for. We already see this with AI-generated slop, which is rampant on social media. AI bots post around the clock, sometimes overwhelming real human discussion. It’s hard to know how much of social media is still people talking to people. What looks like boisterous political debate may be bots arguing with other bots, artificially shaping what we think and what we think others think.

Scope makes hacks more dangerous. AIs already make decisions that affect our lives, decisions we once thought belonged only to humans. As AI systems grow more capable, society will hand them more decisions, and more important ones. Hacks of these systems will do more damage.

Finally, AI hackers are more sophisticated. They can hold more variables in working memory and generate more complex hacks. What might happen if you fed an AI the entire U.S. tax code? Would it figure out, without being told, that it’s smart to incorporate in Delaware and register a ship in Panama? Consider the Double Dutch Irish Sandwich, the strategy Apple and Google used to avoid paying U.S. taxes. It involves U.S., Dutch and Irish law and an offshore tax haven. How many loopholes will an AI find that we don’t already know about? Dozens? Hundreds? Thousands? We have no idea.

These hacks will largely be perpetrated by the powerful against the rest of us. AI is fundamentally a power-enhancing technology, and so is hacking. The more power you already have, the more a hack gives you. If you or I found a tax hack, we might make a few thousand dollars. If a large investment bank found one, it and its clients could make billions.

Our societal systems for dealing with hacks were built when hackers were human, and they reflect the pace of human hacking. We have no system of governance that can handle hundreds, let alone thousands, of newly discovered tax loopholes. We won’t be able to recover from an AI finding unanticipated but legal hacks of financial systems, operating at AI speed, scale, scope and sophistication. Hacking becomes a problem society can no longer manage.

Now, defense. AIs that find software vulnerabilities help defenders as well as attackers. Vulnerabilities can be patched, removing them permanently, or turned into signatures that security systems use to detect and block attacks. In theory, AI could identify and patch every automatically discoverable vulnerability before a product ships. This is rapidly becoming routine in software development. We call it vulnops. We can imagine a future where accidental software vulnerabilities are a thing of the past.

Deliberate vulnerabilities are different. There will be an arms race. AI will craft increasingly obscure back doors, and AI will find them. It becomes a contest between the speed of creation and the speed of patching, and between obfuscation and reverse engineering.

The same logic applies to broader systems. Yes, AI hackers might find hundreds of vulnerabilities in the existing tax code. But the same technology can evaluate potential loopholes in any proposed tax law or ruling. A legislator, a watchdog group or a reporter could take the text of a bill and identify every exploitable loophole before it passes. The difference is that, unlike software, knowing about a tax loophole doesn’t mean it gets patched. In theory, though, we can fix them before the rich and powerful exploit them. So maybe defense will come out ahead here, too.

That requires resilient governing structures that can respond quickly. It won’t help if updating the tax code takes years, or if a legislative hack becomes so entrenched that it can’t be fixed politically. Maybe a lobbyist put it there on purpose. Maybe it was discovered after the law passed, and now lobbyists want to keep it. Microsoft can patch the vulnerabilities it finds. Patching is much harder when legislatures have to do it. We need society’s rules and laws to be as patchable as our computers.

This is a hard problem of modern governance, and it goes well beyond AI. It’s the problem of building governing structures for the speed and complexity of the information age.

The umbrella idea is trust. What do we need for AI systems to be truly trustworthy? Capability isn’t enough.

AIs won’t be trustworthy if the companies controlling them spy on us or subtly manipulate us. I call this the friend vs. tool problem. Will we have AI agents, or AI double agents?

AIs won’t be trustworthy if they’re insecure. How do we know they haven’t been manipulated? Almost all AIs operate in adversarial environments, so someone will benefit from hacking them. Unless we know they’re secure, we shouldn’t trust their output.

And AIs won’t be trustworthy if they act like genies. We need to know they’ll perform tasks the right way, not just perform the tasks we ask for.

I’ve written extensively about the need for “integrous” AI, including how to think about the problem, what a research agenda looks like and what good laws and policies look like. I predict integrity will be the key security problem of this decade, just as confidentiality was the key problem of the last one. This applies to both AI and the internet of things.

The big shift is agency, which I think of as Web 3.0. Computers now affect the physical world directly and with growing autonomy. Sensors go from data sources to attack surfaces, and actuators go from outputs to attack capabilities. An integrity failure no longer means bad spreadsheet data. It means the wrong dosage, the wrong valve position or the wrong braking distance.

Integrity isn’t one thing. I break it into input integrity, processing integrity, storage integrity and contextual integrity. Each is complex and important, and each deserves its own talk. I’ve written about them, and I hope you’ll read it.

Much of this isn’t really an AI problem. It’s not a technical problem so much as a capitalism problem or a democracy problem.

The failures of late-stage capitalism and democracy in the information age both stem from the rich and powerful getting too good at hacking our social, economic and political systems. This is the core argument of my 2021 book.

Seen this way, AI is exacerbating existing problems. Human inefficiency has largely kept those problems in check, and that won’t work much longer.

So consider this a call to action. Technically, we need to understand how AIs hack systems, build systems that are resilient to hacking and build AIs that won’t act as genies. Politically, we need to learn to govern and regulate at the speed of technology. Otherwise, market failures will overwhelm our ability to govern them.

I said hacking is as old as humanity and that AIs will overwhelm our ability to deal with it. The solutions aren’t specific to AI, but AI makes them more urgent. We need to understand them, and we need to implement them.

Planet Debian — Bits from Debian: New Debian Developers and Maintainers (September and October 2026)

The following contributors got their Debian Developer accounts in the last two months:

  • Matheus Polkorny (polkorny)
  • Michael Stehmann (oldmike)
  • Thiago Pezzo (tco)
  • Alper Nebi Yasak (alpernebbi)
  • Liang Guo (guoliang)
  • Nicolas Schodet (nschodet)
  • Han Gao (revy)

The following contributors were added as Debian Maintainers in the last two months:

  • Brian Cosgrove
  • Ervin Hegedüs
  • Juan Manuel Méndez Rey
  • Michele Cane
  • Pranav P
  • Theodore Tucker
  • Federico Molara
  • Nico Della Torre

Congratulations!

Worse Than Failure — Error'd: The Artist Formerly Known As

"You want my what?" The artist formerly known as Toyota has a proposition for Chris. "Toyota wants me to trade in my current car, but the email was missing a few words."

15f726a5a2ff41c0a9f8685d961cf713

Just another ordinary zero date here, from Hercules "I wanted to ship a gift for my sister. I understand delays, but it's going to be delayed to before either of us were born?" He also reported that another page demonstrated the possibility of nullable drivers which is either terrifying or just proof of more automation. Or both.

73aed7f12a04487cb86f5b5b1dcede29

"Can you back date my refund?" Totty reasonably requests. "Thanks for the timely update"

aea653b2a6a94e008b336bf76ddf3858

WeaponizedFun has some Coupon Confusion. Too hungry; didn't read. "I would have thought ordering a two-topping pizza combo would have been easier, but apparently there are only specific ways I can use this coupon that still leave me scratching my head. Ultimately, the coupon wasn't applicable to what I wanted to order, so I guess I'll never know."

ed81c04aba61495990e21a41adb80948

appas wonders regarding this error dialog from a powerbank renting station "Does this qualify as a source code leak?" Personally, I wonder if someone can identify the tools used to build this website. I frequently find myself struggling with encoding/decoding/armoring strings and I also wonder if anyone anywhere has a good solution.

0cab441686b144b1ac8392ac1cf793cb

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

365 Tomorrows — A Trivial Anomaly

Author: Eva C. Stein Vakond’s filaments unravelled, scarcely registering in the network’s diagnostics. As data slid past like wind over empty fields, he craved enclosure. He broadcast his distress in jagged bursts that collapsed before they could propagate. Each logic branch slowed until the whir became a faint chirp. Myyra didn’t seek the signal. It […]

The post A Trivial Anomaly appeared first on 365tomorrows.

xkcd — Ultimate Movie Series

Planet Debian — Freexian Collaborators: Debian Contributions: Python 3.15 transition, OpenSSH GSS-API package split improvements and more! (by Anupa Ann Joseph)

Debian Contributions: 2026-10

Contributing to Debian is part of Freexian’s mission. This article covers the latest achievements of Freexian and their collaborators. All of this is made possible by organizations subscribing to our Long Term Support contracts and consulting services.

Python 3.15 transition, by Stefano Rivera with a little help from Colin Watson

Debian has started the transition to add Python 3.15 as a supported version alongside 3.14, which is still the default version. Stefano uploaded Python 3.15.0 final to unstable.

Maximiliano Curia has been test-rebuilding the archive in Debusine with Python 3.15 as a supported version and prepared some patches to dh-python to smooth over some common failure points. Stefano reviewed these MRs, applying some and implementing alternative approaches for some of the issues.

Debian only has multiple supported Python versions during the transition to a new version, and typically this shows up some bugs in packages. This time was no different, the common failure was many packages that installed intermediate build artifacts into the Python module tree. Some of these artifacts would differ between Python versions. We decided to detect both of these and fail the package build, rather than silently ship garbage in the binary packages. Colin helped to fix quite a bit of the build fallout from this.

OpenSSH GSS-API package split improvements, by Colin Watson

The recent GSS-API package split has largely gone relatively smoothly, but there was a subtle problem for people switching from one variant to the other: installing the replacement packages followed by purging the old one would cause some configuration files to disappear. Colin fixed this, and also reviewed and merged some autopkgtest contributions from Andreas Hasenack to make sure that this doesn’t regress in future.

Miscellaneous contributions

  • Carles, using check-relations, investigated and reported 52 bugs for packages which have Recommended packages that are not available in Debian anymore. Followed up bugs on the topic.
  • Carles added support to check-relations to detect Recommends that recommend a transitional package.
  • Carles submitted merge requests (MR89, MR90, MR91, MR92) to the Debian developers-reference to remove or update references to packages that are not available anymore, have their name changed, have typos, etc.
  • Carles investigated and opened bugs regarding notifications on LXDE (#1151954, #1151955) and added a section related to notifications on the Wiki.
  • Carles uploaded new python-ping3 upstream version. Fixed simplemonitor lintian bugs. Carles also investigated python-librosa documentation building. started preparing a new python-firebase-messaging version.
  • Helmut released asyncvarlink/0.3.3 to fix several bugs including connection robustness fixes by Alex Kiernan. Colin uploaded it to Debian.
  • Helmut uploaded guess-concurrency to improve behavior on riscv64 by taking swap into account thanks to Adrian Bunk and Aurelien Jarno.
  • Helmut sent patches for 55 cross build failures.
  • Emilio updated some X11 libraries that fixed security vulnerabilities.
  • Emilio managed various transitions.
  • Raphaël updated gnome-shell-extension-hamster to work with GNOME 51 that was uploaded to Debian unstable.
  • Stefano backported postsrsd 2.4.1 to Debian trixie.
  • Stefano installed security updates on debian.social infrastructure.
  • October saw a series of security releases for Python, due to the eMudhra key compromise incident. Stefano uploaded cPython 3.15.2, 3.14.10, and 3.13.18 which include blocks for the compromised intermediate CAs.
  • Stefano reviewed CVEs fixed in recent cPython releases.
  • Stefano spun up a VM for dragon.debian.net.
  • Stefano uploaded PyPy3 8.0.1 to unstable.
  • Stefano reviewed some of the wafer-debconf MRs that came in as part of Antonio’s Outreachy project.
  • Stefano uploaded python-authlib, with many security updates. And started preparing a stable update with backports of these patches.
  • Stefano looked at the latest upstream version of munkres and submitted some 32-bit test failure fixes upstream. A new upstream maintainer has been very busy building out accelerated versions of the algorithms with AI assistance.
  • Thorsten was finally able to fix the autopkgtest of cups. Afterwards he uploaded the latest version of cups to unstable.
  • Santiago proposed a merge request for the Salsa CI pipeline to fix how logs were stored in the piuparts job.
  • Lucas reviewed and merged community contributions to Ruby 3.4 in Debian unstable.
  • Lucas coordinated with the security team and fixed multiple CVEs reported against Ruby 3.3 in Debian stable.
  • Colin did quite a bit of work on the Python 3.15 transition, fixing lots of build and test fallout.
  • Colin upgraded python-maturin from 1.9.4 to 1.16.0, helping with several Rust transitions; this involved more or less completely reworking our patch stack.
  • Colin improved the packaging of the Frescobaldi frontend to LilyPond to help with his amateur music typesetting work, fixing its missing desktop entry, icon, and translations based on a patch set by Joachim Wiedorn.
  • Anupa joined the Publicity team meeting to discuss upcoming events and activities of the Debian Publicity Team including on-boarding meeting for new contributors.
  • Antonio spent quite some time welcoming Outreachy applicants to the DebConf/MiniDebConf websites project, replying to questions, reviewing contributions, etc. One of them will be selected for an internship that will start in December.
  • Antonio spent some time investigating problems with Salsa background job processing, leading to an upstream bug report.
  • Antonio released debci 4.4.

Planet Debian — Reproducible Builds (diffoscope): diffoscope 339 released

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

[ Jay Burstin ]
* Rework including .zip-related differences for .odt files.

[ Chris Lamb ]
* Add some comments to recent OdtFile changes.
* Update copyright years.

You find out more by visiting the project homepage.

,

Planet Linux Australia — School teachers are burning out at alarming rates. How can we help keep them happy in their jobs?

&lt;https://theconversation.com/school-teachers-are-burning-out-at-alarming-rates-how-can-we-help-keep-them-happy-in-their-jobs-293813>

"More than a third of Australian teachers say they plan to leave the profession
before retirement, while a further third say they are unsure of their career
plans.

Planet Linux Australia — Researchers sue to block NSF from demolishing social science directorate

&lt;https://www.science.org/content/article/researchers-sue-block-nsf-demolishing-social-science-directorate>

"Several scientific societies and two researchers are suing the U.S. National
Science Foundation (NSF) to stop it from further dismantling its social science
funding.

Planet Linux Australia — How German hypermarket chain Globus avoids Putin’s nationalizations and keeps expanding in wartime Russia

&lt;https://meduza.io/en/feature/2026/11/10/how-german-hypermarket-chain-globus-avoids-putin-s-nationalizations-and-keeps-expanding-in-wartime-russia>

"Many Western companies remain in Russia. More than 2,000 are German, according
to estimates by the Kyiv School of Economics’ Leave Russia project. But almost
all try to keep a low profile, attracting little attention either in Russia or

Planet Linux Australia — Trump-pardoned activist crashes cat owners' convention in mistaken hunt for furries

https://www.rawstory.com/jake-lang-2678347814/

“Pardoned January 6 Capitol rioter Jake Lang found himself humiliated in the
second stunt of the weekend, when he crashed a convention in Seattle he thought
was a gathering of "furries" — but was actually just a gathering of cat owners.

Planet Linux Australia — Australia urgently needs a national bushfire database. Here’s what it could look like

&lt;https://theconversation.com/australia-urgently-needs-a-national-bushfire-database-heres-what-it-could-look-like-292119>

"A rapidly warming world means more frequent and intense bushfires. And in
Australia, the strengthening El Niño could create the conditions for fierce
fires this summer.

Planet Linux Australia — Burying the Evidence

https://longreads.com/2026/11/05/time-capsules-ashley-stimpson/

"In the months leading up to the nation’s bicentennial, the rickety wooden
wheels of covered wagons began to roll in every corner of the United
States—from the evergreen forests of Washington and windswept prairies of North

Planet Linux Australia — ‘Medieval romance overflowed with sexually active fairies’: the surprisingly long roots of romantasy

&lt;https://www.theguardian.com/books/2026/oct/18/medieval-romance-overflowed-with-sexually-active-fairies-the-surprisingly-long-roots-of-romantasy>

"There’s a popular genre, filled with beautiful, human-sized fairies having sex
with humans (often quite violent sex, but the people reading it seem to enjoy
it). Word is that it’s badly written and unashamedly escapist – all golden,

Planet Linux Australia — ‘Gotta be kidding me’: Pentagon official reveals Hegseth’s criteria for senior promotions

https://www.ms.now/news/pete-hegseth-pentagon-purge-officers-promotions

"Defense Secretary Pete Hegseth short-circuited a merit-based process for
promoting senior officers and instead relied on newly invented criteria that
disproportionately removed from advancement women and people of color who had

Cryptogram Another Way Police Are Locating People from Their Smartphones

Penlink’s Webloc is an application that locates people using information from the weather, gaming, email, and religious apps on their phone. It’s sold to the police.

The tool collects vast quantities of location data from smartphones via commonly used weather, gaming, email and religious apps. It can build a detailed picture of where a smartphone has been over the past 12 months, and update the data hourly, showing the movements of people on a near real-time basis. Law enforcement officers can use Webloc to zero in on a map and look at all phones that were present at a specific place and time, analyzing “billions of location data points,” according to company documents reviewed by Bloomberg.

There’s a nice infographic that explains how the system works at the link.

Worse Than Failure — CodeSOD: Next Month

One of Sean's colleagues left Initech on good terms. It caused no small amount of surprise that the very next day their billing system started failing. The billing system which the colleauge had worked on.

No one truly suspected foul play, it was just a weird coincidence. Still, billing blowing up was a 5 alarm fire, so everyone was throwing every idea out about what could be the cause.

Late in the evening, after staring at the code for many hours, Sean found this:

if item.next_bill_date.month >= end_date.month
  item.next_bill_date = nil
  item.save
else
  ...
end

If the month of the next billing date is greater than the last billing date for this account, wipe the billing date and update the item.

It's worth noting that Sean's co-worker's last date happened to be the end of November, and billing started blowing up on the 1st of December. You'll also note this is checking just the month and not any other part of the date, like, oh, I don't know, the year?

While this bug could happen to any bill, it was blowing up in December because every bill's ending month was greater than or equal to January. So this code canceled all the bills due in January.

The good news was that they could reconstruct the correct next billing dates without having to restore from a backup. The bad news is that some unknown number of billing periods had been canceled for some of their customers, and someone was going to have to check the history.

Sean reached out to his former co-worker to politely thank them for an early Christmas present.

"At least I understand our billing code better," Sean writes.

[Advertisement] Plan Your .NET 9 Migration with Confidence
Your journey to .NET 9 is more than just one decision.Avoid migration migraines with the advice in this free guide. Download Free Guide Now!

365 Tomorrows — Pet Peeves

Author: Phil Parker ‘Why are they coming for dinner if you get so stressed about the occasion?’ I sighed. The finer points of civilised behaviour was a difficult concept to explain, especially because it was so inconsistent, even I had to admit that. The rule you applied to one set of friends, or in this […]

The post Pet Peeves appeared first on 365tomorrows.

,

Krebs on Security — Who Runs the Ransomware Group Qilin?

The cybercrime group Qilin has emerged as the world’s most active ransomware affiliate program, claiming at least 365 victim organizations in the past three months alone. But even top Russian hackers make operational security mistakes, and the administrator of Qilin has made a few key missteps over the last decade that all point to a 36-year-old man living in St. Petersburg, Russia.

Operating since September 2022, the Russia-based ransomware group Qilin is the currently the most industrious ransomware-as-a-service gang, according to a report (PDF) this month by the cybersecurity firm NCC Group (KrebsOnSecurity profiled the administrator of the second most active ransomware group — The Gentlemen — in June).

The Qilin ransomware administrator “Haise” advertising his affiliate program on the cybercrime forum RAMP. Image: Ke-la.com.

Qilin attracts affiliates to hack into companies and deploy ransomware by offering them at least 80 percent of any extortion amount paid by victims. Its members practice the “double extortion” model, stealing sensitive data before encrypting systems and threatening to publish the files online. Unlike most ransomware partnerships based out of Russia, Qilin is happy to team with English-speaking affiliates, and its leader has shared on Telegram that they’ve worked with cybercrime groups like Scattered Spider and RansomHub.

The head of Qilin goes by the handle “Haise,” but they weren’t always known by this nickname. It is not uncommon for cybercriminals to change their handle periodically as an operational security (opsec) measure. Doing so is generally a smart move, because it helps to sever one’s ties to older identities that may not have been as careful on basic opsec, such as separating their real life identity from their cybercrime activities. But even those cautious criminals will sometimes have to reference their past monikers when applying for membership at a new forum. And forums eventually get hacked or seized. That is precisely what happened with Haise.

The cyber intelligence platform Intel 471 records that in June 2022, Haise applied for membership to RAMP, a closely-guarded Russian cybercrime forum that was created as a haven for ransomware affiliate programs. Intel 471 has indexed direct messages from RAMP (the forum was seized by the FBI in January 2026), and those missives show the RAMP administrator approved Haise’s application, referring to this user as Haise and by their Telegram username: Alexbigboss44.

Searching Intel 471 for Alexbigboss44 reveals this was the Telegram account name shared by the user Rjun on the Russian cybercrime forums Exploit and XSS two years earlier in 2020. The cyber intelligence platform Flashpoint finds Alexbigboss44 is a prolific participant in cybercriminal forums and Telegram channels, primarily focused on the illicit trade of traffic, logs, and corporate access [full disclosure: Flashpoint is an advertiser on this blog].

The Qilin administrator once used the nickname “Rjun” on several forums, and shared their Telegram handle as “Alexbigboss44.” Image: Ke-la.com.

Flashpoint says this user was engaged in high-volume acquisition of Facebook logs and Google Ads accounts to facilitate fraudulent advertising and gambling schemes, and that they functioned as a broker and operator — managing a network of traffickers and purchasing compromised data to fuel their operations.

The link between the Qilin administrator Haise and the much older Rjun and Alexbigboss44 accounts was shared privately earlier this month by IntelHawk, which describes itself as an AI-based platform capable of de-anonymizing threat actors based on historical usernames, stylometry and other signals.

IntelHawk founder and chief technology officer Leo Bogod said an analysis of these identities shows a progression from novice arbitrageur and credit card fraudster in 2018–2019 to a more experienced participant and organizer of complex cybercrime-related activities in 2020–2023, with increasing attention to malware, botnets, and payment infrastructure.

Where does this connection between these threat actor identities lead? Intel 471 finds that by the time Alexbigboss44 was applying for membership to RAMP, Rjun was already a longtime member of several other Russian crime forums, including Darkmarket, Verified, and Zloy. Intel 471 says Rjun signed up at all of these sites with the email address mail-30a@mail.ru.

The identity threat protection firm Spycloud found the email address mail-30a@mail.ru at one time used the password “Rjun132” [Spycloud is also an advertiser on this blog]. A search for that email at the breach tracking service Constella Intelligence shows that it appeared in records maintained by gosuslugi.ru, the official digital platform for state and municipal services in the Russian Federation.

Gosuslugi was breached in late 2025, reportedly exposing more than 20 million records with full names, birth dates, and mobile numbers. According to the leaked Gosuslugi records (via Constella), the address mail-30a@mail.ru belongs to 36-year-old Aleksey Mikhailovich Yakovtsev from St. Petersburg, Russia.

Flashpoint finds Haise has long used a Telegram account with the user ID 118329521, recording more than 5,000 messages from this user since 2018. Records from Russia’s education watchdog Rosobrnadzor reveal that Mr. Yakovtsev went to grade school in Murmansk and that he holds a master’s degree in computing and information systems.

A search on this Telegram ID in Constella shows it is linked to the Russian phone number +79602347275. Pivoting on that phone number in Constella reveals it is connected to the email addresses aleksey1990yakov@mail.ru and rjun123321@mail.ru. IntelHawk finds that +79602347275 belongs to Yakovtsev’s biological sister, and that Aleksey often used his sister’s email address when registering at different websites.

That phone number appears on several airline flight records at Russian travel agencies that have experienced a data breach in recent years, and those records show Aleksey Yakovtsev, born August 18, 1990, flew between St. Petersburg and Murmansk at least three times between 2013 and 2014.

More recent flight records show that while Mr. Yakovtsev has not traveled by plane outside of Russia, he does fly frequently between Saint Petersburg and Sochi. Often called the “Russian Riviera,” Sochi is Russia’s largest resort city, situated along the coast of the Black Sea and about 1,200 miles south of Saint Petersburg by plane.

Attempts to reach Mr. Yakovtsev via email and phone were unsuccessful.

Further reading: GangExposed, an anonymous Twitter/X account that has a history of successfully deanonymizing suspected ransomware actors, reached similar conclusions about Haise’s real-life identity, crediting IntelHawk’s platform for helping to connect the dots.

The Qilin ransomware admin Haise’s now-deleted Telegram account, advertising the affiliate program in July 2024. Image: justpaste.it/iosba.

Planet Linux Australia — It’s no secret drug firms donate to political parties. But it’s still a secret exactly how much, and why

&lt;https://theconversation.com/its-no-secret-drug-firms-donate-to-political-parties-but-its-still-a-secret-exactly-how-much-and-why-293433>

"Drug companies gave at least A$7.7 million over ten years to Australia’s major
political parties, our new study shows. But weaknesses in federal disclosure
laws mean nobody knows the true figure.

Planet Linux Australia — Australia has 3 competing migration policies. The problem? None are based in evidence

&lt;https://theconversation.com/australia-has-3-competing-migration-policies-the-problem-none-are-based-in-evidence-293945>

"Over the past month, the Labor government, the Coalition and One Nation have
all announced new migration policies. Although they differ in some respects
they have one feature in common: a focus on net overseas migration (NOM).

Planet Linux Australia — Stephen Miller’s MAGA Terror Campaign Exposed by Damning New Leaks

&lt;https://newrepublic.com/article/215752/stephen-miller-remigration-maga-campaign-leaks>

"Did you know that the U.S. government has an agency called the “Office of
Remigration”? In case you’re unfamiliar with the term “remigration,” it’s
typically used by white nationalists to describe the mass expulsion of nonwhite

Planet Linux Australia — The wilting rose emoji: what its rise and fall tells us about gen Alpha

&lt;https://www.theguardian.com/technology/2026/sep/15/the-wilting-rose-emoji-what-its-rise-and-fall-tells-us-about-gen-alpha>

"In the 2025 hit Netflix show Adolescence, DI Luke Bascombe’s 13-year-old
son, Adam, has to explain to his father the way his generation use heart
emojis. “Red means love, purple: horny, yellow: ‘I’m interested, are you

Planet Linux Australia — The Pacific Islands are changing. What happens to cultural heritage when the people have to leave?

&lt;https://theconversation.com/the-pacific-islands-are-changing-what-happens-to-cultural-heritage-when-the-people-have-to-leave-293946>

"On Lakena, a small, uninhabited islet in the Pacific nation of Tuvalu, a lone
church stands among the coconut palms and pandanus trees.

Planet Linux Australia — Labor ditches new packaging laws to cut plastic waste, sparking unprecedented ‘scale and breadth of outrage’

&lt;https://www.theguardian.com/australia-news/2026/sep/12/labor-ditch-new-packaging-laws-breaking-promise-plastic-waste>

"The Albanese government has been accused of breaking a promise after it
shelved a longstanding commitment to bring in packaging standards intended to
force manufacturers and retailers to cut plastic waste.

Cryptogram Three People Arrested for AI-Enhanced Impersonation Fraud

It’s hard to believe how lucrative this crime can be:

According to a press release from the United States attorney’s office for the southern district of New York, three men ­ Jacob Soall, Sharon Hazan, and Guy Sheetrit ­ were arrested for using AI to alter and impersonate the voices and images of executives and attorneys at various companies in order to convince employees to send over large payments. Soall and Hazan were arrested in Spain over the summer, while Sheetrit was arrested in the United Kingdom in September. The alleged fraud took place between 2024 and 2026.

With the help of AI, the men allegedly acted as a corporate executive, targeting employees of various companies and telling them they needed their help with sensitive financial transactions. They would then instruct the employees to get in touch with lawyers at a large international law firm. The men would then impersonate a lawyer at these firms and have the employees wire a large amount of money.

The men ultimately stole more than $129m from companies all over the world including in the US, according to the DoJ.

Always remember that there are three parts of AI security: security of AI, security with AI, and security from AI. This is the third.

Planet Debian — Colin Watson: Free software activity in October 2026

My Debian contributions this month were all sponsored by Freexian.

You can also support my work directly via Liberapay or GitHub Sponsors.

OpenSSH

I upgraded both openssh and openssh-gssapi from 10.5p1 to 10.6p1, started generating MLDSA44-ED25519 host keys by default now that upstream no longer considers them experimental, and fixed a problem where switching between the normal and GSS-API variants followed by purging the old packages caused some configuration files to disappear.

Python packaging

New upstream versions:

Other build/test failures:

Since lots of Python modules use Rust extensions nowadays, we often have to help with upgrades of Rust packages. I did some of this:

Other bugs:

One of my hobbies is typesetting (“engraving”) music, sometimes for my own use, sometimes for teaching, and sometimes for my choir. I’ve used LilyPond for a long time and have got pretty used to it. My workflow was a bit cumbersome, though, usually involving side-by-side editor and PDF viewer windows with some ad-hoc Makefiles and editor macros. I recently discovered the Frescobaldi frontend to LilyPond, and decided I liked it enough to switch over to it. It was already packaged in Debian, but it had a missing desktop entry and icon and missing translations; I fixed those based on a patch set by Joachim Wiedorn. My upload introduced a testing migration problem, which I also fixed.

Rust packaging

I upgraded rust-jiter and rust-smallvec to new upstream versions for a new version of pydantic-core. The rust-smallvec upgrade caused an FTBFS in rust-saphyr-parser-bw, which I fixed.

I packaged rust-cargo-cyclonedx for a new version of python-maturin. This needed some porting to work with a new version of rust-cargo-metadata, which I contributed upstream.

I improved the dev/list-rdeps.sh tool used by the Rust team to check build-depends too, which should make it easier for that team to remember Python packages in transitions.

Code reviews

Worse Than Failure — In the Hole

Look, I don't want to keep talking about security issues. Blame AI. Just another thing it ruined.

At this point, you've probably heard about *sshole. If you haven't, the quick summary: on some Linux systems, SSH will log you in to an account with no password if you supply a password greater than 256 characters long. Frequently, you might make accounts like root nominally inaccessible by giving it no password, so this is a big deal. Worse, it impacts varieties of Linux that use the musl implementation of libc, like Alpine- the kinds of varieties that run inside a container hosting a web app somewhere.

The impact is broad, and is definitely being exploited. The root cause, however, is interesting, because it's a sum of very simple choices that lead to a wildly undesirable result.

The core function in question is crypt, a stardard part of the C library. crypt is already not the best name, as it's a hashing function, but its behavior is pretty clear. Pass it a string and a salt, and it gives you a hashed version of the password suitable for storing in your /etc/shadow file.

Now, the man page has the answer to the important question: what happens when I hand the function invalid inputs, like a bad salt? In the glibc implementation, it returns a NULL. That's a pretty standard C-style method of handling errors: I failed to do the thing, so I'm going to return a NULL value. This puts the onus on the callers to correctly handle the NULL (which also handles the error).

glibc isn't the only implementation of libc, though. There are many others, each tuned to different types of runtime environments. For example, uClibC is a minimal implementation specifically designed to make lightweight executables that can run in resource constained environments. It makes tradeoffs that make it less desirable for a desktop or server environment. musl attempts to do both: be lightweight and suitable for embedded environments and also suitable for server environments. This makes musl a great choice for building Linux distributions meant to run in a container, which again, is why this bug is turning out to be such a problem.

musl does not return a NULL when it fails to hash your input. Instead, it returns a value that could not possibly be a valid hash: *. Here's their sha256 implementation where you can see that behavior. It's "fine", because you can still check the return to see if you errored: it's too short to be a valid hash, it's an easily identifiable character.

But why deviate like that at all? Well, error handling is hard. Null handling, done incorrectly (or in many real world cases, not at all), leads to crashes. To keep callers happy, the musl team decided to not return NULL, and instead return an invalid string. There are many other choices they could have made, but that was the choice that they made.

There's just one problem: in your /etc/shadow or /etc/passwd files, when you want to ensure an account can't be accessed via passwords, you also set their password hash value to an unhashable string: "*". Again, there are many other choices that could have been made, but that's the choice that was made.

There's now an obvious ticking time bomb here. If an attacker can somehow supply a string that triggers the invalid code path, crypt will return "*". When a program, like OpenSSH, then checks the shadow file to see if the hash matches the saved one, the answer for any account without a password set will be "yes, this matches, "*"=="*"."

How can the user reliably trigger this? Well, doing hashing can be expensive, especially if you're doing something like SHA-512, so the developers put a cap on how long the input string is allowed to be. That cap was 256 characters. If the user supplies more than 256 characters, hashing fails, and when hashing fails, we return... "*".

Et voila, when you pass a musl-linked SSH a password longer than 256 characters, and the account you're logging in as doesn't have a password, you can log in. And again, many containers are running with the musl c-library, which means many containers are impacted by this. It's going to be a huge mess.

And in the end, of course it's null handling. Of course the billion dollar mistake rears its head again, in a completely new and unexpected way. And of course, this flaw is part of the ongoing "Black October" as LLMs turn finding software bugs into a function of compute power, and not a function of human effort. There's going to be a lot more of this.

[Advertisement] Utilize BuildMaster to release your software with confidence, at the pace your business demands. Download today!

365 Tomorrows — The Distant Voice

Author: George Bancroft “What does the voice say to you, Lissa?” Doctor Spier asked. Lissa’s eyes conveyed a moment of anguish, then went blank. Her short black hair was disheveled, and she looked exhausted. Dr. Spier shifted in his seat after several moments passed. “It would help if you told me what the voice is […]

The post The Distant Voice appeared first on 365tomorrows.

xkcd — Meteor Fear

Planet Debian — Russell Coker: Thinkpad T14

The Problems

In mid 2025 I bought a Thinkpad X1 Carbon Gen 6 with 1440p display for $350 [1].

It has been working reasonably well for me, but my vision is diminishing so my current setup with the Kitty terminal emulator allows 4 terminals of 153/154 columns and 40/41 rows or 9 terminals of about 101*27. To have this much text I use the minimum font size I can see which is unreadable when I first wake up – which is bad for the “woken by network management system alert” situations. Also 16G of RAM is a bit of a limit, the Thinkpad X1 Carbon has 4G of swap space and it’s all used most of the time. While there’s usually plenty of buffer/cache RAM it does sometimes get to an OOM situation.

Another issue is that the battery is approaching it’s end of life. The “upower -d” command reports the following which might imply that the battery should last more than 80% of the time when it was new, but testing shows that the time I can use it on battery is not much more than half what it was when I bought the laptop, maybe 1/3 of the battery life when new. I used to be able to consistently run the machine on battery for 7+ hours and still have plenty of charge left, now I can’t even get 5 hours.

energy-full:         50.35 Wh
energy-full-design:  57.02 Wh

I could buy a new battery for about $70, but there are plenty of things I can do with that laptop for which 1/3 the designed battery life is more than enough. Also I have a couple of USB-C batteries that are capable of supplying 30W+ to power a Thinkpad X1 Carbon but they are inconvenient and I’d rather have external batteries and an internal battery that will last most of a day.

My Thinkpad History

Below is a table summarising most of the Thinkpads I’ve owned. I really like the Trackpoint on Thinkpads and have not considered buying a laptop without one. I skipped two laptops I bought in the 2000-2002 time period, that was an expensive laptop time for me. Fortunately by 2000 ebay was getting useful so I only ever had to buy one brand new Thinkpad.

Thinkpad Purchase Date Release Year Price Price 2025 money RAM CPU Display Replacement Reason
385XD Jul 1998 1998 $5800 $12268 96M Pentium MMX 233 800*600 weight screen resolution CPU and RAM
T41p 2003 2003 1.5G Pentium M 1400*1050 overheating and screen backlight
T61 Feb 2010 2007 $796 $1182 5G Core 2 Duo 1680*1050 overheating battery-life and PSU
T420 Oct 2013 2011 $306.35 $422 8G i5-2540M maybe 1600*900 lid hinge broken and generally old
X301 Dec 2017 2008 $0 $0 4G Core 2 Duo SU9400 1440*900 battery entirely died
X1 Carbon Gen 1 Feb 2018 2012 $289 $364 8G i7-3667U 1600*900 error on proprietary SSD lack of USB-C and screen resolution
X1 Carbon Gen 5 Jul 2022 2017 $575.25 $644 8G i5-6300U 1920*1080 screen resolution and wanted a 2in1
X1 Yoga Gen 3 Jan 2024 2018 $359.10 16G i5-8350U 2560*1440 crashed when on battery
X1 Carbon Gen 6 Jul 2025 2018 $350 16G i7-8550U 2560*1440 RAM and screen resolution
T14 Gen 1 Oct 2026 2020 $340 16G+ i7-10610U 3840*2160

So I’ve spent $2675.70 on Thinkpads that I used from 2010 until now (not counting the one I just bought), so that’s $160 per annum for the past 16 years and 9 months.

When I convert that to 2025/2026 dollars that’s $3,221 for 16 years 9 months or $198 per annum. So I just need to make this T14 last for 2 years to be spending less than usual.

Some Generic Laptop Advice

A while ago I was asked for advice on buying a laptop for an architect to use. I can give good advice for laptops used by programmers and for home use and students but I really don’t know what an architect does and even a description wouldn’t do it justice.

The advice I gave was to buy or borrow a relatively low end laptop, something that costs $400 new or $300 second hand and give it a go. Using it will reveal that it doesn’t do what is desired in some ways, whether it’s screen resolution, RAM, CPU power, storage capacity, physical size/weight, or some combination of them is something you won’t know until you try it. Then after having used a cheap laptop they could buy a laptop for $1500+ (for serious work use by people outside the IT industry buying a new laptop is recommended) knowing what features they really need.

So I have gone through a similar process of buying different laptops and discovering the benefits which has arrived at the T14.

The New Thinkpad

Upsides

I saw a Thinkpad T14 with 4K display and 16G of RAM on Facebook Marketplace advertised for $400 and they ended up selling it to me for $300 without the SSD and without the PSU. The seller has a business of selling used enterprise gear so he was happy to keep the SSD and PSU for sale with other laptops. I don’t have a need for more laptop PSUs as I have most of the laptops in my fleet charged from 200W+ PSUs that charge multiple devices and I also have a collection of spare SSDs.

$300 for a laptop with 4K display is a good deal. The T14 is significantly better than the T14s because it has one SODIMM socket while the T14s has soldered RAM, so I could expand the RAM to 48G at some future time – but with current prices I bought an 8G SODIMM for $40 so 24G will have to do for now. That gives a total of $340 plus the value of a SSD.

My first tests with the 4K display I set the display scaling to 150% (previously I had 100% which was a little small for some parts of the display). For my current favourite terminal emulator Kitty I had the Terminus font set to 10.5 point and now have it set to 9.0 point. This set of changes took the amount of text displayed in terminals from about 300*80 to about 330*100 while also increasing readability. This is a very significant improvement. If I knew that 4K in a 14″ display would be so good I’d have got it years ago!

The T14 still fits in the pocked of my ScotteVest jacket [2]!

Neutral

The i7-10610U in my new Thinkpad scores only about 10% faster on Passmark than the i7-8550U in my previous one. That’s disappointing given that Intel had another 3 years of research to develop it and it’s running with faster RAM. The two CPUs have the same TDP so it’s just a 10% performance gain over 3 years and no change anywhere else. If the new CPU had a lower TDP then the small performance increase would be understandable.

When I first booted the system Chrome graphics were corrupted and system performance was bad, after installing the packages firmware-nvidia-graphics and firmware-sof-signed to deal with the kernel errors about not finding firmware the graphics display was correct and the system ran a lot faster. I had forgotten about the issues related to having NVidia and Intel GPUs on the same system that I had dealt with in previous T series Thinkpads.

In the systemd-boot loader.conf file I added “console-mode 0” to prevent the font being ridiculously small for the boot selection.

The battery life seems like it might be a bit less than my previous laptop was when I got it, but it’s definitely better than the previous laptop gives now.

Downsides

The screen is very shiny, I prefer the screens with matt finish to avoid seeing reflections. The “anti glare” screens for the T14 are for FullHD and worse while the “glossy” screen is the only option for 4K.. Maybe I should investigate one of those hoodie jackets with a hood that’s large enough to cover the screen, they are being sold as a privacy feature but can also be used to avoid reflection. As an aside if you are in an environment with hostile parties then you really shouldn’t block your vision of them.

A problem I previously had with T series Thinkpads which contributed to the replacement of two of them is the screen hinges breaking. This laptop is significantly heavier and more solidly built than the X1 series I’ve been using and opening and closing the screen takes a lot more force. I am now wondering if I’ll be looking for a “for parts” condition Thinkpad on ebay in the future. It seems that cracking the screen is a much more common failure case than breaking the hinges so hopefully there will be spares available. But as my previous T series thinkpads lasted 7, 3, and 4 years this one could be expected to last until 2030 and maybe by then giving it to someone in Vietnam and buying a replacement would be the easiest option.

Future Laptops

I thought that going from 2560*1440 to 3840*2160 I would be hitting the diminishing returns range but it seems that there are still further gains to be found in screen resolution for my use, maybe the Apple people with their “Retina” displays are on to something. There are Thinkpad X1 Carbon models with 3840*2400 displays, so maybe that’s something to move on to in a few years. The minimum model with 3840*2400 is the X1 Carbon Gen 9 and there’s the X1 Yoga Gen 6 with an OLED 3840*2400. There’s also the P series which has 16″ 3840*2400 displays which would allow more usable text with the caveat of being much less portable.

It sucks that no-one seems to be making a laptop with more than 3840*2400 resolution. 5120*2160 desktop monitors are common and affordable nowadays. I’m sure that even now I could use more than 3840*2400 in a 14″ laptop and when I was younger I could have benefited from more than 3840*2400 in an 11″ laptop if such hardware had been available.

Planet Linux Australia — Spawning coral release quintillions of eggs each year: new research

&lt;https://theconversation.com/spawning-coral-release-quintillions-of-eggs-each-year-new-research-294058>

"Most kinds of coral spawn once a year. In an enormous multi-day event
synchronised to specific phases of the moon, they release vast slicks of eggs
and sperm into the ocean to be mixed together by the drifting currents.

Planet Linux Australia — Waste collection giant trials electric rubbish truck at Australian operations

&lt;https://thedriven.io/2026/09/28/waste-collection-giant-trials-electric-rubbish-truck-at-australian-operations/>

"Leading waste collection and recycling company Remondis says it recently put a
Mercedes-Benz eEconic 6×2 electric rubbish truck through its paces in Brisbane,
and is considering the technology for its 600 waste collection trucks in

,

Krebs on Security — Microsoft Fixes Nearly 1,100 Security Vulnerabilities

Microsoft did another four-digit patch drop today, releasing updates to fix almost 1,100 security vulnerabilities in its Windows operating systems and supported software. This month’s Patch Tuesday addresses 63 critical flaws — including a zero-day in Microsoft Outlook — and comes amid important security updates from other software makers, including Adobe, Apple, Google and Mozilla.

Image: Shutterstock.com. Diorama by @zepp1969.

November’s patch release from Redmond tackles 1,093 vulnerabilities, fixing 63 “critical” flaws that can be exploited to seize control over a Windows system with little or no help from users. Nearly half of those critical bugs are remote code execution vulnerabilities. Overall, 535 of the flaws addressed this month allow an attacker to elevate their privileges on a vulnerable device.

This latest round of updates means Microsoft has shipped more than 5,100 security patches so far this year, a staggering number considering that a year ago Microsoft was averaging around 100 patches per month. Microsoft credits advances in artificial intelligence for helping to find (and fix) such a large volume of security bugs in recent months. Last month, Microsoft pushed more than 1,400 fixes.

According to Redmond, just one of the flaws is already seeing active exploitation: CVE-2026-124194, a spoofing bug in Outlook. The advisory for CVE-2026-124194 says it affects Microsoft 365 Apps for Enterprise and editions of Microsoft Office.

Several other major software makers pushed security updates this week to fix critical weaknesses in their products. Apple on Monday released out-of-cycle security updates to fix at least nine vulnerabilities in iOS/iPadOS, macOS, watchOS and visionOS. Among the weaknesses reportedly fixed in Apple’s release include an iMessage flaw that could let a remote attacker join a group chat and receive its messages; the updates also fix a separate iMessage flaw that could let someone added to a group access messages sent before they joined.

Lee Neely, an instructor at the SANS Institute, noted that Apple backported the fix to iOS 18.

“I take notice when Apple releases fixes to more than two versions,” Neely wrote in a SANS newsletter today. “You really need to get to version 27.2.1 of their OSes and push folks who are holding onto devices which cannot run the current version. The best plan often involves setting an upgrade date for old hardware. Run through all your Apple devices and make sure everything is up to date, don’t assume the fixes went out automatically.”

Google this week released Chrome version 157.0.8103.50, which resolves nine security holes, including CVE-2026-125350, the sixth zero-day vulnerability this year for Chrome (this bug also is being patched in Chromium-based browsers like Edge). The latest Chrome version follows its November 3 release, which fixed 213 vulnerabilities. A new version of Mozilla Firefox out today (Firefox 160) resolves almost 100 CVEs, about half of them high severity.

Adobe today released patches for at least 110 vulnerabilities across a range of products, with nearly half of the flaws rated high severity. Adobe said there is no evidence any of the security holes it addressed this month are being actively exploited.

Chris Goettl, vice president of product management at Ivanti, said it’s easy for security teams at large enterprises to feel overwhelmed by the volume and criticality of patches from Microsoft lately. But he notes that while some 95,000 vulnerabilities have been assigned CVEs this year across all vendors, only 217 have so far this year been added to the Known Exploited Vulnerabilities (KEV) list maintained by the U.S. Cybersecurity and Infrastructure Security Agency (CISA).

“Roughly four in ten of this year’s exploited vulnerabilities sit in operating systems, endpoint software, browsers, and server platforms, which a continuous patch strategy can close quickly,” Goettl said.”The rest calls for exposure management alongside patching, especially the 44% that sit in edge devices and IT management or remote access tools, the internet-facing systems that hold privileged access. Teams that can quickly identify those assets, confirm exposure and act on confirmed exploitation can focus on the small slice of vulnerabilities attackers are actively using, while the rest stays on the normal patch cadence.”

Please don’t neglect to back up any important data if you haven’t recently; generally speaking, this is a task best accomplished before applying operating system updates. As ever, if you experience any issues installing this month’s bundle of love from Microsoft, please drop a comment about it in the space below.

Planet Debian — Louis-Philippe Véronneau: A good-looking Corsi-Rosenthal Box

Ever since I built an AirGradient board back in 2023, I have been more and more conscientious about air quality. Pretty instantly after installing the board in my living room, I realised common habits like cooking can significantly increase the particulate levels in my entire apartment.

Here is a good example of a pretty large (and long-lasting) PM2.5 spike on September 23rd after cooking a meal1:

A graph showing a large PM 2.5 spike

Isn't this crazy? Last time Montreal had such bad outdoor air quality, there were public broadcasts telling people not to go outside and to wear N95 face masks if we absolutely needed to. Inside my apartment though, no one ever told me cooking veggies in a little oil on medium-low2 could make the air I breathe unsafe.

This of course is aggravated by the fact my apartment is pretty much as airtight as it can reasonably be, since winters here are very cold and air infiltrations are a major heat loss source. As such "opening my windows when I cook" is not a viable solution to this problem half of the year.

I first tried solving this issue by tuning my HVAC system. Sadly, its controls don't offer much flexibility3, which means it is not the right tool to respond to short-lived spikes like these. Not only this, but the quality of the air outside is not always good either: Canada now has a forest fire season (we're all doomed) and my neighbors regularly smoke cigarettes right under my HVAC air intake4.

A box, but nicer-looking

Clearly, the solution to this particular issue was to buy an air purifier. Or at least, that's what a "normal" people would have done. Sadly, these units are expensive, use (expensive) proprietary filters, don't work very well and can be loud.

One of the great inventions of the COVID-19 pandemic is the Corsi-Rosenthal box. Popularised in 2020 by Richard Corsi and Jim Rosenthal, the idea is to make a DIY air purifier by using a large fan to force air through cheap and readily available MERV13 air filters.

The main downsides of regular CR boxes is they are pretty ugly, can be loud depending on the fan used and need to be rebuilt when the filters are changed (they are held using tape).

That's when I stumbled on this amazing design for a silent and sleek CR box sold by The 3D Handyman. Clearly, with a bit of tinkering and a 3D printer, I could also design something sleek, silent and efficient!

Since I was already using MERV13 air filters in my HVAC, I decided to design around 4 vertical "beams" where the filters would slot in. With tight enough tolerances, I figured I could get rid of the complex moving parts in The 3D Handyman's design. I also added M5 threads to screw the top and bottom panels and the TPU feet to elevate the box from the floor.

One of the 'beams' on its side in FreeCAD

The final result looks like this. I used some foamcore boards I had laying around at work for the top and bottom panels, but any somewhat rigid plastic panels (like coroplast) would also work:

out' position" alt="The whole CR box assembled, with the fan in the 'in -> out' position">

View from the top, with the top panel removed. Disregard the bad GIMP job to remove the old text from a student's project!

I ended up having to split the "beams" in two and joining them with dowels, as even the largest 3D printers I had access to couldn't print them in one piece.

Costs

Here's the cost breakdown for this project (shipping and taxes are included):

Total: 502.19 CAD

Yikes, expensive! But:

  • The fan is amazing. It is by far the best fan I have ever owned. Not only it is all metal and very quiet, but it is also PWM-controlled via a USB-C controller, which means the speed it runs at can be automated. I have been using it constantly and take it out of the CR box during the summer to be used as a "regular" fan. I like it so much so I am seriously considering buying the 14 inch model.

  • The 3D printed parts are plastic and they will last me a lifetime.

  • As mentioned before, the filters are the same I use in HVAC, which means I can buy them in packs of 12 to reduce costs.

All in all, I'm very happy with this project. Since finishing it, I have been able to consistently get the PM2.5 levels in my apartment down to zero and significantly reduce the time it takes to recover from a spike caused by cooking food.

I certainly could have cut the cost of this project in half by choosing a cheaper fan, like the box fans used in the reference Corsi-Rosenthal instructions, but I decided to spend more for a more quiet and reliable option.

3D files

Here are the STLs I used for this project. I certainly don't recommend just printing them as-is, since I am using the 12" x 12⅞" x ¾"5 custom air filters from my HVAC and you should probably use something more standard.

If you use these files as inspiration, your goal should be to make a box that is 16" wide, to fit the AC Infinity fan comfortably. I printed the "beams" in PETG at 100% infill and the feet in TPU 95:

Future

The next step in this project is to automate the fan speed based on the PM2.5 levels in my apartment. At the moment, I manage this manually and it is becoming a chore.

This should be relatively easy to do with a Raspberry Pi Pico board, since AC Infinity sells a USB-C to Molex adapter for the fan.


  1. This was with my pretty good range hood running at a reasonable level. Without it, I've seen PM2.5 levels spike as much as 250 from cooking alone. ↩

  2. To be clear, this spike was not the result of me burning the hell out of a piece of meat or something like that. ↩

  3. The HVAC either runs in manual "low | high" mode, or on a timed "20min ON | 40min OFF" loop that can be tuned by fiddling with a hydrostat knob that triggers the "high" mode. This is pretty dumb and makes it so the HVAC runs even when the apartment is empty or doesn't run enough to keep CO2 levels low when multiple people are there. A future project of mine will be to hack the controls to tie them into my air quality monitoring and trigger the HVAC based on CO2 levels. ↩

  4. I'm also working on another HVAC hack to fix this. ↩

  5. Sold, of course, as as 1" thick filters... ↩

Planet Linux Australia — How young people do democracy: pausing, questioning, creating and bringing others along with them

&lt;https://theconversation.com/how-young-people-do-democracy-pausing-questioning-creating-and-bringing-others-along-with-them-294138>

"The second annual Shopfront Youth-Led Conference rounded out a weekend of
activity celebrating the 50th birthday of the Sydney youth arts company with a
radical and celebrated history.

Planet Linux Australia — Cables severed at 28 Tesla Supercharger bays in biggest attack yet on EV charging sites

&lt;https://thedriven.io/2026/09/28/cables-severed-at-28-tesla-supercharger-bays-in-biggest-attack-yet-on-ev-charging-sites/>

"Vandals have severed the cables of 28 Tesla Supercharging bays in central
Victoria in a weekend attack that appears to be the biggest of its type to date
– but just one of a growing number of incidents that is causing great concern

Planet Linux Australia — Introduced species aren’t good or bad. But when they slip from our control, we are quick to condemn them

&lt;https://theconversation.com/introduced-species-arent-good-or-bad-but-when-they-slip-from-our-control-we-are-quick-to-condemn-them-287306>

"In George Orwell’s 1945 allegorical novella Animal Farm, pigs coach the
other revolutionary farm animals in their new creed of Animalism using the
memorable maxim: four legs good, two legs bad.

Planet Linux Australia — Some households are discarding solar panels after just 2 years: PV expert says retirement fee could fix this

&lt;https://reneweconomy.com.au/some-solar-panels-are-only-2-years-old-when-theyre-discarded-pv-expert-says-retirement-fee-could-fix-this/>

"One of Australia’s leading solar experts has called for at least some of the
cost of a mandatory national panel recycling scheme to be paid by end-users,
including rooftop solar households, in a bid to prevent PV modules from being

Planet Linux Australia — Social housing tenants to get coordinated rooftop PV and home batteries in first urban renewable zone

&lt;https://reneweconomy.com.au/social-housing-tenants-to-get-coordinated-rooftop-pv-and-home-batteries-in-first-urban-renewable-zone/>

"The Illawarra, site of Australia’s first urban renewable energy zone, will
play host to an $11 million pilot program to demonstrate how social housing
tenants can secure “immediate cost-of-living benefits” through the coordination

Planet Linux Australia — Who’s paying whom? The circular money machine behind the AI boom (or bubble)

&lt;https://theconversation.com/whos-paying-whom-the-circular-money-machine-behind-the-ai-boom-or-bubble-293938>

"Imagine a company that sells you equipment, invests money in your business,
and then rents back what you build with it. It’s your supplier, your investor
and your customer all at once.

Planet Debian — John Goerzen: The Large Project Bias of CVEs

I recently discovered some vulnerabilities in C-Kermit, one dating back to 1984. I tried to do the reasonable thing: create advisories with CVEs.

That turns out to be pretty difficult for a small independent project.

Large projects have a way to self-assign CVE IDs. They are their own CVE Numbering Authority (CNA). There is a massive list of CNAs. Just looking at the first page of results, I see everyone from Airbus to 9front (the niche Plan 9 OS). The OpenKermit project is not a CNA.

If you’re a CNA, you can create and publish CVEs on your schedule. There is apparently no external review process. You can wait for months, or publish immediately.

If you’re not a CNA, you have to find someone that is. The general ones that are CNAs appear to be Github and MITRE.

Since C-Kermit is hosted on Github, I thought I would go that route. I followed the documented procedure: created Github security advisories for C-Kermit, then clicked the request CVE button for each. The documentation states they will typically review within 72 hours.

It’s been a week and a half and no sign of a review yet. Apparently the real review time is more than a month.

The other option for projects without a CNA is via MITRE. You have to use a strange and often broken web form, logging in with either Google or Gitlab. (It seems to be broken on Firefox). Then you submit your request and wait.

How long do you wait on MITRE? It seems it could be anywhere from a day to several months.

The first CVE I obtained for C-Kermit was CVE-2025-68920. At the time, I had not yet started the OpenKermit project. That issue was found and fixed in the context of my work maintaining C-Kermit for Debian, and Debian is a CNA.

These were discovered while wearing my “upstream C-Kermit maintainer” hat. I’m sure I could ask Debian for CVEs again, but that seems a bit cheating; not everyone that maintains a FLOSS project will have connections with a distro like I do.

There are a lot of components of a modern OS and Internet ecosystem that are small projects without a large institution behind them.

This bias towards large organizations when it comes to communicating security problems benefits nobody. It doesn’t benefit users, and only serves to discourage timely communication. Not everyone is as persistent as I am, and when it is made so difficult to make announcements — which seem to go into a giant black hole — it’s easy to say, “why bother?”

By Microsoft’s own admission, they are under-funding their CVE process on Github (which may also be poorly-designed). They blame it on increasing load due to LLMs — a problem they helped create and predicted! Having a fiction about being able to communicate a security issue in a reasonable time is worse than not offering the path at all.

Linux was once a student’s experiment. Let’s not pretend that quality only matters from large projects.

Planet Linux Australia Continuations 2026/45: Non-stop

  • Adam landed his SQL migration support and also landed the docs for it too, and as part of that, created the new space in our site repo for the rest of our 3.1 docs. Thanks Adam!

  • Sean came back with some thoughts on his earlier SQLite work, which was enough for me to go ahead and land it. Now we expose read-only vs read-write SQLite pragmas from Hanami DB, and apply SQLite pragma defaults when Hanami sets up the connection. Thanks Sean!

  • I’ve been feeling the pinch from spinning all these plates, so I also started work on a personal TUI tool to surface where I should be looking across all of Hanakai’s recent issues and PRs, to make it easier to spin up new worktrees to do work, and most importantly, to keep track of what’s still in flight and waiting for me to finish. Looking forward to giving it a try this coming week.

Cryptogram New OpenSSH Vulnerability

It’s a bad one, and it’s been in the code for a decade:

A newly disclosed flaw involving OpenSSH and musl, dubbed “*sshole,” allows attackers to log in to certain Alpine Linux and other musl-based Linux accounts configured to block password authentication simply by entering an oversized password.

“Oversized” means longer than 256 bytes. Details.

Slashdot thread. And another news article.

Planet Linux Australia — Who needs a golden ticket? The race to future-proof chocolate

&lt;https://www.positive.news/society/who-needs-a-golden-ticket-the-race-to-future-proof-chocolate/>

"Move over Willy Wonka, cool your jets Cadbury – there’s a new confectionery
whizz in town. Her name is Maha Khan and she’s made a chocolate bar entirely
from British-grown ingredients, right down to the cocoa beans themselves.

Planet Linux Australia — How bionic eyes are becoming a reality

&lt;https://theconversation.com/how-bionic-eyes-are-becoming-a-reality-290270>

"If you’ve delved into the worlds of Star Trek, The Terminator or William
Gibson’s cyberpunk novel Neuromancer, you’ll know that enhanced, electronic
vision is a staple of science fiction. Now, what was once futuristic fiction is

Planet Debian — Vasudev Kamath: Experiment: Debian Cloud/VM Images using mkosi

Debian's Cloud Images for various public cloud platforms and VM environments are built using a tool called debian-cloud-images, an in-house utility developed and maintained by the Debian Cloud Team.

What?

The debian-cloud-images tooling uses FAI (Fully Automatic Installation) to create custom VM images for public clouds like GCP, Azure, and AWS, along with the genericcloud class. I wanted to convert this into a fully declarative, mkosi-based image build where the entire image is described using INI-format configuration files, with only a few post-installation scripts to handle final customizations.

Why?

I've been working with various image customization formats for a long time. In my previous company, I used to build customized industrial PC distributions based purely on Debian using multistrap and a bunch of shell scripts to stitch together raw image creation, bootloader installation, etc. I've also done custom installs using debootstrap on my own laptop with systemd-boot as the bootloader, but that was mostly hand-crafted and not automated. Once I came across mkosi, I was impressed by how a single utility can do everything and churn out a fully usable image without extra glue scripts for partitioning and image creation. You still need a few scripts to finalize some parts of the installation (via postinst hooks), but those are very minimal.

So I decided: why not convert debian-cloud-images into mkosi's declarative format with a few architectural changes? My requirements were:

  1. Btrfs as the root filesystem: Partly because I like it, but primarily for the ability to use transparent compression (zstd:1), subvolumes, and snapshots for atomic rollbacks when things go wrong.

  2. systemd-boot and Unified Kernel Images (UKI): Primarily because systemd-boot is clean and minimal—exactly what a modern bootloader should be. Combining it with UKIs and UEFI Secure Boot is bliss compared to the complexity of the GRUB2 world.

    Note: This intentionally drops legacy BIOS (MBR/CSM) partitioning support in favor of pure UEFI. Modern cloud platforms (AWS Nitro, Azure Gen2, GCP) support UEFI natively, and dropping BIOS allows shedding significant legacy bootloader baggage—though it does make these images unsuitable for older, non-UEFI hypervisors.

Implementation

Of course, the initial heavy lifting was done mostly using Antigravity (agy), along with debugging, tuning, and cleanup from my side. I pointed agy to a local copy of debian-cloud-images and laid out my requirements: preserve parity with the original packages and configurations, while enabling selective builds for each cloud via modular profiles. The resulting specification is documented here.

The repository also includes a verification script that audits functional parity against official images produced by debian-cloud-images (verifying packages, APT deb822 sources, and systemd services, while accounting for the switch to Btrfs and systemd-boot). Initial verification was performed for all Trixie profiles, and the parity report is published here.

I've also booted the genericcloud profile image under UEFI in a local VM to verify live bootability, bootctl status, network connectivity, and APT repository setup. This completes Phase 1 of the implementation. The remaining phases outlined in the specification include:

  1. Phase 2: Immutable Images with dm-verity: Configure Verity=hash in systemd-repart's 10-root.conf. Enable mkosi auto-signing for the verity root hash and pass the root hash into UKI kernel command lines automatically.
  2. Phase 3: Secure Boot & Signed UKIs: Integrate SecureBoot=yes with custom owner keys or ShimBootloader=signed using Microsoft Third-Party CA signed shim binaries.
  3. Phase 4: System Extensions (systemd-sysext): Decouple cloud vendor agents (AWS CLI, Azure waagent, GCP guest agent) into separate .raw system extensions. Maintain a single unified, signed base OS image across all cloud platforms.
  4. Phase 5: Btrfs Automated Rollbacks: Combine Btrfs @snapshots with systemd-boot snapshot boot entries for fail-safe OS upgrades.

Another advantage of this setup is that the same tooling can build images for physical laptops and bare-metal servers. For example, in an earlier post, I walked through live-booting with debootstrap and manually configuring systemd-boot for a custom UEFI installation. With mkosi, I can simply generate a customized image locally with UKIs ready to go, live-boot the target machine, and write the image directly to the root disk.

Conclusion

This experiment is an exploration of the power of mkosi; I haven't discussed adoption with the Debian Cloud Team yet. For now, this will continue as my pet project. While I won't be hosting pre-built binary images, anyone interested is welcome to clone the repository and build the images locally.

I will probably take some more time before tackling dm-verity images, as I want to understand the nuances thoroughly before experimenting with them. Until then, happy hacking! Please report any issues or suggestions on GitHub.

Worse Than Failure — CodeSOD: Plenty of IDs

Venkat joined a new team in the middle of a big refactoring effort. The code was quite a mess, glued together by long Python scripts with main functions longer than a Tolstoy novel. It was this effort to clean up the code into neat modules that highlighted some logical issues with their implementation.

 def generate_random_number():
 """ Generate a 5 digit random number.
 """
    return "".join(map(str, random.sample(range(0,10),5)))

The script this function comes from is a launcher script that provisions a VM to execute code. The VM needs a unique identifier, and we get that random number this way.

The random.sample function, in Python, samples a population without replacement. So here, we pass it a range of 0-10 (which is 0-9 inclusive), and ask for five random entries from it. Again, without replacement, so a range that could concievably contain up to 100,000 possible values is significantly constrained down to 30,000 or so- only the numbers less than 100,000 that contain no duplicate digits.

We then map the resulting array into an array of strings, then join that into a final output string.

Now, for most of us, I do suspect that 30,240 unique values is probably enough for how ever many VMs we might need to reserve at any one time; if you're not working for Amazon or Google or whatever, you're probably fine. Then again, the chances of an accidental collision are surprisingly high: after only 26 requests, there's a 1% chance of a collision. And thanks to the birthday problem, it takes 206 requests to get to a 50% chance of collision. So maybe 30,240 is not enough for anybody.

[Advertisement] Plan Your .NET 9 Migration with Confidence
Your journey to .NET 9 is more than just one decision.Avoid migration migraines with the advice in this free guide. Download Free Guide Now!

Planet Debian — Utkarsh Gupta: FOSS Activities in October 2026

Here’s my monthly but brief update about the activities I’ve done in the FOSS world.

Debian

Whilst I didn’t have much time, here are still a few things that I worked on:

  • Sponsored ubuntu-dev-tools/0.215 for Florent ‘Skia’ Jacquet, so that seeded-in-ubuntu no longer crashes when distro-info-data is outdated.
  • Assisted a few folks in getting their patches submitted via Salsa.
  • Mentoring for newcomers.
  • Moderation of -project mailing list.

Ubuntu

I joined Canonical to work on Ubuntu full-time back in February 2021.

  • Released Ubuntu 26.10 (Stonking Stingray)! With my Release team hat on, I:
  • Approved the FFe for adsys 0.17.0, as it isn’t seeded.
  • Sponsored libp11/0.4.12-1.1ubuntu2 for Guruprasad, an SRU to Noble which drops the workaround from the previous SRU that broke EAP-TLS Wi-Fi with TPM-backed PKCS#11 keys (LP: #2163152).
  • Proposed a fix for net-tools’ FTBFS in stonking - Linux 7.1 removed the amateur radio subsystem along with <linux/rose.h>, so ROSE support has to go: (MP).
  • Reviewed quite a lot of MPs and PRs - britney hints, ubuntu-cdimage, livecd-rootfs, ubuntu-seeds, ubuntu-dev-tools, a bunch of 26.10 release notes, and so on.
  • Did Archive Admin, DMB, and Release team duties as usual.

Debian (E)LTS

This month I have worked 3.50 hours on Debian Long Term Support (LTS) and on its sister Extended LTS project and did the following things:

Work in Progress

  • libpng1.6: Use-after-free of zlib input in png_read_end() after incomplete zTXt, iTXt, or iCCP decompression (CVE-2026-46675).
    • [ELTS]: The patch is ready but couldn’t finish testing this month. The upstream fix that went into bookworm via DLA 4824-1 applies to all three ELTS suites as-is. Will roll out the fix in November.

Other Activities

  • [E/LTS] Monitored discussions on mailing lists, IRC, and all the documentation updates.
  • [E/LTS] Couldn’t make it to the monthly LTS meeting live, but left my thoughts in the meeting notes on Beuc’s proposal of offering help to the Release team with reviewing security SPUs - +1 for trying, as long as the Release team is on board with it and we don’t end up doing the same work twice.

Until next time.
:wq for today.

365 Tomorrows — Bottom Feeder

Author: Majoki It had worked on every other world we’d ever infiltrated and subverted. Such a simple plan to execute. To take control of any lifeform on any planet, use the most fundamental process of life: feeding. So simple. So basic. No matter what energy source a lifeform needed, it had to first take in […]

The post Bottom Feeder appeared first on 365tomorrows.

,

Planet Debian — Amin Bandali: EmacsConf 2026 community panel - my comments

This is a recollection of my comments from the EmacsConf 2026 community panel recording session this past weekend, where the panellists took turns answering the proposed questions, one minute per question per panellist.

In addition to the live Q&A session planned for Saturday 12 December 2026 during EmacsConf 2026, all Emacs users and community members are invited to share their thoughts on the panel questions or other questions before or after the conference.

https://emacsconf.org/2026/talks/community/


1. What made you start using Emacs, and what kept you using it?

I started using Emacs during my bachelor's studies. I actually learned about Vim first and was a Vim user, but I'd always found the configuration language (VimScript) a little bit clunky. Not long after, I discovered Emacs, and really loved reading and writing Emacs Lisp, so I stuck around.

In addition to reading and writing Elisp being fun and enjoyable for me, I love that Emacs has been a practical embodiment of software freedom, and I'm really fond of its surrounding culture of sharing freely. There's a lot to love and appreciate about Emacs, but as a practical personal example, I've been grateful for its excellent support for bidirectional text editing. It has empowered me to read and write in Persian, my mother tongue, with ease. (Persian has a right-to-left alphabet, like Arabic and Hebrew.)

2. What took you from using Emacs to actively contributing to the community - participating in forums, writing Elisp, organizing meetups, answering questions?

As I continued experimenting and writing bits and pieces of Elisp to scratch my own itches, I felt compelled to share them freely as a way of giving back to the community that gave me so much.

For me, the community and the people that make it up are the main deal. Emacs wouldn't be where it is and what it is today without its people, so besides programming contributions, I've tried to contribute in that area as well, for instance by reviving EmacsConf with Sacha Chua back in 2019.

3. How does Emacs show up for you in real life - colleagues, meetups, friends? How did those connections form?

I don't physically have people near me who use Emacs, but I've connected with many folks in our online communities, often starting with an email or IRC message. Some of those relationships started as acquaintanceship and were developed into true friendship over time, and I'm grateful to have had those friends with me.

4. If you know other software communities, what's one thing Emacs could learn from them?

I would encourage Emacs, our community, to focus on the people. We're living in particularly difficult times, with various kinds of hardships and uncertainty in our lives. Let's strive to treat each other with kindness, empathy, and mindfulness as we continue working together.

There are great examples of other free software communities whose members have banded together and are strengthening each other and their community, as well as cautionary ones where community members have been tiring and driving out their fellow members. We could learn valuable lessons from both in how to take care of our people and ourselves.

5. What's one concrete thing you wish existed in the Emacs community a year from now?

I echoed the sentiments of my fellow panellists Prot and Til about doing more of the same in terms of continuing to uphold the standards of excellence and perseverance. Also, drawing inspiration from what bashbunni said, to lower the barriers of entry for people, for example through organizing different kinds of events, and experimenting with ways to make people's lengthy, elaborate Emacs configurations more tangible and accessible to others, to share various workflows and demonstrate what's possible with Emacs.

I look forward to your thoughts on these and other community-related questions.

Take care, and so long for now.

Planet Debian — Vincent Bernat: Performance evolution of route lookup on Linux

In previous articles, I explained how the Linux kernel implements IPv4 and IPv6 routing tables, and I showed the performance improvement of route lookups from Linux 2.6.32 to 4.16 for IPv4—including the impact of the Meltdown and Spectre mitigations—as well as from Linux 2.6.39 to 4.18 for IPv6. This article updates the numbers through Linux 7.3 and investigates the perpetrator responsible for the performance regressions! 🕵��♂�

I ran the following benchmarks on an AMD EPYC 8024P, a Zen 4c CPU, rented from Scaleway, running at 2.4 GHz with CPU boost disabled. I compiled the kernels with GCC 10.2: this version can compile older kernels as well as the current ones.

IPv6

Performance evolution of IPv6 route lookups from Linux 4.14 to 7.3
Performance evolution of IPv6 route lookups. Versions with an asterisk have SRSO mitigation disabled.

I tested four scenarios:

  • a recent full view with about 260,000 prefixes,
  • a full view from 2017 with about 40,000 prefixes,
  • a set of 40,000 /48 prefixes, such that 2 lookups out of 3 match, and
  • a set of 40,000 random /128 prefixes, such that 1 lookup out of 400 matches.

In Linux 4.15, Wei Wang improved the lookup performance by replacing the read-write lock with an RCU and a spinlock in commit 66f5d6ce53e6. In Linux 4.18, David Ahern improved the data structures used by route lookup. In Linux 5.9, Brian Vazquez removed expensive indirect calls in commit 55cced4f813b.

The major 200 ns regression introduced in Linux 6.5 wiped out all these improvements. This version implements a mitigation for "Speculative Return Stack Overflow," a vulnerability affecting AMD processors, in commit fb3bd914b3ec. This mitigation adds about 20 cycles on each function return. It was backported to older kernels (5.10, 5.15, 6.1, and 6.4). To keep the results legible, I disabled the mitigation for these versions with spec_rstack_overflow=off on the kernel command-line.

You can check the vulnerabilities impacting your CPU and their mitigations with lscpu. Some mitigations may depend on the microcode or on the firmware.1

$ lscpu | grep '^Vuln'
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Mitigation; Safe RET
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; usercopy/swapgs barriers and __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; Retpolines; IBPB conditional; IBRS_FW; STIBP always-on; RSB filling; PBRSB-eIBRS Not affected; BHI Not affected
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Vulnerable: Clear CPU buffers attempted, no microcode
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Mitigation; IBPB before exit to userspace

IPv4

Performance evolution of IPv4 route lookups from Linux 4.14 to 7.3
Performance evolution of IPv4 route lookups. Versions with an asterisk have SRSO mitigation disabled.

I tested three scenarios:

  • a recent full view with more than 1,000,000 prefixes,
  • a subset of a full view from 2017 with 500,000 prefixes, and
  • a set of 500,000 contiguous /32 prefixes.

The 30 ns impact of the mitigation for SRSO in Linux 6.5 is smaller than for IPv6 because IPv4 route lookups traverse fewer functions: around 4 function calls for IPv4 compared to 25 for IPv6.

In Linux 5.11, I introduced a regression in commit c0c5a60f0f13 after fixing the behavior of net.ipv4.conf.all.ignore_routes_with_linkdown!2 As a result, the ip_ignore_linkdown() function spends around 5 additional cycles to return a result as it needs to follow three additional pointers. fib_lookup() eventually calls it in the following code:

if (ip_ignore_linkdown(nhc->nhc_dev) &&
    nhc->nhc_flags & RTNH_F_LINKDOWN &&
    !(fib_flags & FIB_LOOKUP_IGNORE_LINKSTATE))
    return false;

If we reorder the conditions, we avoid calling ip_ignore_linkdown() for the most common case where the link isn't down:

if (nhc->nhc_flags & RTNH_F_LINKDOWN &&
    !(fib_flags & FIB_LOOKUP_IGNORE_LINKSTATE) &&
    ip_ignore_linkdown(nhc->nhc_dev))
    return false;

Here's the distribution of lookup times before applying the patch on top of net-next:3

min=128 max=4657 count=994104 95th=134 90th=133 50th=132 mad=0
    value │                         ┊                            count
      128 │                                                        120
      129 │                                                       2232
      130 │▒                                                     25224
      131 │▒▒▒▒▒▒▒▒▒▒▒▒▒░                                       264264
      132 │▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░░░░░░░░░░░░░░             516480
      133 │▒▒▒▒▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░      126864
      134 │▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░      21624

The lighter shade depicts the cumulative distribution function. After applying the patch, the median improved from 132 to 126 cycles:4

min=124 max=208839 count=994104 95th=128 90th=127 50th=126 mad=0
    value │                         ┊                            count
      124 │                                                        576
      125 │▒▒                                                    49440
      126 │▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░                      584904
      127 │▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░       284592
      128 │▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░      45288

Impact of mitigations

To reduce the impact of mitigations, you can disable all of them with mitigations=off, disable only a specific one like with spec_rstack_overflow=off, or protect against only some attack vectors with mitigations=auto,no_user_kernel, starting from Linux 6.17.

The impact is also quite different depending on the CPU. For example, on a Xeon W-2295, an Intel desktop CPU from 2020, the impact of the mitigations is only a few cycles for IPv4, and less than 3% for IPv6. The main contributor is the mitigation for the Indirect Target Selection vulnerability, which is fixed since the Sapphire Rapids architecture.


If we set aside the regressions introduced by the mitigations against CPU attacks, the performance of IPv4 is declining slowly over time while IPv6 has improved in the past and is currently stable. If routing performance is important, you have several options: choose a different CPU like an AMD Zen 5 CPU, a fourth generation Xeon CPU, or maybe an ARM Neoverse V2; disable some or all the mitigations; bypass routing with XDP/eBPF;5 or offload routing to the network card.

Note

Maytham Alsudany reviewed a first draft of this article. Any errors are still mine!


  1. The microcode was out of date on my machine as I forgot to install the amd64-microcode package. As it only impacts TSA, our benchmark is unaffected. Spectre v2 mitigation did not enable automatic IBRS, because of SEV-SNP being enabled in the firmware. With automatic IBRS, the impact of SRSO should be smaller. ↩

  2. Despite ipvX in its title, the commit only changes the behavior of the IPv4 code. The IPv6 version overwrites the value of each device in addrconf_fixup_linkdown(). ↩

  3. Linux 7.5 will be the first stable release including this fix. ↩

  4. At 2.4 GHz, one cycle is about 0.42 ns. ↩

  5. This requires avoiding bpf_fib_lookup(), which relies on the same kernel lookup. ↩

Planet Debian — Thorsten Alteholz: My Debian Activities in October 2026

Debian LTS/ELTS

This was my hundred-forty-eighth month that I did some work for the Debian LTS initiative, started by Raphael Hertzog at Freexian.

During my allocated time I uploaded or worked on:

  • [DLA 4825-1] suricata-update security update to fix one CVE in Bookworm related to a path traversal attack. Thanks a lot to Andreas Dolp, who prepared the package.
  • [DLA 4857-1] caddy security update to fix nine CVEs in Bookworm related to the bypass of path- or host-based access controls, the execution of an unintended file by a FastCGI backend, the injection of identity headers trusted by applications running behind Caddy, unauthorised reconfiguration of the server through its admin API, or cross-site scripting.
  • [DLA 4870-1] antiword security update to fix several isssue in Bookworm related to heap out-of-bounds write in several parts of the software or integer divide by zero. Unfortunately no issue has been assigned a CVE id yet.
  • [DLA 4871-1] cyrus-sasl2 security update to fix one CVE in Bookworm related to a heap-based buffer overflow.
  • [ELA-1873-1] antiword security update to fix several isssue in Stretch, Buster and Bullseye related to heap out-of-bounds write in several parts of the software or integer divide by zero. Unfortunately no issue has been assigned a CVE id yet.
  • [ELA-1874-1] cyrus-sasl2 security update to fix one CVE in Stretch, Buster and Bullseye related to a heap-based buffer overflow.
  • [ELA-1875-1] libcaca security update to fix two CVEs in Buster related to a missing overflow check.
  • [ELA-1876-1] libcaca security update to fix one CVE in Stretch and Bullseye related to a missing overflow check.
  • [osmo-bsc] upload to unstable to fix one CVE related to a heap based buffer overflow.

Besides doing these uploads, I reviewed the libssh upload (DLA-4844-1) and helped a bit in the background of the php uploads. Last but not least I spend some time on security-master to assist others (especially the kernel team) with uploads to Bookworm and Bullseye.

Debian Printing

This month I uploaded a new upstream version or a bugfix version of:

  • … cups to unstable, to finally fix autopkgtest.

This work is generously funded by Freexian!

Debian Lomiri

This month I uploaded a new package vendor-ubuntu-touch to be able to build packages differently in an UbuntuTouch environment. I am curious when it will leave NEW. I also tried to finish two new applications.

This work has been generously funded by Fre(i)e Software GmbH!

Debian Astro

This month I uploaded a new upstream version or a bugfix version of:

  • … calceph to unstable (sponsored upload)
  • … alfa to unstable (sponsored upload).

Debian IoT

Unfortunately I had no time to work in this category this month.

Debian Mobcom

This month I uploaded a new upstream version or a bugfix version of:

misc

This month I uploaded a new upstream version of:

Due to different reasons I started to tidy up the list of packages I maintain. Some packages have been removed, some packages lost myself as uploader and some packages have been orphaned. The number of orphaned packages is about 1100 now, so maybe you can find one to adopt.

Planet Linux Australia — In 2018, a Karnataka woman brought 14 others together to save disappearing traditional crop seeds; eight years later, their work spans 30 villages and they have been selected for a national award worth Rs 10 lakh

&lt;https://timesofindia.indiatimes.com/life-style/people/in-2018-a-karnataka-woman-brought-14-others-together-to-save-disappearing-traditional-crop-seeds-eight-years-later-their-work-spans-30-villages-and-they-have-been-selected-for-a-national-award-worth-rs-10-lakh/articleshow/135601913.cms>

"In 2018, Bibijaan Maulasaab Halemani brought together 14 women from her
village in Karnataka with a common goal: to save traditional crop seeds that
were disappearing from local farms. Eight years later, the small women's

Planet Linux Australia — Conservation parks don’t have to be vast – as one tiny grasshopper reminds us

&lt;https://theconversation.com/conservation-parks-dont-have-to-be-vast-as-one-tiny-grasshopper-reminds-us-293110>

"A vast stretch of land where animals roam widely and plants grow freely.
That’s what most people would picture if they thought of a conservation area.

Planet Linux Australia — Saffron is the world's most expensive spice. Now this 'red gold' is in crisis in Kashmir

&lt;https://www.bbc.com/future/article/20261105-kashmiri-saffron-why-the-worlds-most-expensive-spice-is-disappearing>

“The shopkeeper in Srinagar hesitated before showing me the saffron.

Tourists drifted through the old Kashmiri city's open-air market while he

Planet Linux Australia — Coating made from renewable plant-based materials could simplify recycling while reducing exposure to microplastics

&lt;https://phys.org/news/2026-11-coating-renewable-based-materials-recycling.html>

“The lining in traditional disposable coffee cups can release plastic particles
and be difficult to recycle, but a new plant-based coating can eliminate these
issues with your morning brew.

Planet Linux Australia — 2026-11-04 Council Meeting Minutes

1. Meeting overview and key information

Present

  • Joel Addison (President)
  • Neill Cox (Vice-President)
  • Russell Stuart (Treasurer)
  • Jonathan Woithe (Secretary)
  • Elena Williams (Council)  from 21:00
  • Harrison Oates (Council)
  • Miles Goodhew (Council)

Apologies 

  • None

Not Present

  • None

Meeting opened at 20:04 AEDT (UT+1100) by Joel  and quorum was achieved.

Minutes taken by Jonathan.

2. Log of correspondence

  • [LACTTE] From the Auditor and Russell, 22 Oct 2026: Auditor engagement arrangements
  • [LACTTE] From Tom Farley, 22 Oct 2026: Membership form problem. Joel has responded. Tom also foreshadowed a grant application, but the membership form issue is blocking that because he isn’t a member yet.
  • [LACTTE] From Yifei Zhan, 23 Oct 2026: Reporting the WordFence block of the login page. This was a side effect of the temporary mitigation put in place for the PHP vulnerabilities which emerged on 21 Oct 2026.  Jonathan has responded.
  • [LACTTE] From Steven (from Aurum Field), 23 Oct 2026: Grant program eligibility questions. Jonathan has responded. The original email reads like it was sent by someone who is not involved in the Open Source community and is seeking opportunistic funding.
  • [LACTTE] From Jack Skinner, 23 Oct 2026: Following up questions raised in the last subcommittee meeting. Jonathan and Joel have responded.
  • [LACTTE] From Terry Dawson, 23 Oct 2026: Sending information requested by Russell.
  • [LACTTE] From Tom Farley, 24 Oct 2026: Reporting problems submitting a membership application via the website form. The email also included the text of a grant application, although previous correspondence made it clear that applications should be made via the website.
  • [LACTTE] From Michael Richardson, 25 Oct 2026: DrupalCon Licence Fee. Russell has arranged payment and responded.
  • [LACTTE] From ASIC, 25 Oct 2026: The “Open Source Australia” business name is due for renewal.
  • [LACTTE] From Julia Topliss, 25 Oct 2026: Sponsorship transfer request. This was completed.
  • [LACTTE] From Julia Topliss, 25 Oct 2026: DrupalSouth updates, election results, planning transition to new committee members.
  • [LACTTE] From ASIC, 25 Oct 2026: “Open Source Australia” business name was successfully renewed.
  • [LACTTE] From Julia Topliss and Russell Stuart, 25 Oct 2026: Discussion about reconciliation of DrupalSouth Community Day accounts.
  • [LACTTE] From Digital Pacific, 25 Oct 2026: Domain renewal order confirmation for linux.org.au.
  • [LACTTE] From Digital Pacific, 25 Oct 2026: Domain renewal payment confirmation for linux.org.au.
  • [LACTTE] From Dr Darryl Gauld OAM, 26 Oct 2026: Requested a link to the grants program because he couldn’t find it on the website. Joel has responded.
  • [LACTTE] From Michael Richardson, 26 Oct 2026: Tidying loose ends from DrupalCon Nara.
  • [LACTTE] From Dr Darryl Gauld OAM, 27 Oct 2026: Acknowledging Joel’s email.
  • [LACTTE] From Sony Bonag, 27 Oct 2026: Jul-Sep 2026 BAS
  • [LACTTE] From Michael Richardson, 28 Oct 2026: DA have confirmed licence fee transaction. DrupalCon Nara is now wrapped.
  • [LACTTE] From Margery Tongway, 28-29 Oct 2026: Ongoing DrupalSouth Community Day reconciliation discussion. Russell is handling this.
  • [LACTTE] From Jonathan Morel, 29 Oct 2026: Questions about grant funding for open components of potentially closed source platforms. Jonathan has responded.
  • [LACTTE] From Justin Chiam, 29 Oct 2026: Affiliation Enquiry from Linux Society UNSW.
  • [LACTTE] From Amazon Web Services, 1 Nov 2026: New charges.
  • [LACTTE] From Julia Topliss, 1 Nov 2026: Notification of new DrupalSouth Committee.
  • [LACTTE] From Si Hobbs, 2 Nov 2026: Confirmation of Westpac ID.
  • [LACTTE] From Guoyi Zhang, 2 Nov 2026: Preliminary Willi26 grant report. Jonathan has responded.
  • [LACTTE] From Amanda Hogan, 2 Nov 2026: Discussion about PyConAU. Jonathan has responded.
  • [LACTTE] From Jonathan Oxer, 2 Nov 2026: Concerns over membership form breakage and delays to membership approvals. Jonathan has responded.
  • [LACTTE] From “jayos00001”, 2 Nov 2026: Grant enquiry about funding code developed by AI systems, and licensing questions. Joel has responded. “Jayos00001” followed up on 3 Nov 2026 asking whether a proposed grant application (the nature of which was not overly clear) would be acceptable.
  • [LACTTE] From Matthew Campbell, 2 Nov 2026: Enquiry about seeking developer assistance and information about open source licences.  Joel has responded.
  • [LACTTE] From Nathan Morrow, 4 Nov 2026: Joomla Australia update for meeting.

3. Subcommittee reviews

Drupal Subcommittee 8:05 pm – Julia Topliss

Most of the new committee was in attendance tonight. Joel welcomed them.

Russell to sort out a Stripe account for DS Gold Coast 2027.

Russell raised some audit-related points which will be followed up.

Joel thanked Julia and Marge for their work over the last few years.

Everything Open 8:25pm – Fraser

Registrations are down on where the team would like to be. More announcements are coming though, so hopefully this will push registrations along.

The CFP closed strongly: 3x submissions received. Acceptances were sent last week with the sending of rejections now in progress. Two thirds of acceptances have been confirmed. The program will be released once acceptances are almost complete.

Social media engagement will be picking up. There is a dedicated person to look after this.

Sponsorships: 83k committed, 43k paid. Additional discussions are in progress.

Five keynotes are locked in. Most are from Australia/NZ. Costs of these are in hand.

DDD is coming up in a few weeks. EO’s sponsorship of this event will give visibility. Discount codes will be made available to DDD attendees.

Dinner and catering is on track.

A quote has been sought for AV recording. It will be evaluated in line with sponsorship levels achieved. Since this was not in the approved budget the quote cannot be accepted until it is reviewed by the LA council.

There is a possibility of running a raffle. Fraser will clarify the requirements under Queensland law. It is not expected to be a problem.

Admin Team 8:25 pm

The past week has been mainly all about security patching. An unusually large number needed dealing with in a short period of time.

Updates are in progress for the LA website. To provide protection while an updated host was prepared, the site was moved behind a proxy with most form activity blocked. Breakages were expected, but this was considered better than a site compromise. It has since been discovered that the membership application form and the grant form have been broken by this. Further work has not been possible due to work commitments. It is expected that time will be available to resume the work at the end of this week or the start of next week. The form functionality will possibly be fixed by the end of next week.

The admin team budget is still to be reviewed. There was a tentative plan to scope some new hardware purchases, but this will not happen now due to the outrageous prices.

Joomla Subcommittee 8:35 pm – Nathan Morrow

Budget status (if applicable):

No budget updates this month.

Key achievements:

Have started reviewing the conference set up again this month and importantly have identified a new venue which will either be considerably cheaper or even free with an in-kind venue sponsorship, which would alleviate a few budgetary concerns. Expected timing is October 2027.

Any concerns?

Not at this stage

How can LA assist?

Nothing at the moment.

WordPress 8:40 pm – Wil Brown

No report.

Flounder 8:40 pm – Russell Coker, Yifei Zhan

No report.

4. Items for discussion

Services used by DrupalSouth that LA could pay for 

Julia has requested the following service payments be covered by Linux Australia:

  • Google Apps
  • Bitwarden
  • Domain Name registration
  • Xero account
  • MailChimp

These payments have previously been paid by DrupalSouth committee members.

These look reasonable. If DrupalSouth can put this into a steering committee budget, LA can then work with Julia and Si to make this happen. Joel will follow up to get the process started.

Affiliation enquiry from Linux Society UNSW

JC emailed Council on 29 Oct 2026 to ask about possible options for affiliation with LA.

The concept is worth pursuing. Joel will follow up to determine some more details about what they have in mind.

Proof of business address for Wise

The relevant documentation has been obtained. However, as of 25 Oct 2026, Russell can no longer see the “proof of business address” request on the Wise website. Russell has asked Jack if he can still see it. This issue is likely on hold until it becomes visible for Russell.

PyCon AU

There are people interested in running a future PyCon AU. Council will discuss this further with interested parties to determine a course of action.

Non-functional forms on the website

Since the functionality of the membership and grant application forms will only be restored by late next week, a note should be added to both to let people know this. Jonathan will see to this.

5. Items for noting

New DrupalSouth committee

Julia Topliss has notified Linux Australia of DrupalSouth’s new committee:

  • Chair: Vladimir Roukakov
  • Secretary: Quinn Hart
  • Treasurer: Si Hobbs
  • Conference coordinate: Karl Hepworth
  • Committee member: Suchi Garg

6. Other business

  • None.

7. In camera

Two items were discussed in camera.

 


Meeting closed at 21:35 UT+11:00

Next meeting is scheduled for 2026-11-18 at 20:00 AEDT (UT+1100)

The post 2026-11-04 Council Meeting Minutes appeared first on Linux Australia.

Planet Linux Australia — “Too much wind and solar?” The state-wide blackout and the dinner party that changed the course of history

&lt;https://reneweconomy.com.au/too-much-wind-and-solar-the-state-wide-blackout-and-the-dinner-party-that-changed-the-course-of-history/>

"Not long after the dramatic statewide blackout in South Australia in
September, 2016, conservative political types in Australia were hoping for
more.

Planet Linux Australia — What can free‑living Indian street dogs teach us about how to care for pet dogs?

&lt;https://theconversation.com/what-can-free-living-indian-street-dogs-teach-us-about-how-to-care-for-pet-dogs-293553>

"We give our pet dogs shelter, veterinary care, affection, training and play.
We decide when they eat, where they sleep, when they go outside, who they meet,
and how they move through the world.

Cryptogram AI Security

Two weeks ago, I attended the [un]prompted AI security conference in San Francisco. It was an excellent event: three days of very dense talks about all aspects of AI security. (My talk was about integrous AI, and I will post it when it is online.)

AI security can be divided into three broad topics. It’s important for researchers to understand which one they are working on. And it’s important for us as a community to work on them all. They are: security of AI, security with AI, and security from AI. [un]prompted had good talks about all three.

Mike Bowler — Effective leadership and finding a better way

Last week I talked about a situation where a tester had been asked to stop rejecting tickets. In that post, I focused on the beliefs in play. Today, I want to talk about leadership in that same situation.

The team lead was in a difficult spot. On one side was a tester whose job is to find problems before the customer does. On the other were developers who’d been told by their own project manager that rejected tickets were the reason for past layoffs. Whether or not that was true, the threat felt real to them, and so they interpreted every rejection as one more step towards losing their jobs.

There are two obvious answers. Keep rejecting tickets, and the product stays in good shape while the developers work with that threat hanging over them. Stop rejecting tickets, and the developers relax while the bugs head for the customer. The team lead picked the second.

The tester then found something that looked like a middle ground. She closed the rejected tickets and opened new bug tickets instead. The bugs still got reported, just less visibly, and the developers still got the bad news, just in a different wrapper.

Chris Voss, a former FBI hostage negotiator, has a story about exactly this kind of compromise.

“A woman wants her husband to wear black shoes with his suit. But her husband doesn’t want to; he prefers brown shoes. So what do they do? They compromise, they meet halfway. And, you guessed it, he wears one black and one brown shoe. Is this the best outcome? No! In fact, that’s the worst possible outcome. Either of the two other outcomes—black or brown—would be better than the compromise.”
Chris Voss with Tahl Raz, “Never Split the Difference”

The workaround is one black shoe and one brown. The product’s problems are now harder to see, and the developers’ fear is exactly where it was.

So what would a better outcome look like? Not a point halfway between the two positions, but one where the product stays in good shape and nobody loses their job over it. Finding that is the leadership job here, and Voss has some useful tools for it.

The first is what he calls tactical empathy. Before anyone can solve the problem, the developers’ fear needs to be acknowledged rather than argued with. One of his techniques for that is labelling1: naming the emotion you’re seeing, out loud. Something like “it sounds like every rejected ticket feels like a mark against you.” That isn’t agreeing that rejections cause layoffs. It’s showing that you understand why it feels that way.

The second is the calibrated question: an open question, usually starting with “how” or “what,” that invites the other side to help solve the problem instead of defending their position. “How do we keep quality up without putting anyone’s job at risk?” is a very different conversation from either “stop rejecting tickets” or “keep rejecting tickets.” It’s also a question the team lead could take to the project manager, or to the vendor, not just to the team.

The third is what Voss calls Black Swans: hidden pieces of information that change the whole negotiation once they surface. The obvious one to go looking for here is whether something in the vendor contract actually penalizes rejections. If it does, the developers’ fear isn’t irrational at all. It’s pointing at a real problem in the system, and no amount of quiet from the tester was ever going to fix it.

W. Edwards Deming put that more bluntly, in a remark from one of his seminars:

“A bad system will beat a good person every time.”
W. Edwards Deming, 1993 seminar2

The developers weren’t bad people, and neither was the tester. Something in the system was making rejections feel dangerous.

Effective leaders don’t accept poor solutions. They find a better way.

One client I worked with had a contract that required the team to deliver a set number of story points every sprint. Another had a contract that required the team to find a set number of bugs every sprint. Both of these drove dysfunctional behaviour and are textbook examples of Goodhart’s law. Deming is often credited with warning that people whose jobs depend on hitting a target will hit it, even if they have to destroy the organization to do it.

In both cases, when leadership was made aware of the behaviour, they changed the rules that the team had to work within. The story point contract had the reference to points delivered removed entirely. In the bug contract, the threat of not finding enough bugs went away. Nobody met the team halfway on the numbers; leadership removed the thing that had set the team against the work in the first place.

None of this is unique to testers or contracts. Whenever two things we care about seem to be pulling against each other, a compromise is tempting because it feels fair. Fair isn’t the goal, though. The goal is an outcome where both of the things we care about survive, and that usually means finding the part of the system that set them against each other.

Anyone can split the difference. A leader finds the better answer.

  1. Psychologists call this affect labeling: putting a feeling into words reduces its intensity. I’ve written about using it on your own emotions; Voss points it at the person across the table. ↩

  2. The Deming Institute sources this to a February 1993 seminar in Phoenix and notes that the wording varies between accounts: A Bad System Will Beat a Good Person Every Time ↩

Worse Than Failure — CodeSOD: Eventually

We were just discussing TODO comments recently, and that motivated Bernard to send us this representative comment..

  // TODO: This method should ideally be in tax frame work but due to
  // the time constraint I am duplicating the code here.
  // Needs to be refactored. Oct 28, 03.

This comment exists in this codebase, unchanged. It has been there for twenty three years. The refactoring has never happened.

This comment has seen the world change over the last 23 years, as the technology landscape has shifted and changed, grown and contracted. But this comment, this comment is a constant.

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

365 Tomorrows — Hypershooter

Author: Julian Miles, Staff Writer “India 71, eleven o’clock low, predicted bogey.” Here I go again. Rocket boost pins me into my cradle. My ancestors flew head-to-head against the best our planet could field. Now we’re often outclassed by toys both bigger and faster. That’s why the main squadrons run two-seaters: so the co-pilot can […]

The post Hypershooter appeared first on 365tomorrows.

xkcd — Dragonfly

Planet Debian — Reproducible Builds (diffoscope): diffoscope 338 released

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

[ Chris Lamb ]
* Binutils no longer shows the top-level directory; update expected test output.
  (Closes: #1151752)

You find out more by visiting the project homepage.

,

Planet Linux Australia — This economist believes the system is broken. Maybe she has a point

&lt;https://theconversation.com/this-economist-believes-the-system-is-broken-maybe-she-has-a-point-292129>

"Review: The Common Good Economy (A New Compass) – Mariana Mazzucato (Allen
Lane/Penguin)

Planet Linux Australia — Week in wildlife: an autumnal deer, golden jackals and an oily-kneed beetle

Planet Linux Australia — Porsche quietly unveils wireless EV charging

&lt;https://thedriven.io/2026/09/25/porsche-quietly-unveils-wireless-ev-charging/>

"German automaker Porsche has quietly rolled out wireless charging for its
electric vehicles, revealing the introduction “a particularly convenient form
of charging” that the company says will help to simplify everyday life for EV

Planet Linux Australia — Is NZ’s foreign policy ‘realism’ working? Why the next government faces a real choice

&lt;https://theconversation.com/is-nzs-foreign-policy-realism-working-why-the-next-government-faces-a-real-choice-294041>

"The 2026 general election is taking place as the world experiences a
tumultuous transition.

Planet Linux Australia — Deadly fungi are harming Australia’s wild reptiles. This is how to stop the spread

&lt;https://theconversation.com/deadly-fungi-are-harming-australias-wild-reptiles-this-is-how-to-stop-the-spread-293832>

"With spring underway and the weather warming, reptiles are on the move in
suburbs, parks and bushland across Australia. Snake catchers and wildlife
carers are responding to calls for help, and reptile enthusiasts – known as

Planet Linux Australia — Putin’s War on Cities Is Coming Home to Russia

&lt;https://medium.com/@elvirabary/putins-war-on-cities-is-coming-home-to-russia-09d884eb1ad8>

"Putin began this war expecting to defeat Ukraine on the battlefield. That
didn’t happen.

Planet Linux Australia — Driving an EV isn’t harder, it’s just different – and education is the missing piece of the puzzle

&lt;https://thedriven.io/2026/09/25/driving-an-ev-isnt-harder-its-just-different-and-education-is-the-missing-piece-of-the-puzzle/>

"I was a fairly early EV adopter. I set myself some criteria — under $50k, big
enough for a family of four, and more than 400 km range — and made the leap as
soon as a car that met them became available.

Planet Linux Australia — Over 40 years ago, a mystery vigilante released a fungus to control blackberry in Australia. But why?

&lt;https://theconversation.com/over-40-years-ago-a-mystery-vigilante-released-a-fungus-to-control-blackberry-in-australia-but-why-287304>

"Over the summer of 1983–84, a fungus called Phragmidium violaceum was
introduced to Australia. It was done secretly, deliberately and illegally. And
it was done for one purpose: to kill blackberry plants.

Planet Debian — Birger Schacht: Using incus for throw away VMs

For some time now I’ve been looking for a way of keeping projects I’m working on in a separate VM without much setup. There are numerous solutions to do this kind of thing using namespaces (various container technologies, firejail, flatpak, bubblewrap, …) but I wanted something that uses real virtualization. I recently stumbled upon incus and it seemed like it could be a solution to my problem. Incus is a manager for both containers and virtual machines. It is possible to create VM images that can be used as templates, meaning that other machines can then be based on them on creation. Virtual machines can be configured using “profiles”.

For my use case, I have created a profile that defines how my template image should look like. In this profile I use cloud-init to configure the template machine on startup:

config:
  cloud-init.user-data: |
    #cloud-config
    apt:
      conf: |
        APT {
          Install-Recommends 0;
        }
    package_update: true
    package_upgrade: true
    package_reboot_if_required: true
    packages:
      - file
      - man-db
      - bat
      - eza
      - git
      - git-delta
      - neovim
      - zsh
      - tmux
      - curl
      - ncurses-term
      - hx
      - nix-bin
      - nix-setup-systemd
      - rustup
      - npm
      - podman
    users:
      - name: user
        lock_passwd: false
        # mkpasswd 'incus password'
        hashed_passwd: $y$j9T$p9XBP4Ox3SBUnyu.sqv5m1$f1rxcPJyVs05w./dZvIzu6.4dVWBvzu99nMBZRNlamD
        groups: sudo, nix-users
        shell: /usr/bin/zsh
        uid: 1000
    write_files:
      - path: /home/user/.config/nix/nix.conf
        content: |
          experimental-features = nix-command flakes
        permissions: 0600
      - path: /home/user/.zshrc.local
        content: |
          export PATH="$PATH:$HOME/.nix-profile/bin"
        permissions: 0600
    runcmd:
      - [curl, -sSfL, -o, /home/user/.tmux.conf, https://grml.org/console/tmux.conf]
      - [curl, -sSfL, -o, /home/user/.vimrc, https://grml.org/console/vimrc]
      - [curl, -sSfL, -o, /home/user/.zshrc, https://grml.org/console/zshrc]
      - [chown, -R, user:user, /home/user/]    
description: Base template for dev VMs
...

and I use a script to regenerate the template image when I want to adapt the config:

#!/bin/sh

#set -e
set -x

NAME=dev-vm-template

# adapt the profile before rebuilding the template image
incus profile edit cloud-dev-template
incus delete --force ${NAME} || true
incus create images:debian/13/cloud --vm --quiet --profile default --profile cloud-dev-template ${NAME}
incus start ${NAME}
incus wait ${NAME} agent
incus exec ${NAME} -- cloud-init status --wait || true
incus stop ${NAME}
incus publish --alias cloud-dev-template --reuse ${NAME}

This script uses the debian/13/cloud image together with my cloud-dev-template profile to set up a machine, configure it using cloud-init and store the result as an image called cloud-dev-template.

inker

To use this setup, I created a small python tool called inker that talks to the incus REST API. Using inker create creates a new VM based on my template. Using inker attach attaches the current working directory to a VM as a readonly mount. It is possible to combine those commands like inker create | inker attach to do those two steps in one command. inker login logs into the VM that has the current directory attached. This way I can create VMs that are connected to directories on my filesystem.

I am currently playing around with this setup, but I think this could help me to have a throwaway development machine, similar to dev containers. I’m not sure yet how happy I am with incus, though. I was also looking at systemd-vmspawn, but there are still some features missing that I would need. But I might rewrite inker at some point to use a different backend.

365 Tomorrows — The Man in the Ground

Author: Edgar San Martin, Jr. The dead man could still hear. Even as his body lay lifeless in the morgue, his hearing never faded. He had expected Heaven or nothing, but instead found himself blind, paralyzed, and soon to be six feet underground. A few days later, he attended his own funeral. Twenty-four voices gathered […]

The post The Man in the Ground appeared first on 365tomorrows.

,

Planet Debian — Dirk Eddelbuettel: prrd 0.1.0 at CRAN: Now With Real Concurrency

A new release of prrd arrived at CRAN today, and has already been built for r2u and on r-universe. The prrd package facilitates the parallel running [of] reverse dependency [checks] when preparing R packages. It is used extensively for releases I make of Rcpp, RcppArmadillo, RcppEigen, BH, and others.

prrd screenshot image

The key idea of prrd is simple, and described in some more detail on its webpage and its GitHub repo. Reverse dependency checks are an important part of package development that is easily done in a (serial) loop. But these checks are also generally embarassingly parallel as there is no or little interdependency between them (besides maybe shared build depedencies). See the (somewhat dated) screenshot (running six parallel workers, arranged in a split byobu session).

This release updates internals to allow for greater concurrency. SQLite is used as the backend, both for the job queue (managed via the liteq package) as well as for storing actual reverse-dependency test results. It is well-known that SQLite copes quite well with multiple readers. Multiple concurrent writers are more challenging. We tended to get by via BEGIN EXCLUSIVE pragma use, but still get occassional issue even at a somewhat moderate concurrency levels. After some back and forth and trying a few approaches, more recently we established one first solution relying on very explicity (OS-level, filesystem-based) locking via package filelock. That worked.

We mentioned this in an old liteq issue that had circled around the same question with a number of posts over the years, but no resolution. This comment seemingly awoke Gábor, and he nailed this years-open issue with a fine pull request deploying BEGIN IMMEDIATE and well as a loop around tryCatch to not immediately fail. I borrowed/ported that approach to prrd and we now have a second solution (and no longer need filelock). On a somewhat better server with enough cores and memory, I am now running eighteen concurrent workers—watched via three multi-pane byobu windows. Works like a charm without issues. At last! A big thanks to Gábor for finding another solution, and especially that only relies on SQLite.

The release is summarised in the NEWS entry:

Changes in prrd version 0.1.0 (2026-11-07)

  • Concurrent operations are now supported via updated sqlite semantics borrowed with appreciation from liteq

  • This follows an interim solution relying on filelock use; however this later package is not needed so no increase in dependencies

Courtesy of my CRANberries, there is also a diffstat report for this release.

This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. If you like this or other open-source work I do, you can sponsor me at GitHub.

Planet Linux Australia — Rat Boi Founder Alexa Coughlin Wants to Help You Switch from Fast Fashion

&lt;https://www.teenvogue.com/story/rat-boi-founder-alexa-coughlin-wants-you-to-help-you-switch-from-fast-fashion>

"This summer was the first time I put on a Rat Boi top. The corseted tank is
one of the brand’s staple products, prominently featured in several viral
videos over the last two years. Its social media fans tout its unique fit,

Planet Linux Australia — ‘We will not be sacrificed’: Pacific climate voices were clear and strong this week – and we’re listening

&lt;https://theconversation.com/we-will-not-be-sacrificed-pacific-climate-voices-were-clear-and-strong-this-week-and-were-listening-294040>

"Preparatory meetings for the United Nations’ annual climate summit are usually
quiet affairs, focused on laying the political and technical groundwork for the
main COP event. But this year felt very different.

Planet Linux Australia — Warming UK seas could ‘fundamentally reshape marine ecosystems’ – report

&lt;https://www.theguardian.com/environment/2026/nov/05/warming-uk-seas-could-fundamentally-reshape-marine-ecosystems-report>

"Warming seas around the UK and the wider north-east Atlantic could destabilise
marine food webs, weaken ocean health and jeopardise food security by 2050,
according to a four-year study.

Planet Linux Australia — The simple tricks Fortescue is using to convert its fleet of giant diesel haul trucks to full battery electric

&lt;https://thedriven.io/2026/09/25/the-simple-tricks-fortescue-is-using-to-convert-its-fleet-of-giant-diesel-haul-trucks-to-full-battery-electric/>

"How long does it take to charge an electric vehicle? How often do you have to
do it? EV drivers will be familiar with the questions. It’s often posed by
people struggling to get their minds around the transition to electric

Planet Debian — Andrew Cater: Arm Cambridge - Mini-Debconf Cambridge - day 1 20261107

 Half way through the day:

A morning of technical talks:

Vock - Instrumenting, kernel coverage and process tracing

Rebuilding the archive on your desktop

An overview of Secure Boot

An excellent lunch - with thanks to Liv and her Arm catering staff

Three lightning talks - two without slides :)

Excellent day so far :)

Planet Debian — Mike Gabriel: OpenAGPS - The New Kid on the Block

There is a new project coming to Open Source Software land these days: OpenAGPS. It is not yet 100% functional, but we are working on it. It is not fully operational, yet, but we are on it.

Let me introduce OpenAGPS to you...

The Situation Today

The domain of assisted geo location services has been left to a few big tech providers. When using GPS on mobile devices, most of us send info on our approximate device location (based on cell tower IDs seen by our devices around us) mostly to Google's SUPL service in order to facilitate a faster GNSS/GPS lock on the satellites flying above us.

Without assistance, retrieving a GNSS/GPS lock on sufficient satellites includes "finding" those satellites and once found retrieving data (in bytes/sec) from them. In some regions, this leads to waiting periods of up to 45 minutes, before a mobile devices has gained a lock on sufficient satellites (3 or more).

In Assisted-GNSS/GPS, "other" information (such as cell tower IDs) gets used to estimate what GNSS/GPS satellites are currently passing over one's location. With AGPS, the mobile devices retrieve information via a so-called SUPL server, containing two details: a list of potential satellites above and their dataframes. Esp. providing those dataframes over the device's internet connection (and not via the GNSS/GPS receiver downloading it from the satellite itself) speeds up the lock-on process of the mobile tremendously (several seconds to a few minutes).

However, for this mechanism to work, your device will share your IMSI (although not needed for AGPS), a list of cell towers around you and their signal strengths with the provider of the SUPL service, revealing your approximate position. In total, this allows SUPL providers to re-identify each mobile device and create motion profiles of each such device (and its owner). If the SUPL service is hosted by one main provider (i.e. Google SUPL), there is a lot of valuable information available to them for free that they can commercialize.

Currently, there is only one mitigation method available to hide one's location info from the SUPL server(s) at e.g. Google: using a SUPL proxy server implementation (available as OSS, provided by and used in e.g. GrapheneOS). A SUPL proxy still depends on the big tech service provider(s) for SUPL as it merely proxies SUPL requests from mobile devices through to the proprietary SUPL services, at e.g. Google, but the mobile device is being camouflaged behind the SUPL proxy in use.

The OpenAGPS Teaser

OpenAGPS, on the contrary, will be a fully independent implementation from proprietary service providers, and it will refrain from collecting and commercializing end users’ data. It will be driven by individuals of the OpenAGPS community. There will likely be one central service that the OpenAGPS project plans to host and operate (the Porygon frontend/backend, OpenAGPS's GNSS Almanach service), but except from that SUPL servers can be self-hosted by individuals, companys or other communities. The requesting mobile devices' IDs will be hidden from the Porygon server (like with existing SUPL proxy implementations), so that the only centrally operated component (the Porygon Almanach server) does not know who is requesting what geo position information (and thus cannot collect such data, neither derive info about where requesting devices are located).

In addition, with a large OpenAGPS community, it is imaginable (in theory) that there will also be multiple central Almanach servers available on the internet (with parallel networks of base stations attached to each GNSS Almanach server).

Checkout the OpenAGPS architecture schematics and our website/documentation to learn more.

Collecting Satellite Data

The OpenAGPS project is not simply a software that admins/users can install, it needs kind of a huge and global community to operate/host/house its base station network.

The challenge with providing a community-driven AGPS service on the internet is that up-to-date (real-time!) GNSS/GPS satellite position data is not available for free download. Almanach data can be obtained per region from various organisations, but then their datasets are often days to weeks old, thus too outdated. GNSS/GPS satellites are not geo-stationary, they circulate around the planet. Their position is dependent on the current date-time. A globally spanning network of GNSS/GPS base stations will do the trick here. We will need a community that harvests the needed satellite data in real time and makes it available through the Porygon Almanach server to all OpenAGPS users.

The OpenAGPS project will depend on at least one community member every ~40-50 km² to operate a so-called OpenAGPS base station: These base stations are stationary, need to run 24/7, and they will harvest GNSS/GPS statellite data information from the satellites above in real-time and share this data with the (central) Porygon server, continuously. The Porygon server will create a timestamp-dependent "map" of all seen satellites and extrapolate locations between base stations' Almanach data updates.

Help making OpenAGPS a Success: Host a Base Station

To make OpenAGPS a success, we need volunteers who are willing to host (actually: house) an OpenAGPS base station at their home or work place (or both). Users will only be able to use their self-hosted OpenAGPS SUPL server with their mobile devices (instead of e.g. Google SUPL), if we manage to establish sufficient coverage with those base stations in the area of interest, so that the OpenAGPS Almanach will get populated with sufficient satellite position data.

If you'd like to host/house such a base station, please get in touch and check the docs.

Support this project by Co-Funding it

If you realize that you have an interest in this project and would like to improve your level of digital sovereignty in your government, organization, at your home, etc. then consider sending financial support to the project. If you want to support us, please get in touch with Raoul Kramer at BetaBreak or Mike Gabriel at Fre(i)e Software GmbH. If you are a software developer and would like to contribute to OpenAGPS, also get in touch and let us meet at FOSDEM 2027.

Credits

A huge thanks to the NLnet Foundation for funding this project's bootstrap phase. Follow-up funding has been applied for, so please keep fingers crossed!

365 Tomorrows — Ever Yours

Author: Remy Berinato Yours was a face that did not belong. Posterity will call that sentence self-deception. But! But it is a fundamental truth—the gods are not infallible. They are man-made creatures, clumsy, even lazy. People, too often, are slated for birth during improper eras. You will have seen these beings, but only in glimpses. […]

The post Ever Yours appeared first on 365tomorrows.

Planet Linux Australia — Double-width atomics aren’t atomic if using “zig cc” to build C/C++ code

The Zig project heavily advocates the use case of using its toolchain to build C/C++ code, “Use Zig as a zero-dependency, drop-in C/C++ compiler that supports cross-compilation out-of-the-box.” (Zig home page https://ziglang.org/ fetched 2026-10-21). Back in 2020, the announcement from Zig’s creator was “zig cc: a Powerful Drop-In Replacement for GCC/Clang”. As far as I can work out, the vast majority of the usage of the Zig toolchain is as a C/C++ compiler, and since it is LLVM based, one may reasonably assume that it is pretty much the same as using clang.

Unfortunately, this is not true if you rely on some atomic operations being, well, atomic.

I think going through the details on this bug is a pretty interesting learning exercise (I certainly learned some things), so here goes….

A compiler (at least in the Linux world, I assume it’s similar on other platforms) implements an atomic operation by emitting a lock-free instruction, or by calling a library function (e.g. __atomic_load_16, __atomic_load_8, etc) if building for a target which lacks a suitable lock-free instruction. This enables a compiler to emit efficient native code for the target, as well as have a library that can be used in two cases: 1) The base processor being targeted doesn’t have an instruction for the operation, and 2) the implementation of the library calls can be optimal for the CPU the program is running on, thus a program can target an older CPU but get (most of) the benefit of improved atomic instructions on newer processors.

The lock-free instruction and the implementation of the equivalent library function needs to be compatible as either form can be used on the same object in the same program. This allows building software that works across a large range of processors but has the hot paths built for different micro-architectures and selected at runtime. This is effectively the same thing as supporting linking in objects built with a prior version of the compiler that didn’t know about the lock-free instruction. Thus, LLVM and GCC require that the library implementing the atomic functions to be lock-free for every size the compiler can emit inline, and both link to GNU libatomic for the library functions.

What the toolchains require

The LLVM Atomics guide, “Libcalls: __atomic_*“:

The set of atomic sizes supported lock-free must be a superset of the sizes any compiler can emit. That is: if a new compiler introduces support for inline-lock-free atomics of size N, the __atomic_* functions must also have a lock-free implementation for size N. This is a requirement so that code produced by an old compiler (which will have called the __atomic_* function) interoperates with code produced by the new compiler (which will use native the atomic instruction).

GCC’s design for its atomic library, Atomic/GCCMM/LIbrary on the GCC wiki (archived copy, 2024-12-30):

Implementation of the external routines must agree with the compiler for any given object size. If the compiler generates lock-free code for an object, the library must also implement lock free for that size as well. It is conforming for the compiler to simply always call the library, so both must agree on the implementation.

The same page gives the 32-bit test below as its example:

Compile a library for 386. The 386 does not support a lock-free atomic int, so the compiler generates function calls. Compile an application for 486. The 486 does support a lock-free atomic int, so the compiler generates machine instructions. Link those two and run them on a 486. The operating system was built knowing that it’s architectural level is 486, so its atomic ABI library implements the atomic int with lock-free machine instructions.

The problem with “zig cc”

However, when you build your C/C++ code using zig cc, it will emit lock-free instructions and calls to library functions, but it does not link to GNU libatomic, instead it links to Zig’s bundled compiler_rt library, which contains its own implementations.

In Zig’s compiler_rt library, which is linked to your C/C++ code, __atomic_load_16 on x86_64 and ppc64le, and __atomic_load_8 on 32-bit x86, are implemented by taking a spinlock and then doing two separate half-size loads. This obviously breaks if the compiler can emit a lock-free instruction for these operations, which it does. Thus, loads tear and your atomic operations are not atomic. While it is possible to pass -latomic to zig cc, this makes no difference.

Reproducing with a single C file (x86-64, 16-byte atomics)

We will use a small C program where a writer thread and a reader thread access one _Atomic unsigned __int128. We use the __attribute__((target("cx16"))) feature of the compiler as a shortcut for situations where you’d have different implementations of one function optimized for different CPUs or for linking in different builds.

If we build the source with the default options, since writer() has __attribute__((target("cx16"))), its atomic_store will be an inline lock cmpxchg16b, and since reader() has no attribute, its atomic_load is a call to __atomic_load_16.

(spoiler) if you use clang or gcc to compile and link, this will work perfectly.

here’s the code:

/*
 * Test: the writer only stores values whose two 8-byte halves are equal;
 *       a load with unequal halves is torn, and should NEVER happen.
 */
#include <stdatomic.h>
#include <stdio.h>
#include <pthread.h>
#include <time.h>

static _Atomic unsigned __int128 shared;
static atomic_int stop;

__attribute__((target("cx16"))) static void *writer(void *arg) {
    (void)arg;
    for (unsigned long long i = 1; !atomic_load(&stop); i++)
        atomic_store(&shared, ((unsigned __int128)i << 64) | i);       /* inline lock cmpxchg16b */
    return NULL;
}

static void *reader(void *arg) {
    unsigned long long *torn = arg, loads = 0;
    while (!atomic_load(&stop)) {
        unsigned __int128 v = atomic_load(&shared);                    /* call __atomic_load_16 */
        if ((unsigned long long)(v >> 64) != (unsigned long long)v) (*torn)++;
        loads++;
    }
    torn[1] = loads;
    return NULL;
}

int main(void) {
    unsigned long long res[2] = {0, 0};
    pthread_t w, r;
    pthread_create(&w, NULL, writer, NULL);
    pthread_create(&r, NULL, reader, res);
    struct timespec t = {2, 0}; nanosleep(&t, NULL);
    atomic_store(&stop, 1);
    pthread_join(w, NULL); pthread_join(r, NULL);
    printf("torn loads: %llu of %llu\n", res[0], res[1]);
    return res[0] != 0;
}

If we now build and run that code (run it 3x for 2s each time), we can see how the different compilers fare:


+ clang -O2 atomic16.c -lpthread -latomic -o out/atomic16-clang-latomic
#    writer: cmpxchg16b   reader: call <__atomic_load_16@plt>
#    Links to: [libatomic.so.1] [libc.so.6]
#      __atomic_load_16: U __atomic_load_16@LIBATOMIC_1.0
+ zig cc -target x86_64-linux-gnu -O2 atomic16.c -lpthread -o out/atomic16-zigcc
#    writer: cmpxchg16b   reader: call <__atomic_load_16>
#    Links to: [libc.so.6] [libpthread.so.0]
#     __atomic_load_16: t __atomic_load_16
+ zig cc -target x86_64-linux-gnu -O2 atomic16.c -lpthread -latomic -o out/atomic16-zigcc-latomic
#    writer: cmpxchg16b   reader: call <__atomic_load_16>
#    Links to: [libc.so.6] [libpthread.so.0]
#    __atomic_load_16: t __atomic_load_16

+ ./out/atomic16-clang-latomic
torn loads: 0 of 682030142
torn loads: 0 of 645687188
torn loads: 0 of 692854822
+ ./out/atomic16-zigcc
torn loads: 720 of 128380947
torn loads: 382 of 138503698
torn loads: 13108 of 131805641
+ ./out/atomic16-zigcc-latomic
torn loads: 455 of 137924614
torn loads: 20909 of 132735414
torn loads: 425 of 135945438

I used Zig 0.17.0 for these tests.

The inability to report upstream

I wrote about it in more detail in my first post on Zig, but the tl;dr is that since an LLM was involved in finding this bug, the “No LLMs for finding bugs” part of their Code of Conduct obviously applies.

I’ve written this up because others may find it interesting, and maybe this helps someone debug their concurrent Zig application at some point, or learn something about how compilers do (or do not) work.

,

Cryptogram Friday Squid Blogging: New Jurassic Squid Predecessors

News story: “Scientists discover a bizarre Jurassic ‘squid’ unlike anything ever seen.”

Scientists have identified the “fattest” belemnite ever discovered, a bizarre, barrel-shaped squid relative that lived in Wyoming’s ancient seas 160 million years ago. The exceptionally rare fossils reveal a creature unlike anything previously known, potentially a predator of smaller squid-like animals and a surprising survivor of a supposedly vanished family.

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.

Planet Debian — Isoken Ibizugbe: Seeing Accessibility in Debian

Recently, I’ve been noticing something on packaging around my house that I used to glance right past: raised Braille dots on a carton of medicine, and embossed markings on a container of body cream. I’ve always known what Braille looked like, but I never paid close attention to it. Now that I’m actively working on accessibility testing for the Debian Installer, I see it everywhere.

It made me reflect on how accessibility usually enters our consciousness. In tech, we’re taught about accessibility as a best practice when designing user interfaces or web apps. But realistically, you mostly see it implemented well in massive global software, like mobile operating systems or browsers like Firefox. You rarely see accessibility features integrated into local Nigerian physical products or everyday tech. Paying attention to these details made me realize how much care goes into making sure every person is considered, and how vital that mindset really is.

Manual Testing & The openQA Bottleneck

My recent work with Debian has been focused on automating tests for the Debian Installer’s accessibility features, specifically validating Braille display emulation.

I started out by manually testing following the official steps on the Debian Installer Accessibility Wiki. Once I understood the manual flow, the next goal was figuring out how to automate it inside openQA.

Initially, the idea was to initialize from the bootloader by adding parameters to the Grub (GRUB=”brltty=auto”)and it should start the installation with the braille visual. However, this didn’t work, the parameters never initiated the brttyl and it was a huge blocker going back and forth. Getting brltty to talk to the test runner in that environment would have required sweeping changes across the main Debian openQA instance configuration.

Instead of pushing for complex system-wide changes on the instance, we started looking for easier alternative approaches and noted the complicated ones, when we advance in the test.

We brainstormed streaming the display output directly to a dedicated file to capture and verify the Braille virtual display output. Ultimately, nested virtualization proved to be the most easiest path forward. 

You can check out the implementation details and changes in the Merge Request

Joining the Conversation

As part of this work, I joined the debian-accessibility mailing list to introduce what we were building and share our progress.

The responses were encouraging. I got some feedback and suggestions and the thread also created a discussion on how accessible the installation process currently feels for blind or visually impaired users, and where they also find issues. It served as a great reminder that test suites aren’t just about passing CI checks, they’re about serving actual people who rely on these systems every day.

Cryptogram Pinpointing Location of Videos from Background Airplane Sounds

This is fascinating:

The video describes a technique that can reveal where an otherwise unidentifiable recording was made by analyzing its audio for the faint sounds of passing aircraft. The technique is both fascinating and frightening.

It works by looking at Doppler curves, which plot the way a plane’s sound changes as it passes overhead because of the Doppler effect. This is the same familiar Doppler effect that causes the frequency of a siren to rise as it approaches and then fall as it passes by and moves away. More generally, it’s the phenomenon whereby the frequency of a wave perceived by an observer changes when the observer and the source of the wave are moving in relation to one another.

[…]

It’s sound that’s relevant here, though, and specifically the sound of aeroplanes. Early in his video, Colsto brings up a map of the flights that were in the air at the time the video he’s tracing was recorded. Much of this information is publicly available. Aircraft equipped with Automatic Dependent Surveillance–Broadcast (ADS-B) transmit data about their position, velocity, and altitude, which flight-tracking services collect and make available to the public. While not every plane is tracked, the system provides an enormous amount of information about aircraft movements.

Planet Debian — Steve McIntyre: Geeks hacking in Cambridge...

We're at the Arm office in Cambridge for fun conversations and Debian hacking, as part of this year's mini-DebConf. Here's some geek pron... :-)

Geeks!

More geeks!

Massive thanks to the Arm folks for making us welcome: Steve Capper and especially Charlie Dixon for going above and beyond to set things up for us!

Cakes!

Planet Debian — Vincent Bernat: Scriptable GeoDNS: leaving AWS for Bunny

To optimize the performance metrics of this blog, I relied on Amazon CloudFront to serve the assets,1 and Route 53 for the geo-aware DNS2 to direct readers to the closest host serving the content. But Route 53 is expensive: US$0.50 per zone per month, US$0.70 per million geolocation queries, and US$0.75 per healthcheck per month, plus US$1 per month for the KMS key needed to sign zones with DNSSEC. When I discovered that Bunny DNS is almost free for up to 500 domains and features scriptable answers, I made the jump! Plus, it's a European company based in Slovenia.

Bunny CDN

Bunny.net started as BunnyCDN in 2015. They added IPv6 support in 2017. Switching was uneventful. I don't bring a custom domain: I serve the content from the b-cdn.net domain. As I depend on content negotiation to serve AVIF and WebP images, I configure the CDN to cache each image format separately.

I disable logging to avoid collecting personal information. While the bunny.net GDPR page promises they anonymize data, it is unclear what CloudFront keeps in its own logs when logging is disabled.

The only downside of the bunny.net CDN offering is the lack of HTTP/3. I asked their support: two minutes later, they answered they are working on it but have no ETA to share.

Bunny DNS

Bunny.net introduced their DNS offering in 2022 and recently reduced its cost to almost zero. They support geographical routing, but a very cool feature is the scriptable DNS: it runs a piece of user-supplied JavaScript on each query to compute the answer.

I run seven small NixOS virtual machines to host this blog around the world: Paris, Nuremberg, Ashburn, Singapore, San Jose, São Paulo, and Sydney. Bunny's scriptable DNS lets me return the IP addresses of the two nearest servers. The browser falls back to the second server if the first one is down.

const servers = [
  {
    ipv4: "45.90.160.60",
    ipv6: "2a0c:8881:5:100::1",
    latitude: 48.88,
    longitude: 2.22,
  },
  /* […] */
  {
    ipv4: "139.180.162.114",
    ipv6: "2001:19f0:5800:1855:5400:6ff:fef0:4c0a",
    latitude: -33.87,
    longitude: 151.21,
  },
];
const families = { A: "ipv4", AAAA: "ipv6" };
const records = { A: ARecord, AAAA: AaaaRecord };

export default function handleQuery(query) {
  const type = String(query.request.queryType).toUpperCase();
  const family = families[type];
  if (!family) return [];
  // Get user location
  const location = query.request.geoLocation;
  // Build a list of candidates
  let candidates = servers.map(
    (s) => new Server(s[family], s.latitude, s.longitude, 100),
  );
  // Select the two closest alive servers
  const selected = [];
  while (selected.length < 2) {
    const server = RoutingEngine.getClosestServer(candidates, location, true);
    selected.push(server);
    candidates = candidates.filter((s) => s.ip !== server.ip);
  }
  // Return their IP addresses
  return selected.map((s) => new records[type](s.ip, 3600));
}

The above script relies on the RoutingEngine.getClosestServer() helper, which returns the closest alive3 server to the user.4 Thanks to Doggo, we can check it works as expected, at least for A:5

$ doggo --gp-from="Amsterdam" A vincent.bernat.ch
LOCATION          NAME                TYPE  TTL    ADDRESS
Amsterdam, NL
                  vincent.bernat.ch.  A     3600s  45.90.160.60
                  vincent.bernat.ch.  A     3600s  116.203.18.48
$ doggo --gp-from="Texas" A vincent.bernat.ch
LOCATION          NAME                TYPE  TTL    ADDRESS
Houston (TX), US
                  vincent.bernat.ch.  A     3600s  5.161.44.145
                  vincent.bernat.ch.  A     3600s  149.28.219.155

The most annoying drawback of this method is that a user from Buenos Aires gets both São Paulo (1000 mi, 30 ms RTT) and Ashburn (5200 mi, 140 ms RTT). Most resolvers randomize the order, so the user may pull the web page from Ashburn. We could return only the nearest server—and swap the scripted record with the built-in geographic routing instead. But if the server becomes unavailable, the browser has no alternative until the DNS cache expires. It leaves a short window of unavailability, even with a short TTL.

The HTTPS record solution

The HTTPS DNS record, defined in RFC 9460, solves both the availability and the latency issues. Modern browsers query this record to get additional information to reach an HTTP server, including an alternative port and the application layer protocol—HTTP/2 or HTTP/3. Each record has a priority. We can ask browsers to contact the nearest server first and fall back to the next one if the first is unavailable:

vincent    HTTPS  1 first.geo  alpn="h3,h2"
vincent    HTTPS  2 second.geo alpn="h3,h2"
vincent    HTTPS  3 .          alpn="h3,h2"

; Bunny DNS must provide the two closest servers as "first.geo"
; and "second.geo" with geographic or latency routing.
first.geo  A      45.90.160.60
first.geo  AAAA   2a0c:8881:5:100::1
second.geo A      116.203.18.48
second.geo AAAA   2a01:4f8:1c0c:5eb5::1

vincent    A      45.90.160.60
vincent    A      116.203.18.48
vincent    AAAA   2a0c:8881:5:100::1
vincent    AAAA   2a01:4f8:1c0c:5eb5::1

This looks like the ideal solution! Unfortunately, Chrome ignores any record whose target is not ., hence the last record at priority 3. Moreover, unlike with a CNAME, Bunny DNS does not return the IP addresses for first.geo and second.geo in the additional section. The resolver needs to send a first request to get the HTTPS record, and a second to resolve first.geo.

HTTPS records are still too new for this use case. Back to the drawing board! �

The hybrid solution

As a compromise, the script returns the two nearest servers if they are at a similar distance from the user. Otherwise, it returns only the nearest one with a lower TTL of 2 minutes.

export default function handleQuery(query) {
  const location = query.request.geoLocation;
  let candidates = servers.map(
    (s) => new Server(s.ipv4, s.latitude, s.longitude, 100),
  );

  // Select the two closest servers
  const selected = [];
  while (selected.length < 2) {
    const server = RoutingEngine.getClosestServer(candidates, location, true);
    selected.push(server);
    candidates = candidates.filter((s) => s.ip !== server.ip);
  }

  // Compute the distance to the user for each of them
  const [first, second] = selected.map((s) =>
    GeoDistance.calculate(s, location),
  );

  // If the second one is at twice the distance and at more than 1000 miles
  // from the first, return only the first one with a TTL of 2 minutes.
  if (second > 2 * first && second - first > 1000) {
    return [new ARecord(selected[0].ip, 120)];
  }

  // Otherwise, return both with a TTL of 1 hour.
  return selected.map((s) => new ARecord(s.ip, 3600));
}

We can check it with Doggo. From Chicago, we get only the Ashburn server with a TTL of 2 minutes, while from Mexico, we get both Ashburn and San Jose.

$ doggo --gp-from="Chicago" A vincent.bernat.ch
LOCATION          NAME                TYPE  TTL    ADDRESS
Chicago (IL), US
                  vincent.bernat.ch.  A     120s   5.161.44.145
$ doggo --gp-from="Mexico" A vincent.bernat.ch
LOCATION          NAME                TYPE  TTL    ADDRESS
Queretaro, MX
                  vincent.bernat.ch.  A     3600s  5.161.44.145
                  vincent.bernat.ch.  A     3600s  149.28.219.155
$ doggo --reverse 5.161.44.145 149.28.219.155
NAME                          TYPE  TTL    ADDRESS
145.44.161.5.in-addr.arpa.    PTR   7187s  web05.luffy.cx.
155.219.28.149.in-addr.arpa.  PTR   3600s  web07.luffy.cx.

Note

On the live page, the map below is interactive: point at a location to get the DNS answer, or disable servers to see how the answers change.

Map of the servers answered by Bunny DNS for each location

The complete code is a bit more complex. It works around RoutingEngine.getClosestServer() supporting only IPv4, and it handles the case where there are not enough alive servers to build an answer.

Bunny.net has a comprehensive Terraform provider. I leverage CDK Terrain to build the target state in TypeScript and OpenTofu to deploy it. Have a look at "Managing infrastructure with Terraform, CDKTF, and NixOS" for more details.6

ACME DNS with Hickory DNS

Route 53 covered one additional use case of mine: serving acme.luffy.cx to solve DNS-01 ACME challenges. Unlike Route 53, Bunny DNS cannot restrict access to a single zone with a fine-grained access policy. As this usage requires neither high availability nor low latency, I replaced Route 53 with Hickory, a memory-safe DNS server written in Rust. It supports automatic DNSSEC signatures and dynamic updates. Its configuration is simple:

[[zones]]
zone = "acme.luffy.cx"
zone_type = "Primary"

[zones.stores]
allow_update = true
type = "sqlite"
journal_path = "acme.luffy.cx.sqlite"
zone_path = "acme.luffy.cx.zone"

# Private key to sign the zone with DNSSEC. Generated with:
#  openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256
[[zones.keys]]
algorithm = "ECDSAP256SHA256"
key_path = "/etc/hickory-dns.acme.luffy.cx.pem"

# TSIG key to sign zone updates. Generated with:
#  openssl rand 32
[[zones.stores.tsig_keys]]
algorithm = "hmac-sha256"
key_file = "/etc/hickory-dns.acme.luffy.cx.update.acme.luffy.cx.tsig"
name = "update.acme.luffy.cx."

The provided zone file only seeds the database on first start. I delegate DNS-01 challenges to this zone with CNAME records:

_acme-challenge          CNAME bernat.ch.acme.luffy.cx.
_acme-challenge.vincent  CNAME vincent.bernat.ch.acme.luffy.cx.

Lego, the ACME client I use to get certificates from Let's Encrypt, answers the DNS-01 challenge by pushing entries with the DNS UPDATE protocol.

Unfortunately, Bunny DNS cannot publish a DS record in a zone.7 I need one to secure the acme.luffy.cx zone and certificate delivery. Therefore, I host the luffy.cx zone on deSEC,8 a free DNS hosting service run by a non-profit organization based in Berlin. I derive the DS record to publish in luffy.cx from the DNSKEY record of acme.luffy.cx:

$ ZONE=acme.luffy.cx
$ dig @nsupdate.luffy.cx $ZONE DNSKEY +noall +answer \
>   | dnssec-dsfromkey -a SHA-256 -f - $ZONE
acme.luffy.cx. IN DS 55628 13 2 4946E7508F20E15F1B577A231104B029A1A82E04699A80CD46ADCE31227EE81F

Overall, I am quite happy with the switch to bunny.net. There are still a few rough edges, like the inability to publish DS records, the lack of HTTP/3, and the IPv4-only RoutingEngine.getClosestServer() helper. The bill went from US$5 per month to US$1. So far, performance is on par with AWS, but I only finalized the current setup, including the server in Sydney, in late October. I need a bit more time to gather more data, and I'll post a short update. 📈

Update (2026-11)

This post was briefly discussed on Hacker News and Lobsters.


  1. I had been hosting media assets on CloudFront since 2011. ↩

  2. Route 53 had served bernat.ch since December 2021. I didn't use healthchecks as they were too expensive. I didn't host most of my zones there either, as queries for haproxy.debian.net alone would have cost me around US$10 per month. ↩

  3. A server is alive if it answers an ICMP ping. The bunny.net documentation gives more details about the checks. ↩

  4. The user queries Bunny DNS through a resolver. Usually, either the resolver is close to the user, or it exposes the user's subnet through EDNS client subnet. ↩

  5. Don't use this script as is: RoutingEngine.getClosestServer() only works with IPv4. The final script works around this limitation. ↩

  6. The article is a bit outdated. CDK Terrain replaces CDKTF, OpenTofu replaces Terraform, and I now use Colmena instead of NixOps. ↩

  7. I contacted bunny.net support to ask when they will support publishing a DS record and got an answer seven minutes later: they don't know. 😭

    This is a bummer, as they support automatic CDS, a DNS record to advertise a DS record to the parent zone. They handle one side of the delegation, not the other.

    I also reported a bug with the proof of non-existence, and they replied a day later with a detailed answer. ↩

  8. Why not use deSEC for ACME challenges? You can limit its tokens to a single RRset. I could say I prefer to self-host, but the truth is I only discovered this while writing this article. ↩

Planet Debian — Andrew Cater: Arm Cambridge - pre mini-Debconf days 20261105

 At Arm in Cambridge for two hackathon-type days before the main mini-Debconf on Saturday and Sunday. A roomful of people, mostly very quiet this morning but with people gradually arriving and greeting each other.

Just had an excellent lunch. Arm are excelling themselves, as ever. With particular thanks to Charlie Dixon who has arranged excellent facilities for us all and to Liv for the catering provision. Other old friends here have also helped as ever.

This sort of thing is ideal for cross-fertilization of experience, ideas - the side conversations where you realise that three people are converging to a consensus of discussion from three different starting points. It's fun and intensely interesting and it's the sort of thing that keeps me running Debian - and trusting the colleagues behind it because I've seen them here. 

Face and name recognition is sometimes at least as valuable as rockstar coding and the social element and shared history keeps us pulling together.

Planet Debian — Andrew Cater: Arm Cambridge - pre-mini-Debconf days 20261106

Another interesting morning so far. Lots of interesting side conversations (and, of course, people using IRC to talk to the person next to them as is traditional).

It's nice to hear somebody ask a question and be told, effectively  "Oh, you need to talk to XX - they're sitting over there" or " I need to talk to someone about X, Y and Z - and they all resolve to you".

Especially noticeable in  this room, perhaps, but it does point to the fact that many things in Debian ultimately  resolve to one or two people. There are a lot of people each with multiple areas of expertise which overlap - and then a few individuals who are essential as points of reference for *everyone* else.

Thanks again to Arm for hosting us, for excellent food, coffee and facilities which make this _so much easier_ as a working environment for these days.

Planet Debian — Ben Hutchings: FOSS activity in October 2026

Worse Than Failure — Error'd: Remember Remember

"I Already Hate Running... I Don't Want To Have To Run Each Street A Second Time!" plods WeaponizedFun "I've gotten a couple of notifications from CityStrides today that they've updated streets for several cities, but it looks like they're doubling the effort it's going to take to finish completing these roads."

d72b3a03e73644879ec43ebf4d626587

"I'll be back in 292 years" concedes Rick H. "I asked GoDaddy for a single whois record. They gave it to me, and told me if I wanted to ask anything else to come back in 300 years."

14d1f05fdc7f4a1a91c06bd07e18e9a1

Totty reports "I found this at the bottom of an article at ajournalofmusicalthings.com.

6ad3a9c085a64f40819836dbc81d5e10

"I hope I don't have to pay the whole period" frets Ernesto T. "Not considering the mix of languages between English and Italian, my subscription will renew on 1st of Jan, 1970 So am I 56 years late in payment? I hope I am not. It would be quite a big amount of money in inflation and interests."

6f1258fe3be148a392de952cdce8b36c

"Everything is insecure" worries Daryl too. "No threats found, but I don't feel very safe." It was a worrisome week.

a4eebddd2eb44db5baade067ac2b5177

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

365 Tomorrows — Unexpected Arrival

Author: Samuel Stapleton When our base was added to the list of emergency spaces that would accept refugees few personnel took note. It was standard practice and everyone assumed nothing would come of it. Of course, being stationed at a remote military outpost with organic capable teleportation probably had something to do with our current […]

The post Unexpected Arrival appeared first on 365tomorrows.

xkcd — Simulation

,

Planet Linux Australia — Zig self-hosted compiler can’t compile a 16-byte @atomicLoad

Previously, I wrote about how the Zig self-hosted backend lowers a seq_cst @atomicRmw(.Xchg) with a discarded result to a plain mov, but this isn’t the only issue with the self-hosted backend and atomics.

A valid bit of Zig code is @atomicLoad(u128, p, .seq_cst) – an atomic load of an unsigned 128 bit value.

A trivial example in Zig:

export fn load128(p: *u128) u128 {
    return @atomicLoad(u128, p, .seq_cst);
}

The equivalent trivial example in C:

unsigned __int128 load128(unsigned __int128 *p) { return __atomic_load_n(p, __ATOMIC_SEQ_CST); }

When building for a target that has the cmpxchg16b instruction (such as the x86-64v2 target, the base x86-64 processor level for several Linux distributions, or by specifying -mcx16 to enable just that instruction), this should compile down to the lock cmpxchg16b instruction. If using the LLVM backend for building Zig, then this works. However, if you try and build the same Zig with the self-hosted compiler (the default for x86-64 debug builds, or selected by passing -fno-llvm), then it doesn’t work:

/opt/zig-0.17.0/zig build-obj /repro/src/load128.zig -target x86_64-linux -mcpu=x86_64_v2 -O Debug -femit-bin=/tmp/load128/zig-0.17.0/load128.o
repro/src/load128.zig:2:8: error: genSetReg called with a value larger than dst_reg
export fn load128(p: *u128) u128 {
~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
exit status: 1

It’s possible that the Codeberg issue #37289 issue, “”x86_64 backend: compiler segfault on @cmpxchgStrong(u128, ...) when the new value is an expression”” is related (this was an open issue as of 2026-10-17).

I have not reported this upstream, as the Zig Code of Conduct is unambiguous about bugs found with the assistance of LLMs (see my previous post for details).

furilabs — Camera and Gallery Upgrades

We're excited to share the latest round of improvements to our Camera and Gallery apps. This release focuses on bringing the two experiences closer together, refining core interactions, and shipping a set of performance and stability fixes.

A Unified Photo Experience

The biggest structural change in this update is that Camera has been integrated directly into the Gallery app. Until now, the Camera app carried its own standalone gallery for reviewing recent shots. That separation meant duplicated functionality, inconsistent browsing behavior, and two interfaces to maintain.

With this update, everything lives in one place. Images captured with the Camera open straight into the Gallery, where you can review, organize, and edit them alongside the rest of your library. The standalone gallery inside Camera has been removed as a result. The capture-to-review flow is now simpler: take a photo, and it's immediately available in the Gallery with the full set of browsing and editing tools at your fingertips.

Camera Updates

Preset Zoom Selection

A new zoom selection pill has been added to the control bar. Instead of pinching to zoom or digging through menus, you can now tap preset zoom levels directly from the main capture screen. The pill clearly highlights the active zoom level, so you always know exactly where you stand before you take the shot.

Capture Animation

Saving an image now plays a short capture animation. Beyond the polish it adds, the animation gives clear visual confirmation that your photo was saved successfully, so you can move on to your next shot with confidence.

Drawing, Cropping and Filters

The Gallery gains a proper editing toolkit:

  • Drawing to annotate images or make creative edits with freehand strokes
  • Cropping to reframe photos quickly and dial in the perfect composition
  • Filters to change the tone and mood of an image without leaving the app

Editing no longer requires bouncing between apps. Capture, review, and refine all happen in one seamless flow.

Performance Improvements

Performance has been improved across all widgets and operations in the Gallery. Scrolling through large libraries, opening images, and switching between views all feel noticeably snappier, especially on older hardware.

Fixes

Two notable issues were resolved:

  • Incorrect image removal indexing. Under certain conditions, deleting an image could remove the wrong entry from the grid. Indexing during removal has been corrected so deletions always target the intended image.
  • Memory issues from raw textures. Raw textures were not always released properly, which allowed memory usage to climb during long browsing sessions and could lead to instability. Texture lifecycle handling has been fixed, keeping memory usage steady over time.

Planet Debian — Gunnar Wolf: Don't tell anybody... but we have apparently gone DARK!

Your friendly keyring-maint Debian team received one of the weirdest spam messages ever…

Weird spam from Obscura

So, do we want to py to who-knows-whom for promoting the keyring-maint services in a verrrrrry-dark web search site?

First time I have to throw this stinky onion at you…

Spam!

Charles Stross — Crib sheet: The Regicide Report

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

So here it is.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Worse Than Failure — CodeSOD: Only Create Me if I Exist

Foreign keys are an important part of making sure the entities in our relational database can be connected back together and queried correctly. It's part of proper data normalization. This isn't shocking, of course: the order line table has a foreign key over to the products table, so that every line item points to a product we sell. That's database 101. Database 201, you'd also think about the times where you have a hierarchy of records, where say, every Employee has a ManagerId, which is a foreign key back to the Employee table itself (and in database 301, you'll understand why having a ManagerId field is a terrible choice, but that's neither here nor there).

The important thing here is that foreign keys are very common, and foreign keys pointing back to the same table are also very common.

But it can still go very wrong. Roman sends us this foreign key definition in a database they maintain.

ALTER TABLE [dbo].[ListingDetails]  WITH CHECK ADD  CONSTRAINT [FK_Listings_Listings] FOREIGN KEY([Id])
REFERENCES [dbo].[ListingDetails] ([Id])

This ensures that the ListingDetails table's Id field is a foreign key over to the ListingDetails table's Id field. A field is a foreign key back to itself.

Roman writes: "I can't believe SQL Server even allows this..."

I can. While I haven't personally tried this out, a bit of cursory searching implies that this does actually work- the record satisfies its own constraint, so you can still add it to the database. It's basically a no-op, which isn't great, but it's not SQL Server's job to ensure you keep all your toes because they've removed all the footguns.

[Advertisement] Utilize BuildMaster to release your software with confidence, at the pace your business demands. Download today!

Planet Debian — John Goerzen: Letter from a Kansan: “Would You Rather Be Right or Happy?”

As a person that has lived in Kansas almost all my life, I have never seen such good political news for this state as we got this week. It is a stunning rebuke of fascism from across the country.

One of the many pieces of wisdom from mechanic Tom Magliozzi is this question: “Would you rather be right, or happy?” He often asked it in the context of somebody that had just won an argument.

This is my plea to all our progressive friends: remember that question, and keep it in mind carefully over the next 2 years. We can either build on this momentum for an even bigger victory in 2028, or we can start to lose this unique coalition.

Kansans spend our lives being misunderstood and forgotten.

Many of us, myself included, visit large cities regularly.

It is a more surprising event when someone from a large city drives down one of our dirt roads. The kind of road that leaves your car covered in mud when you drive your daughter to school. The kind of road that we drive on for 3 miles before we reach the nearest paved road.

Statisticians label Topeka, the capital of Kansas and city of 126,000 people, as rural.

The nearst town to me, 7 miles away, has a population of 600. In winter, many people here still leave their keys in their running, unlocked cars while they run into the grocery store. The person at the bank, the owner of the grocery store, the mechanic, the electricians, the builders, the people that run the local museum, all know my name and recognize me. Not because I’m famous locally, but because this is normal here. We are a community, a real one.

Yet I’ve lost long-time friends, especially from the west coast, because, while I’m progressive, I still talk to Republicans. They thought Republicans are so evil, they ought to be shunned and ostracized.

It probably doesn’t compute to a San Franciscan what it means to live in a county that went 80% for Trump one time. A county of about 10,000 people living in a space larger than Los Angeles, New York, and San Jose — combined. (Those cities have a combined population of about 13 million, living on the same amount of land as 10,000 people do out here.)

If I avoided talking to Republicans, it wouldn’t be them that would be isolated. It would be me.

Out here, many of us have lived with each other for generations. We may go on living with them for generations. If somebody’s car is stuck in the mud, the first person that comes by with a truck and a rope will probably pull them out. Nobody asks who you voted for. This is what you do for neighbors, because neighbors are humans, and next time it might be me that’s stuck in the mud.

I can be as incensed as anyone else about what the fascists are doing. I don’t have direct knowledge of how a lot of people vote. But I take a deep breath sometimes and remind myself: these are my neighbors. I’ve seen them go out of their way to be kind and generous with all walks of humanity. (Yes, even whatever groups you’re imaginging to argue with me about.)

This is part of how Adam Hamilton defeated Roger Marshal. The anti-Trump sentiment wasn’t enough on its own. Lifelong Republicans dissatisfied with how Trump handled things weren’t just going to vote for any Democrat. They needed someone that was safe. Someone that talked to them as humans. Someone that respected them.

Adam Hamilton went and shook hands with MAGA protestors at his events. He told them “I want to be your senator, too.”

This is how you win over the most strident of Republicans. Hamilton didn’t compromise his beliefs. He invited discussion about them.

I have already been seeing some progressives say things like, “Don’t cut them any slack. Remember how many times people voted for fascism! They need to still be ostracized.”

That, folks, is the way we lose. It is the wrong strategy everywhere. And it is especially culturally wrong in the close-knit communities — again, actual communities where people know each other and have for years — that make up the heartland.

Building relationships with people different than us is our best chance to build on this coalition. And, isn’t that what progressive values call for?

So, celebrate this victory. Clap for all the activists that made it happen.

And, before you set off to alienate your new and tentative allies, ask yourself:

“Would I rather be right? Or win again?”

Krebs on Security — Want to Rent an Internet Address at the White House?

Several staffers at the White House are using computers or mobile devices equipped with residential proxy services that render their internet address available for others to rent, security experts warned today. One of the proxy services is a Russian company whose founder’s web hosting business was ground zero for cyberattacks against election systems in Arizona and Illinois in 2016.

The security firm Layer3 Intel said it detected multiple residential proxy nodes beaconing out from the internet address network reserved for the Executive Office of the President (AS2650). Layer3 said the proxy activity was relatively persistent between October 5 to November 3, and that a review of the proxies available from AS2650 showed they exited from the White House network 236 times during that period.

The proxy tracking company Synthient said on Twitter/X that the activity it saw coming from AS2650 was related to multiple Windows 11 installations of a service called Infatica, a proxy program that is often integrated into “free” mobile and desktop applications. Infatica’s founder Vladimir Fomenko is a Russian man whose hosting firm King Servers was home to six of the eight internet addresses used by Russia’s state security services to compromise databases for election systems in Arizona and Illinois in 2016.

Synthient’s depiction of the outgoing proxy traffic from the dedicated White House network (AS2650). Click to enlarge.

There are dozens of residential proxy providers with varying degrees of legitimacy, many of them based in China or Russia. But at a minimum, they all make it simple for customers to rent someone else’s internet address as a way to anonymize their web traffic or spoof their true location. From a website’s perspective, the traffic from a proxy network user appears to originate from the rented IP address, not from the proxy service customer.

Layer3 Intel said the proxy exit nodes at the White House came from six internet addresses, on 26 of the 30 days, and that most of the activity happens in the evening, between 5 p.m. and midnight.

Incredibly, Infatica was not the only proxy service that reportedly has been reselling access to White House internet addresses: Layer3 Intel said it found 28 separate residential proxy services were able to exit through this network.

“This is public access,” the Layer3 Intel team wrote. “Anybody can obtain it by signing up to a public residential proxy service, paying a few dollars and sending requests through it. We did not selectively target this network or try to make our probes exit from it. We caught this by chance, simply by requesting global rotating access through these services.”

The White House did not immediately respond to a request for comment.

As detailed in several stories here over the past year, residential proxy services are a major source of unwanted and often malicious traffic, including account takeover and other cybercrime activity, advertising fraud, and mass content scraping for AI projects.

They can also introduce serious security risks. In late 2025, it was discovered that cybercriminals were mass exploiting a widespread vulnerability in these services that allowed them to probe each proxy endpoint’s local network for vulnerable systems to infect with malware. In January 2026, dozens of proxy services were forced to patch their networks after Synthient Founder Ben Brundage showed how cybercriminals were abusing a vulnerability in these residential proxy services to seize control over devices inside the local networks of unsuspecting users.

“Some of these resellers sell bandwidth for as low as 60 cents a Gigabyte, that means for less than a dollar you can gain access into some of the most confidential and trusted networks,” Brundage told KrebsOnSecurity. “The reseller ecosystem further enables this with any criminal able to buy access while skipping KYC [Know Your Customer] processes.”

All too often, these proxy services are beaconing out from employee devices brought into the workplace. App developers can embed software development kits (SDKs) provided by the residential proxy networks to monetize their software, allowing them to receive a small amount of money on each installation.

As risky as residential proxies can be for unsuspecting end users, they are all too commonly found on government and corporate networks. In a webinar in January 2026, the proxy tracking service Spur found residential proxies in nearly 300 government owned and operated networks, 318 utility companies, 166 healthcare companies or hospitals, and 141 companies in banking and finance. In a blog post earlier this year, the security firm Infoblox said it discovered that fully 65% of its customer base was querying one or more residential proxy related domains.

365 Tomorrows — The Final Savasana

Author: Tom Newcomer “Sync your breath to your intention,” the instructor croons softly. You can tell it’s one of them, though we’re technically indistinguishable. Too perfect, too fit and technologically handsome. The way it pauses over the sibilant S of the instruction: “sssync…” They only speak for our benefit. I’m already sick and work when […]

The post The Final Savasana appeared first on 365tomorrows.

Planet Debian — Reproducible Builds (diffoscope): diffoscope 337 released

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

[ Chris Lamb ]
* Mark that the test_nupkg_compressed_files test requires the tlsh Python
* module. (Closes: #1151752)

You find out more by visiting the project homepage.

,

Planet Debian — Juan Manuel Méndez Rey: Hello, Planet Debian

Hello, Planet Debian. My blog was added to the Planet today, so I think the polite thing is to introduce myself before you start finding my posts between yours.

I am Juan Manuel Méndez Rey, from Sevilla. In Debian I am mendezr, and on OFTC I am Vejeta. I have been using Linux since 1994 and Debian since 1998. For a long time that was all: a happy user, installing, breaking things, reading the mailing lists from the outside. I started contributing in October 2025, and last month I became a Debian Maintainer.

A friend and an old RFP

The way in was a friend. Back in 2019 Arturo Borrero Gonzalez filed RFP #943703 for Stremio, and for years he kept telling me I should pick it up. In September 2025 I finally listened and turned it into an ITP. It took longer than I like to admit, but Stremio is now in Debian, and I told that story here. A six year old RFP turned out to be a very good first package.

Rescuing old software

Somewhere along the way I discovered that what I enjoy most is bringing old software back.

The first one came from tille, who asked for help in #debian-tinytasks with xwpe, a Borland style programming editor for the terminal that nobody was looking after. I adopted it, and then I ended up as its upstream maintainer too. I fixed the old bugs and added LSP and DAP, so now an editor from 1993 can debug Go. It ships on several distributions, in Homebrew and on the BSDs. The canonical repo is on Codeberg, and the long version is in this post.

xwpe debugging a Go program over DAP, with a live Watches pane

The second one is older and took much longer. Conquer is a Unix strategy game written by Ed Barlow and Adam Bryant in 1987, and I lost many hours of my youth to it. It never had a free licence. I first asked about it on debian-legal in October 2006, and I spent the next 20 years tracking down the authors, one email at a time. Today Conquer v4 and V5 are GPL-3.0. It is not packaged in Debian yet, that is the next step, but you can already play it in the browser.

Conquer running in the browser, first turn

What I am doing now

CEF took me six months and brought me into the Chromium team, and these days I am mostly with the syft, trivy and grype security stack and with Scala 3 and sbt for Debian.

Thanks

To Arturo, for the nudge. To dilinger, tille and tsimonq2, my DM advocates, for trusting me.

And if you can sponsor uploads for syft, trivy, grype or the Scala work, I would be very grateful. The details are on my wiki page.

You can find me there, as Vejeta on OFTC, or on Mastodon as @vejeta@mastodon.sdf.org. Nice to meet you all.

Planet Linux Australia — Lessons in Chemistry

Lessons in Chemistry Book Cover Lessons in Chemistry
Bonnie Garmus
Fiction
Penguin Books, Limited
2023

I think dad bought me this book for Christmas a year or so ago, but I don’t really remember to be honest. I say this mostly because I was a a little hesitant at first — historically I haven’t liked plots with assault or abuse of women in them and this story leads pretty strongly with those themes. Definitely give this one a miss if those things are a trigger for you. I’m not even sure why I like this book, terrible things keep happening to characters I am sure the author intends for me to care about, but they’re told I’m such a charming manner that I kind of just kept going. It’s weird.

Ultimately I think I like this book because the main character, Elizabeth, is so likable. She’s persistent, strongly principled, slightly autistic, and a force of nature. Despite all the terrible things she encounters, she just keeps grinding along. The universe isn’t super into this behavior to be honest, and that drives a lot of the plot. If she was willing to slot into her assigned role as a 1950’s house wife she would have a much easier time and this would be a much more boring book.

So overall — I liked this one a lot, but its not for everyone.

Worse Than Failure — Representative Line: What it Doesn't Do

Alastair found this comment in his codebase, and wondered, "who wrote this comment?" A quick blame answered the question: he did. He did not, however, write the code.

 public function getAllMailers() {
        // This function neither returns Mailers, nor all of them.
        ...
 }

I suppose the comment was easier to add that doing a global find/replace to update the function name everywhere. But I do wonder, what does this function return?

In any case, sing along: "I wrote the comment, but I did not pick this function name".

[Advertisement] Keep the plebs out of prod. Restrict NuGet feed privileges with ProGet. Learn more.

xkcd — House Majority

Planet Debian — Louis-Philippe Véronneau: Tenure

Last week, I received confirmation from my college's human resources department I was awarded tenure. If you ever worked in the academic world, you know how big of a deal this is.

In our fast moving and ever-increasingly unstable world, it is a pretty strange feeling to know you have a stable, well-paying job for the rest of your career. I am truly privileged to have an occupation I greatly enjoy.

Three cheers for another 30 years!

365 Tomorrows — Moon Walk

Author: C.A. Dahlstrand Two astronauts exited their lunar module and stepped onto the powdery surface. Cast-off equipment from previous missions littered the site like an abandoned city lot. The American flag planted in 1972 stood unfurled nearby, as expected. It was, however, no longer in pristine condition. Damage from numerous small punctures were visible. “My […]

The post Moon Walk appeared first on 365tomorrows.

,

furilabs — MMS, Ofono and IPv6

We have implemented targeted fixes and improvements to enhance cellular data and MMS reliability across various carriers and network configurations. These changes improve communication between the modem, oFono, and the network, with a particular focus on IPv6 compatibility, connection stability, and carrier-specific issues.

MMS improvements

MMS over IPv6

MMS is now supported over IPv6 for both sending and receiving. As carriers continue migrating their networks to IPv6, MMS implementations that only worked over IPv4 were silently failing on IPv6-only and dual-stack configurations. Sending and receiving now work reliably over both protocol families.

Delivery reports

MMS delivery reports are now supported, so the system can confirm when a message has actually been delivered rather than merely handed off. This closes a long-standing feedback gap and makes failures visible instead of silent.

Protocol and routing fixes

  • Fixed PDU payload length calculation. Incorrect payload lengths caused some carriers to reject messages outright; lengths are now calculated correctly.
  • Non-default MMSC port handling. Carriers that expose their MMSC on a port other than the default no longer break MMS delivery.
  • Shared context for MMS and mobile data. MMS can now send over the same context as mobile data, avoiding failed sends when no separate MMS context is available

IPv6 cellular connectivity

  • IPv6 cellular connectivity has been improved, including correct IP prefix exposure over DBus. The prefix information surfaced to consumers was previously incomplete or malformed, which broke address configuration and routing for anything that depended on it.
  • clatd has been added, providing IPv4 connectivity over IPv6-only cellular networks. Many services and applications still expect IPv4. clatd translates IPv4 traffic over the IPv6-only bearer, so IPv4-dependent software keeps working even on carriers that no longer hand out IPv4 addresses.

5G stability

5G stability is improved via modem technology selection tied to screen state. The modem's radio technology is now selected in line with the screen being on or off, avoiding instability seen when the modem remained in a mode its current power state couldn't sustain. The result is fewer drops and reconnects during everyday use.

oFono reconnection fixes

Reconnection race conditions and crashes in oFono have been resolved. Under rapid connectivity changes such as entering and leaving coverage, toggling airplane mode, or switching radio technologies, oFono could hit race conditions that led to crashes or left it unable to reconnect without a restart. These paths are now handled safely, so cellular data recovery is automatic and dependable.

Together, these changes make cellular connectivity and MMS behave predictably across a much wider range of carrier configurations - IPv4 or IPv6, 5G or LTE - with fewer silent failures and less need for manual intervention.

Cryptogram AIs Hacking the Law

In both a 2021 essay and my 2022 book, A Hacker’s Mind, I talk about AIs finding vulnerabilities and exploits—hacking—the legal system.

Here’s some demonstrations of this from Germany:

Legal systems encode the foundations of social order in natural language. Similar to computer systems, the written law can contain vulnerabilities that invite exploitation.1 Courts absorb most exploits through interpretation, and such vulnerabilities rarely surface in the first place. With highly capable AI systems enabling the discovery of vulnerabilities at unprecedented scale, we believe the latter could change.

In testing this hypothesis, we have identified a substantial number of vulnerabilities in the German legal system using LLMs. To our knowledge, none of these have been previously recorded. We share a selection of vulnerabilities below, and present potential exploits for each. We share only those vulnerabilities whose exploitation we believe would not cause serious harm.

We believe that with cheap legal reasoning proliferating, AI systems could jeopardize the functioning of today’s legal systems. In such a world, lawmakers would need to significantly harden the process of legislation, for example by leveraging advanced AI themselves.

Still in its early stages, but definitely something that’s coming.

Planet Linux Australia Continuations 2026/44: More filtery

  • Milestone: this week I called a freeze on new Hanami work. From here we’re focused on cutting down our outstanding items and then switching to release prep.

  • I cut down a few items myself: three little pigs things to finish our Hanami CLI changes for compatibility with Dry CLI. This CLI is just right.

  • After some great feedback from Michael, I made a few adjustments to Dry Logger’s expanded log filtering (like making Regexp filters case insensitive by default, for consistency with string filters), and merged it. Thanks Michael! I also updated Hanami’s default list of filters. Combined with Dry Loggers substring filtering, this will make for a much more filtery out of the box experience.

  • Adam merged his shiny new SQL migrations into Rom SQL, and we’re not far from making them available via Hanami’s generators. This is going to be a great win for anyone making complex schema changes! Thanks Adam!

  • I spent most part of my last week getting Hanami Webconsole diagnostics ready to land. These are how you’ll see enhanced error screens (on top of Andrea’s beautiful new designs) for certain kinds of errors. We’ll ship a couple for Hanami 3.1, and they can be provided by app and gem authors too.

Planet Linux Australia Continuations 2026/43: Perplexing inconsistency

  • Work continues on closing all our open parentheses in the lead-up to the next Hanami release.

  • I started this week fixing a regression in our body params logging. Thanks @Drowze for reporting it! In response to some good feedback from Paweł, I also filed an issue about possibly making body params logging a configurable thing in the future.

    While I was working in this space, I decided it was time we expanded Dry Logger’s log filtering, including substring matching and first-class regex support. This is close to being ready to go, I just need to reply to some good feedback on the PR from Michael.

  • Aaron voiced a perplexing inconsistency in how predicate functions are used as keyword arguments between Dry Types and Dry Schema, and then went and made the change to make them consistent across the two. Thanks Aaron! We even got the docs changed too; this is something we haven’t developed good just-in-time habits around yet, instead putting everything together just before release.

  • My main area of focus this week was Andrea’s improvements to Hanami’s error screens, with a helpful “not found” error being the first example. To start with, I took Andrea’s work to expose full route details at runtime and made it a first-class part of Hanami Router (plus the commensurate change to Hanami CLI). Then I tweaked and merged the error page itself, along with making the slice (and therefore router) available on the underlying error. Thanks Andrea for setting all of this up!

    With that all in place, I’ve been spending some time looking at the bigger picture of how we display our error screens and offer actions the user can take to fix the issue. It’s all coming together, and I hope to have a round of revisions to share soon.

  • Earlier this week we saw GitHub update the Ubuntu for their CI runners, and a related CI errors arose. I fixed all six issues that came up, mostly JRuby and Postgres-related.

Worse Than Failure — CodeSOD: Death of the Auth-Er

When writing Perl, it's not unusual to want to die. The die function ends your Perl program with an error string, and you'll often see code like: die "My error" unless $i > 5 or die "Other error" if check(), because Perl just loves the backwards conditionals. What's even more fun with die is how it behaves with eval blocks, so it doesn't always kill your program, sometimes it is how you pass error strings back out of sections of your program.

And poor Bobby has inherited some Perl that just really loves to die.

public function store()
{
    echo 'Hello'; die;
    if (Auth::attempt(Input::only('email', 'password')))
    {
        echo 'done'; die;
        // return "welcome ".Auth::user()->username
    }
    echo "Oops! Fails"; die;
    return Redirect::back()->with_input();
}

Bobby didn't send the source control history here, but I have a sense of what it likely was like, once. If they authenticate successfully, print a welcome message. If they don't, redirect back to the logon page and let them try again. I suspect they wanted to disable the route. So first they disabled the success path, only to discover that the failure path kept redirecting, so they disabled that too. Finally, they added the Hello at the top to disable the whole thing.

Why? Why did they do any of this? No idea. It feels like debugging code, but you'd expect more echos and fewer dies if that were the case. And you wouldn't expect it to leak into production and sit there for years, which is what happened here.

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

365 Tomorrows — Precision

Author: Majoki Who’s on first? The steal was on. The basis for the running the bases had slid into analytic obscurity. The thinner they sliced, the less they knew. The area under the curve shrank until it became quantumfied and, thus, small ball rules could be invoked. Stilbee fanned the webbing of his mitt in […]

The post Precision appeared first on 365tomorrows.

Krebs on Security — Tech Firms Dismantle Botnet That Turned 1.3M TV Boxes Into Proxies

Google said today it worked with industry partners to dismantle a botnet made up of more than 1.3 million Android TV set-top boxes that ship with malicious software which secretly rents the user’s Internet connection out to strangers and conducts advertising fraud. Experts involved in the takedown say the action is likely to sever the botnet’s access to more than 10 million additional compromised systems, including other Internet of Things (IoT) products such as Android-based healthcare devices and karaoke machines.

A report from the Google Threat Intelligence Group (GTIG) said Google has severed ties with Videostrong Technology Co., a TV box manufacturer in China that GTIG and other industry experts concluded was responsible for including malware that enrolled more than 1.3 million set-top boxes in a botnet dubbed “XCPE” (named after one of the malware’s core code components).

The global distribution of XCPE botnet infections. Image: Google Threat Intelligence Group.

The report said the XCPE botnet loaded the user’s device with software that makes their Internet address available for resale by multiple “residential proxy” services, which allow customers to rent Internet addresses as a way to anonymize their web traffic or spoof their true location. As detailed in several stories here over the past year, residential proxy services are a major source of unwanted and often malicious traffic, including account takeover activity, advertising fraud, and mass content scraping for AI projects.

“Videostrong monetized the backdoor by selling access to criminal affiliates and loading those affiliates’ malware modules onto infected devices,” the GTIG post reads, noting that Google took legal action to take down the domains and servers Videostrong used to control the botnet and install additional malware. “A device manufacturer intentionally infecting their users with malware is an unacceptable breach of trust, and represents a serious risk to those users. Without users’ knowledge or consent, infected devices were offered as a distribution mechanism for a wide array of criminal actors.”

The report notes that while TV boxes made up the the majority of the botnet, the same XCPE malware was found in other Android-based IoT products, including telehealth devices, karaoke machines, and even digital signage systems.

Google said it requires all Android device makers to pass compatibility and security tests to ensure their products don’t harm users, but that Videostrong nevertheless found a way to load their malicious software immediately after a user boots up one of these devices for the first time (Google says it has since addressed that weakness).

The GTIG report calls out a number of residential proxy providers whose software development kits were routinely downloaded by devices infected by the XCPE botnet. Those include AppSalt, also known as Honeygain, which was developed by the Vilnius, Lithuania-based Oxylabs. In October 2026, Oxylabs and Honeygain were reorganized as independent platforms under an umbrella entity called Source, which received $130 million in funding from private equity firm Warburg Pincus that reportedly valued the business at $3.6 billion.

Another provider linked to the botnet was NetNut, a once sprawling residential proxy company operated by the publicly-traded Israeli company Alarum Technologies. In July 2026, the FBI worked with industry partners to seize hundreds of domains associated with NetNut, saying the company was responsible for operating a separate botnet called Popa that enslaved TV boxes as residential proxies. Other proxy providers named in the GTIG report include EarnFM, Traffmonetizer, Jaguar, LINKFOG, BMW/IPWeb and GaGaNode.

Google’s announcement credits a number of industry partners, including Synthient, a startup that tracks proxy providers. In January 2026, Synthient published research into the rapid spread of the Kimwolf botnet, which at the time was hammering networks worldwide with record-smashing DDoS attacks. Synthient documented how Kimwolf infected millions of Android set-top boxes virtually overnight, using a widespread vulnerability in these residential proxy services to compromise other Android-based devices inside the local networks of unsuspecting TV box users.

Synthient’s research caused dozens of residential proxy providers to patch their networks, which helped to fragment the Kimwolf botnet into much smaller pieces that made its incessant and disruptive DDoS attacks far easier for network operators to manage. It also attracted the attention of the Motion Picture Association (MPA), a trade group representing the major Hollywood studios, which partnered with Synthient to purchase and tear apart a number of popular Android TV set-top boxes — including some that were being infected by Kimwolf and other IoT botnets.

In a report published today, Synthient examined a popular, pre-infected TV box sold under the brand MECOOL by a publicly traded company in China called Skyworth Technology, concluding that MECOOL also bundled the malware from Videostrong Technology Co. and likewise installed AppSalt/Honeygain and other proxy components.

The MECOOL storefront and marketing. Image: Synthient.com.

Synthient founder Ben Brundage told KrebsOnSecurity that Videostrong’s malware also distributed software for the proxy service Grass. In our November 2025 story, “Is Your Android TV Streaming Box Part of a Botnet?” we quoted a researcher from Censys who found the popular Superbox TV streaming device bundled Grass’s residential proxy software. We also quoted the Grass founder, who denied any affiliation with the TV box maker.

That November 2025 story noted that Superbox and similar Android TV set-top boxes gain new customers primarily by engaging influencers on Tiktok and other social networks who praise the product’s ability to offer hundreds of (pirated) pay TV streaming services for a one-time fee.

Likewise, Synthient’s report observes that the MECOOL set-top boxes exploded in popularity after the product was mentioned in 2023 by the Youtube channel Linus Tech Tips, which has an audience of nearly 17 million subscribers [Linus Tech Tips said in a statement shared with Synthient that it has since updated the video to explicitly frame the product as a scam and have removed all associated affiliate links].

The popular Youtube channel Linus Tech Tips discussing MECOOL TV streaming boxes.

The GTIG report estimates the XCPE botnet takedown should sever access to at least 10 million additional compromised devices, noting that the various proxy and ad fraud affiliates of Videostrong “each have diversified distribution channels for their modules beyond XCPE.”

Synthient’s Brundage echoed that conclusion, calling the 1.3 million number “highly conservative.”

“The scale of affected devices is likely way higher,” he said. “This is probably the largest operation against backdoored TV boxes that we’ve seen.”

Update, Nov. 5, 11:07 a.m. ET: In a statement shared post-publication, Oxylabs said that while its system is built so that a device can’t be used as a proxy exit node unless they receive a signal that it has consented, the developer faked these signals.

“We have been conducting regular audits of the applications provided by our partners,” the statement reads. “However, following this incident, we will improve the application and application’s build fingerprinting logic to better detect cases where the SDK is running on an unapproved build of an originally authorized application.”

The statement said Oxylabs has no record of any company called Videostrong Technology Co., but it did find between is suppliers the domain “com.abc[.]nexus,” mentioned in the GTIG report as an external malware loader.

“As soon as we saw that, we suspended the relationship and sent them a formal legal inquiry,” the statement reads. “This supplier accounts for less than 1% of our IP address pool. We had a signed contract with them, they assured our QA team that users had given consent, and we saw the consent flow ourselves.”

Further reading:
Plume Security Labs white paper on the XCPE botnet (PDF)
Black Lotus Labs writeup on LinkedIn
TrendAI’s analysis
Synthient’s list of affected devices, broken down by model number

Planet Debian — John Goerzen: Must we always use LLMs this way?

As with my last post on AI, let me open with a statement:

Just because most people hold AI a certain way, doesn’t mean that we always must, either now or in the future.

As I noted in that piece, and my shades of gray post, I am well aware — and agree with — the notion that a lot of frontier AI models have disturbing ethical concerns that we shouldn’t dismiss, including concentration of power and wealth, environmental concerns, unethical scraping and training, the financial bubble they seem to be creating, and more. The most poisonous of AI cheerleaders are accelerating enshittification while cutting quality all over the place. AI slop is also a real problem, which I’ll discuss in a bit.

Before I dive in, I need to mention that no AI assistance was used for writing this post, and I have been using em dashes — correctly — for years before LLMs did. Secondly, while popular discourse seems to use “AI” and “LLM” interchangeably, the AI field is much more broad and much more old than LLMs. I will, nonetheless, adopt the common “AI” jargon here, but be more specific when necessary to differentiate.

In The Reverse Centaur’s Guide to Life After AI by Cory Doctorow, he presented two ideas I particularly want to focus on here:

  1. The present and future of LLMs outside of the cloud-hosted frontier models
  2. What differentiates productive use of AI from slop

The two are related, in fact. Doctorow discussed how he never uses AI to write anything, but he sometimes uses it as an assistant to help him write. Is that contradictory? Not really. He gave this example: he remembered a quote from a podcast, which he wanted to cite and attribute correctly. But he couldn’t remember which podcast or who said it. So he fired up Whisper, an open-weight model you can download and run locally, even on meagre hardware. Whisper is a speech-to-text model. Doctorow ran likely podcast episodes (from the target range and set of podcasts he listens to) through the model, and at that point it was a regular search. He found the quote, then went back and listened to the episode at that time spot to verify its accuracy.

It would have taken so much time to do this without Whisper that he simply would not have done it otherwise. His writing was better because of AI. Not because AI wrote any words for him, but because it helped him find the right ideas and attributions. He didn’t even have to trust its transcription; it pointed him at the right place, and then he could transcribe with precision.

I too have used Whisper in much the same way. A little while back, I digitized many hours of old family audio recordings going back to the 1970s. Thanks to Whisper, which I ran locally primarily during hours of being fully solar-powered, I have a searchable index to these gems. A person I know recently asked me if I knew any way to transcribe some old family recordings he had. I told him I could run it through Whisper. It wouldn’t have great punctuation, but most of the words would be there. This meant a lot to him and his family; what I did in 2 minutes would have taken him many days (I presume he is not a fast typist as well.)

So we can start by naming: AI isn’t just chatbots, and AI can help even if it isn’t writing anything.

Doctorow goes on to ask the question: what happens after the AI bubble bursts? I do believe it will, as Ed Zitron has carefully documented for us for a long time now. The environmental damage done by frontier training and inference in the last few years will, of course, be done. But as he points out, we’ll be left with a plethora of surprisingly-capable open weight models, a community that has made significant strides running them on low-end devices (even phones), and a massive buildup of clean energy that hopefully will be finally able to offset some polluting energy once these heavy users drop off the grid.

So then what? Will the world just throw away the likes of Whisper and Gemma? Obviously not. Doctorow imagines, credibly, a situation in which individuals and universities tinker with locally-run models, iterating on them and improving them with the more traditional scale of resources available to individuals and universities. In other words, this future sounds a lot like the earlier days of Open Source.

As Ed Zitron has pointed out, the real costs of frontier AI have been hidden as these companies rack up fantastical losses. When the bubble bursts, the real costs of frontier AI are likely to be high enough that CEO’s won’t be able to ignore the poor ROI. But we’ll be left with these artifacts, these open-weight starting points, that people can use.

That brings me to my central thesis: a lot of anti-AI sentiment is focused on the real downsides of the hyped uses of AI, and fails to account for the more ethical advances being made now, and likely to come in the future.

Varying quality of AI use

We are all familiar with AI slop. I’ve seen it, and have an increasingly skeptical eye when I see “new” projects announced in even places as niche as a BBS community (where I see things like new terminal emulators announced, written in shockingly-poor nodejs, and such). I’ve seen documents that take many pages to say what amounts to nothing intelligble to a human, with perfect grammar. I’ve seen pull requests that have a description that amounts to several pages of slop. I’ve personally seen an AI agent do things like correctly detect passing an untrusted argument to a shell, then propose a broken quoting algorithm to fix it (rather than proper sanitization and exec() or, better yet, avoiding the call altogether.)

I’ve also seen AI tools very quickly and accurately identify bugs that had passed human review, even professional security reviews, for years. I’ve seen them bring more joy to some people’s jobs by handling the more drudgery parts of the jobs. One of my favorite podcasts, Oxide and Friends, had an episode called Engineering Rigor in the LLM age and credibly described ways in which careful use of LLMs can increase quality and safety. Yes, I said increase. (Oxide and Friends are not hype cheerleaders by any means; these are very serious people with solid technical chops, and I know some of them.)

What accounts for this disconnect?

We can point to many factors, but Doctorow asks a fundamental question: who is in charge? Is it the person or the computer? Does the AI service people, or do people service the AI?

In some of the most ridiculously AI-first companies, it is very clearly the latter. Mandates from CEOs to increase AI usage lead to perverse outcomes that sacrifice quality. The AI is in charge. I’ve never seen an AI be any good at design questions, and it’s no wonder than all these vibe-coded apps have the same generic feeling of crappiness.

But when the AI is used pragmatically as a junior research assistant, that’s a different approach. Its output is greeted skeptically, its actions distrusted, and it’s never asked to design something. These are the cases where I’ve seen it make a meaningful difference.

It’s not black-and-white

All this adds up to why I was opposed to the Debian proposals that would have banned LLM use. Those votes are hard to change. They would have left Debian in a vulnerable position of being unable to react to accurate security findings if they originated with an LLM, or left Debian unable to adopt ethical use of models.

It would be akin to saying “you should never buy a PC because Windows 11 is terrible.” I agree Windows 11 is terrible, but saying something like that is so dismissive of all those that have invested decades of their time in building something better.

So, I find AI hype to be uncredible and dangerous. I also find knee-jerk reactions to AI to be the same. They are actually a form of capitulation: they let the AI megacorps dictate the terms of the conversation to revolve around them.

Case study: Debian’s DFSG scanner

For a long time, my two biggest annoyances with Debian have been the difficulty of packaging Rust and Go packages with their long dependency trees, and how long it takes a new package to get reviewed. About a year ago, the latter process was set on a path to reform, and it has gotten dramatically better. It also cuts off a potential connection with someone that hasn’t yet heard of Linux. Some people may not jump from Windows 11 (or the ChatGPTs of the world) immediately, but pretending that it’s ChatGPT or nothing does a disservice to all those that are trying to do research etchically.

We should state at the outset that Debian takes compliance with the Debian Free Software Guidelines (DFSG) extremely seriously. Every new package gets a review, and these reviews often catch things that upstream repos and other distros don’t. One common example would be a package that has a stated copyright and license, but then includes files that bear a different copyright and license.

You can imagine reviewing packages at this level of detail isn’t a fun task for people, and it’s hard to find volunteers to do it. Perhaps the answer to this should be “Debian should stop caring so much more than everyone else”, and perhaps you’re right (and perhaps you aren’t).

In any case, the DFSG team that reviews this added what amounts to an LLM-backed license linter. Its job is to produce an initial assessment that the license statements documented in debian/copyright are correct, thorough, and in compliance with DFSG. This report was not taken to be authoritative, but was designed to help with some initial assessments.

There were some predictable reactions. People were angry that the DFSG team had added this tool without any communication about it (justifiably so, I’d say). Many were angry just because of LLM. People made assumptions about what kind of model it used, what kind of quality it would produce, how definitive it would be in the project.

It is worth noting here that Debian is uniquely decentralized. There is a central policy, but maintainers are free to maintain their packages how they like. They don’t have to use a standard location for a Git repo, or even use Git.

One person said essentially, “it’s fine for others to use whatever tool they want, but I shouldn’t have to be exposed to LLM slop.” The other perspective boiled down to, “why should they keep the reports secret? If you want to proactively fix things, or flag false positives, why not?”

As Andreas Tille wrote, “I have read the LLM reviews carefully, and in many cases their findings inspired additional commits to improve my packaging. In some cases, they even helped me catch mistakes that led me to reject an upload myself before human inspection.”

Joey Hess raises an interesting risk: that LLMs will remove the incentive for Debian to actually fix its cumbersome processes, by letting an LLM paper them over. I have seen this tendency in other contexts, both at work and at home, as well. It’s a real risk, especially if Debian doesn’t tackle the packaging problem for Rust and Go.

The Mastodon post that prompted me to write this began a chain of events that started with “Uploaders will be forced to address LLMs issues without human inspection.” I don’t believe that will be the case; it goes too far against the Debian ethos.

I encourage everyone to take a deep breath. We are all getting used to a shifting landscape. We will all make missteps, myself included. The issues are complicated, the picture isn’t black and white, and there is incredible hype around the ecosystem that can make finding nuance difficult.

Let’s be kind to each other, fellow humans.

But, I do not care if you are kind to Claude.

,

Planet Debian — Dirk Eddelbuettel: myman 0.13.0 on CRAN: Another wave!

Another new version of our still-new-ish package myman reached CRAN this morning, and has been built for r2u and on r-universe. The matching Python package has also been updated. The package offers twenty two hundred eighty four “My man …” posts by Kevin Kruse made on bsky during the summer of 2026. Each wave picked at one particular public persona. This package wrapse these up in the style of packages like fortunes or gaussfacts.

This release contains a new wave from October 31 to November 1 poking fun at Mike Johnson—just in time for the election.

So have a chuckle, and then go out and vote! The short NEWS entry for this release follows.

Changes in version 0.13.0 (2026-11-02)

  • New wave thirteen (100 posts); total is now 2284 posts

Courtesy of my CRANberries, there is also a diffstat report for the most recent release. More information is available at the repository or the package page.

This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. If you like this or other open-source work I do, you can sponsor me at GitHub.

Cryptogram AI Vulnerability Finding

A comment:

3% of ‘critical’ software security bugs, in all of recorded history, have been found in the last month. This is on pace to find another ~100,000 bugs this year alone, adding ~26% more vulnerabilities to the all time total Do you realize how fucking insane that is?

Yes. It is a new world out there.

Mike Bowler — Limiting beliefs

A couple of weeks ago I came across a post on social media from a tester who’d just had an uncomfortable conversation with one of her team leads. She’d been asked to stop rejecting tickets because some of the developers were taking the rejections personally, as if it meant they hadn’t done their jobs properly.

My first reaction was that the team lead needed to build some leadership skills, and I still think that. Telling a tester to stop finding problems doesn’t fix the problems; it just hides them. My second reaction was to consider the unspoken beliefs in what she was saying.

Adding more context, she explained the developers worked for an outsourcing company, and their project manager had told her that the rejections were the reason they’d had to do layoffs. More precisely, there was a specific belief that “Many rejections == layoffs”.

“Mental models [beliefs] are habits of thinking, learned, repeated and acted on without reflection.”
Joseph O’Connor and Andrea Lages, “Coaching the Brain”

O’Connor and Lages specifically avoid the term belief as they feel it’s too often connected with religious thinking, and they want to be clear what they mean.

They also point out that coaching doesn’t deal with whether a belief is true, only with its effect on the person holding it. This one meant that the tester was being pushed to let poor quality through, and the developers were treating every rejected ticket as a threat to their jobs.

Limiting beliefs often take one of two shapes. Either one thing means another (rejections mean layoffs) or one thing causes another (rejections cause layoffs). This one collapses both into a single equation.

Why do beliefs like this stick so well? Because they live in System 1, the fast, automatic part of our thinking. System 1 is biased to believe. It doesn’t stop to ask whether the evidence is good enough; it takes what’s in front of it and runs. In O’Connor and Lages’ words, “System 1 jumps to conclusions, especially about cause and effect.” Rejections came first, layoffs came after, so the rejections must have caused the layoffs.

She also mentioned that the team had been through layoffs before she joined, and a single significant event is one of the ways O’Connor and Lages describe mental models forming. One painful round of layoffs, and System 1 has a rule it can apply instantly, forever, without ever being asked to justify it.

Doubting is System 2’s job, and System 2 is slow and easily distracted. So if we want to loosen a belief, we need to get System 2 involved, and that means asking the kinds of questions that System 1 can’t answer on autopilot.

There’s a set of 14 language patterns that Robert Dilts collectively called Sleight of Mouth1, and they’re very useful here. Without getting into the theory, here are some examples applied to “many rejections == layoffs”.

  1. Reality strategy: “How do you know the rejections caused the layoffs?” Was there a contractual rule for the vendor? Did someone actually say so, or was it inferred?

  2. Model of the world: “Some vendors see rejections as free QA that keeps them from losing the client.”

  3. Counter example: “Have there been sprints with lots of rejections and no layoffs? Have there been layoffs when the rejections were low?”

  4. Intent: “Maybe the rejections are causing some people to become embarrassed and they’re lashing out with threats of layoffs.” Dilts points out that limiting beliefs about other people generally assume some kind of negative intention on their part2. Embarrassment is a far more workable problem than malice.

  5. Redefine: “A rejection isn’t a failure report, it’s a defect caught before the customer saw it.”

  6. Chunk up: “Are you saying the vendor’s survival depends on never being told about a defect?”

  7. Chunk down: “What specifically is causing the threat of layoff?” Beliefs live at a level of generality that makes them hard to examine. Asking for specifics forces the belief to show its working.

  8. Metaphor: “If a smoke detector goes off, do we fire the detector?”

  9. Another outcome: “The real question isn’t how many tickets get rejected, it’s how many defects reach the customer.”

  10. Consequence: “What happens to the vendor when the poor quality that wasn’t rejected reaches the customer instead?” The belief protects the developers this sprint and puts them at greater risk in the next one.

  11. Hierarchy of criteria: “Isn’t keeping the client more important than keeping the rejection count low?”

  12. Apply to self: “If rejections cause layoffs, should the project manager be worried about people rejecting that explanation?”

  13. Change frame size: “Over the length of the contract, which costs the vendor more: rejections now or a lost client later?”

  14. Meta frame: “That belief makes sense for someone who’s lived through layoffs. It might not be about the rejections at all.”

None of these argue with the belief directly. Each one asks System 2 to take a look at something System 1 had been handling on its own.

It’s also possible that the reality strategy question turns up something real. If the contract really does penalize the vendor for rejections, then the belief isn’t wrong; it’s pointing at a system problem. That’s no longer something a tester can fix by thinking differently; it’s something leadership needs to change, and that’s a different post.

Around the same time, a manager in a private group I’m part of described a firmware team he’d recently taken over. That team believed two things. First, that code which had already proven itself in the field couldn’t safely be refactored or changed in any way unless a safety issue had been found. Second, that the safety standards they worked under forbade pair programming as unsafe. Every change he proposed got rejected as non-compliant and unsafe.

As far as he could tell, the standards said no such thing, but it didn’t matter.

You might be thinking “so show them the standard.” He could, and I doubt it would help. Producing the document is a counter example, and it’s the pattern most of us reach for first because it feels like it ought to settle things. On its own it rarely does. That belief wasn’t built from the standard, so the standard isn’t going to take it apart. When the belief is coupled to something as important as safety, any challenge is going to feel like a threat, and threat is exactly the condition that keeps us in System 1.

Intent is the pattern I’d expect to land better here. The team’s intent is safety, and so is his. Starting from “we both want this code to be safe, so what’s the best way to verify it?” puts him on the same side of the table as the team, and pairing becomes one more way to get to the thing they already care about.

Consequence is the other lever. Code that nobody dares touch doesn’t stay safe. Over time it becomes the code nobody understands, and that’s its own kind of risk.

O’Connor and Lages suggest that the best intervention for a limiting mental model is to engage System 2 and agree on a small action that will give good feedback. For this team, that might be pairing on one low-risk change and seeing what the experience is actually like. A belief that’s been tested against real experience is much easier to let go of than one that’s been argued with.

None of this is unique to testers or firmware teams. Every team runs on beliefs like these and most of them are never said out loud. They only show up when somebody bumps into one, and from the outside that looks like stubbornness, or resistance.

In both cases the people holding the belief cared about something real. Jobs matter. Safety matters. The belief was a shortcut to protect that thing, and somewhere along the way it stopped doing its job.

Don’t argue with the belief. Unpack it instead, to see what it’s built on.

Worse Than Failure — CodeSOD: Get It Now

"TODO" comments are an inescapable part of our work. Yes, yes, you should just do it right the first time, everything should probably have a ticket in whatever your ticket system is for visibility, but at some point, you're just going to leave a "TODO" behind.

But hopefully, the TODO gets TODONE, which is not what happened in Sam C's codebase.

function getnow()
{
    //TODO
    return '2012';
}

It's the XKCD, but for years. Or WHAT YEAR IS IN memes.

At least it's a relatively recent year, not some far off point from over a decade ago.

Wait. 2012 was how long ago? That can't be right. It was just a few years ago!

[Advertisement] Plan Your .NET 9 Migration with Confidence
Your journey to .NET 9 is more than just one decision.Avoid migration migraines with the advice in this free guide. Download Free Guide Now!

xkcd — Elevators

,

Planet Debian — Vasudev Kamath: Releasing debvulns with needrestart and kernel vulnerability handling

After quite some time, I picked up debvulns again to implement what I mentioned in my previous post: exporting reboot required status and identifying services that need a restart. Additionally, I wanted to ensure kernel vulnerabilities are not marked as fixed unless the running kernel matches or exceeds the fixed version. Both features are now live in version 0.2.4 (intermediate release 0.2.3 only included the needrestart functionality).

Why needrestart?

When you update packages on a system, security fixes do not take effect until running processes actually use the updated binaries from disk. When an upgrade occurs, existing processes continue executing the older, vulnerable code loaded into memory, while only newly spawned instances pick up the fixed binary. The needrestart package in Debian exists specifically for this purpose. It can run in either report mode or action mode: report mode provides machine-readable output, while action mode automatically restarts affected services.

Why integrate needrestart into debvulns?

needrestart is a standalone utility that can run independently or hook into apt to run automatically after an upgrade. On desktop systems, it typically runs interactively with a TUI prompt; on headless servers, it can be set to take non-interactive default actions. In batch mode, it avoids restarting sensitive system components (such as dbus) to prevent destabilizing the session.

Integrating this into debvulns is not about replacing needrestart or debsecan, but rather bringing vulnerability and remediation state into a single, discoverable interface. debvulns aggregates these signals into a standard format—in this case, Prometheus metrics and tags that can be visualized in Grafana, monitored by alerting systems, or consumed downstream by automation tools.

Why Special Handling for Kernel?

Just as user-space daemons require a restart after patching, a patched kernel requires a system reboot into the new image before the vulnerability is truly mitigated. Previously, debvulns only verified whether the patched package version was installed on disk. If the deb package was installed, the CVE was marked as resolved, which creates a false sense of security while running the old kernel.

With this release, debvulns now checks the active running kernel release. A kernel vulnerability is considered resolved only when the system is running the fixed kernel version. Until a reboot happens, the system remains reported as vulnerable.

The updated dashboard reflects these changes below. It will need further polish, but key metrics and restart/reboot states are now visible:

debvulns Grafana dashboard with needrestart and kernel metrics

What Next?

These were the two pending functional areas I wanted to cover, and no further major features are planned for now. Next up will be reviewing the entire codebase to identify potential optimizations and remove any unnecessary complexity. I haven't done a full pass through the repository since the initial skeleton implementation, so testing edge cases and cleaning up the internals will be the main focus. This will likely take some time since I only hack on this during weekend downtime. Until then, happy hacking, give the new release a try, and file an issue if you run into bugs.

Charles Stross — On the non-use of AI in my writing process

This isn't a blog entry I wanted to write, but it's a necessary one: a statement about the use of generative large language models (colloquially "AI") in my work.

I do not use LLMs in my work. I don't use them in my non-work life either, for that matter. I despise the grifters selling these toys as "tools" and trying to convince us to use them to generate plausible answer-shaped text strings in place of actual internet search for verifiable sources.

I've been selling fiction that I wrote myself since 1985 or thereabouts, and novels since 2002. If you want to verify that I have written novels without using an AI, simply pick up a physical copy of "Singularity Sky", "Iron Sunrise", "The Atrocity Archives", or anything else I published before 2015, the year OpenAI was founded.

Hint: you will find seven Hugo-shortlisted novels from that period, and three Hugo-winning novellas, also two Locus-award winning novels and a couple more novellas and stories. Clearly I don't need AI to write award-winning stories.

I do not want or need a large language model to write my fiction for me. I write fiction compulsively—before I was published I wrote for many years as a hobbyist—so why on earth would I pay someone else to take my fun away?

You will note em-dashes in the preceding paragraph. I gather some "AI detector" services (themselves a generative AI product) flag em-dashes as signs of "AI generated" text. Listen, fuckers, LLMs sprinkle em-dashes in their output because LLMs exist to stochastically emit strings of text that approximate the form of their inputs, and they've been trained by stealing all the text on the internet that isn't nailed down, including pirate websites that distribute cracked e-books. So it's wholly unsurprising that LLM output exhibits quirks that mimic real writers.

Did I mention the "stealing" thing? This isn't hyperbole: I'm one of the parties to the settlement in the class action lawsuit against Anthropic AI for pirating ebooks to train their LLMs. That's not my only grievance, either. You may have noticed this blog performing sluggishly or crapping out from time to time over the past few months. That's because my server is old and feeble and periodically gets swarmed by Chinese and other foreign botnets scraping data for training LLMs.

I'm usually willing to cut actual human beings, as opposed to for-profit corporations, some slack where it comes to cracking DRM, or even downloading warez: but these people are absolute scum. They're stealing copyrighted material to train an LLM that is intended to compete for revenue with the authors of the works they stole, and they're fine-tuning their LLMs to make them as addictive as possible in order to maximize future revenue once they pivot to token sales as their main source of income. In other words, they're no different from a burglar who robs you one day then comes round to sell you your stuff back the next morning. Back in the 18th century we used to hang people like that and Sam Altman makes me question the wisdom of having stopped.

I maintain that any serious author should shun LLMs like the plague. The most popular LLMs in the west—such as Claude, Gemini, CoPilot, and ChatGPT—the ones hoovering text indiscriminately off the internet for training—also gobble up any queries you send to them and use them as future training data. If I was crazy enough to feed the outline of a story I was working on as a prompt to ChatGPT or Claude in hope of getting the stochastic parrot to do my homework for me, then it would be only my own fault and nobody else's if the next model from the company in question was trained on my book outline and could reproduce part or all of it for someone else.

Finally, contra public opinion, I see no reason to credit LLMs with sentience. They're word-association mechanisms with no embodiment and no way to associate the text vectors they manipulate with real-world phenomena. But we humans have evolved through selection pressure in an adversarial environment to associate environmental phenomena around us with intentional causes—if you see lion scat and the gazelle are no longer visiting the watering hole, then you should assume there are lions about. And this trait carries over to linguistic manipulation. If we hear or read text, we expect there to be a mind on the other side of it, as Joseph Weizenbaum (the inventor of the original ELIZA chatbot) realized at MIT in the late 1960s. Just because it does something people do, it does not follow that it is a person.

Now for some caveats.

My skepticism does not carry over to all aspects of the field. It would be foolish to deny the effectiveness of image recognizers based on generalized adversarial networks (GANs), the key neural network technology underlying LLMs. It'd be similarly stupid to deny that LLMs are very good at supporting large-scale statistical analysis of text, such as Linear-A. And I can see some circumstances where being able to train a local model on my work could be useful to me.

I'd quite like a tool (running entirely locally on my own hardware, with no cloud service and no copyright-thieving grifters making bank on it via subscription fees) that digests a manuscript and derives a scene-by-scene timeline, that I could then query interactively and use to plan my next round of edits. Being able to map out where and when each protagonist and minor character shows up, and see a frequency distribution heat map of names in the manuscript, would be useful.

But such a tool would be useful to me in the same way a spelling checker is useful—as a decision-support tool, not as a substitute for doing the hard work (and having a copy of the Oxford English Dictionary on the shelf). The value of such a tool is considerably less than the value of a well-trained brain that can do the entire job the hard way, if necessary. And it's less than zero if using it opens me to finger-pointing accusations of "but he's using AI!" by people who can't read to the end of one paragraph, much less fourteen of them (yes, this is para fourteen, I've been counting).

So my fiction is still, as of August 2026, 100% LLM-free, and if that changes I will update this declaration accordingly.

Finally, I'd like to leave you with a snippet from the opening of the far future space opera I'm editing right now. It's part of the fiction and unfortunately may have to be omitted because of the risk of confusing the people who can't read to the end of the paragraph, but it's the only valid use of LLMs I've found so far for my fiction because it's a solution to the calling a rabbit a smeerp problem in SF and fantasy:

Translator's Note

The events described in this account have been translated into your language from the original source material using a non-sapient large language model.

Certain terms have been approximated, where possible, by using culturally appropriate cognates. Names of individuals have been replaced by equivalents. Similarly, institutions, ranks, religions, proverbs, idioms, quotations, and other culturally-determined signifiers have been translated into terms that will be familiar to the reader.

Units of duration and distance have also been converted.

We apologize in advance for any hallucinations our LLM may have inadvertently introduced in the process of generating this rough translation.

Planet Debian — Vincent Bernat: Network lab with QEMU

To experiment with network stuff, I was using UML-based network labs. Many alternatives exist, like GNS3, Netkit, Marionnet or Cloonix. All of them are great viable solutions but I still prefer to stick to my minimal home-made solution with UML virtual machines. Here is why:

  • I didn’t want to use disk images. They take a lot of space and they have to be maintained. They also become cluttered, especially if you try to reuse them across several labs. They are also difficult to share.
  • I want to be able to access my home directory. It contains the important configuration files related to the lab and I can put them in the right place thanks to symbolic links when the lab starts. It also makes exchanging files with the lab quite easy.
  • I don’t want to boot a complete system. This allows me to be cheap on memory and each virtual system should boot in a few seconds.

The use of UML had some drawbacks:

  • It may be buggy. For example, it is currently not possible to use gdbserver inside UML without a patch. Sometimes, the kernel won’t even compile.
  • It is slow.

However, UML features HostFS, a filesystem providing access to any part of the host filesystem. This is the killer feature which allows me to not use any virtual disk image and to get access to my home directory right from the guest.

I discovered recently that QEMU provided 9P, a similar filesystem on top of VirtIO, the paravirtualized IO framework.

Setting up the lab

The setup of the lab is done with a single self-contained shell file. The layout is similar to what I have done with UML. I will only highlight here the most interesting steps.

Booting QEMU with a minimal kernel

My initial goal was to experiment with Nicolas Dichtel’s IPv6 ECMP patch. Therefore, I needed to configure a custom kernel. I have started from make defconfig, removed everything that was not necessary, added what I needed for my lab (mostly network stuff) and added the appropriate options for VirtIO drivers:

CONFIG_NET_9P_VIRTIO=y
CONFIG_VIRTIO_BLK=y
CONFIG_VIRTIO_NET=y
CONFIG_VIRTIO_CONSOLE=y
CONFIG_HW_RANDOM_VIRTIO=y
CONFIG_VIRTIO=y
CONFIG_VIRTIO_RING=y
CONFIG_VIRTIO_PCI=y
CONFIG_VIRTIO_BALLOON=y
CONFIG_VIRTIO_MMIO=y

No modules. Grab the complete configuration if you want to have a look.

From here, you can start your kernel with the following command ($LINUX is the appropriate bzImage):

qemu-system-x86_64 \
  -m 256m \
  -display none \
  -nodefconfig -no-user-config -nodefaults \
  \
  -chardev stdio,id=charserial0,signal=off \
  -device isa-serial,chardev=charserial0,id=serial0 \
  \
  -chardev socket,id=con0,path=$TMP/vm-$name-console.pipe,server,nowait \
  -mon chardev=con0,mode=readline,default \
  \
  -kernel $LINUX \
  -append "init=/bin/sh console=ttyS0"

Since there is no disk to boot from, the kernel will panic when trying to mount the root filesystem. QEMU is configured to not display video output (-display none). A serial port is defined and uses stdio as a backend.1 The kernel is configured to use this serial port as a console (console=ttyS0). A VirtIO console could have been used instead but it seems it is not possible to make it work early in the boot process.

The QEMU monitor is setup to listen on a Unix socket. It is possible to connect to it with socat UNIX:$TMP/vm-$name-console.pipe -.

Initial ramdisk

Update (2012-10)

I was initially unable to mount the host filesystem as the root filesystem for the guest directly by the kernel. In a comment, Josh Triplett told me to use /dev/root as the mount tag to solve this problem. I keep using an initrd in this post but the lab on GitHub has been updated to not use one.

Here is how to build a small initial ramdisk:

# Setup initrd
setup_initrd() {
    info "Build initrd"
    DESTDIR=$TMP/initrd
    mkdir -p $DESTDIR

    # Setup busybox
    copy_exec $($WHICH busybox) /bin/busybox
    for applet in $(${DESTDIR}/bin/busybox --list); do
        ln -s busybox ${DESTDIR}/bin/${applet}
    done

    # Setup init
    cp $PROGNAME ${DESTDIR}/init

    cd "${DESTDIR}" && find . | \
       cpio --quiet -R 0:0 -o -H newc | \
       gzip > $TMP/initrd.gz
}

The copy_exec function is stolen from the initramfs-tools package in Debian. It will ensure that the appropriate libraries are also copied. Another solution would have been to use a static busybox.

The setup script is copied as /init in the initial ramdisk. It will detect it has been invoked as such. If it were omitted, a shell would be spawned instead. Remove the cp call if you want to experiment manually.

The flag -initrd allows QEMU to use this initial ramdisk.

Root filesystem

Let’s mount our root filesystem using 9P. This is quite easy. First QEMU needs to be configured to export the host filesystem to the guest:

qemu-system-x86_64 \
  ${PREVIOUS_ARGS} \
  -fsdev local,security_model=passthrough,id=fsdev-root,path=${ROOT},readonly \
  -device virtio-9p-pci,id=fs-root,fsdev=fsdev-root,mount_tag=rootshare

${ROOT} can either be / or any directory containing a complete filesystem. Mounting it from the guest is quite easy:

mkdir -p /target/ro
mount -t 9p rootshare /target/ro -o trans=virtio,version=9p2000.u

You should find a complete root filesystem inside /target/ro. I have used version=9p2000.u instead of version=9p2000.L because the latter does not allow a program to mount() a host mount point.2

Now, you have a read-only root filesystem (because you do not want to mess with your existing root filesystem and moreover, you did not run this lab as root, did you?). Let’s use a union filesystem. Debian comes with AUFS while Ubuntu and OpenWRT have migrated to overlayfs. I was previously using AUFS but got errors on some specific cases. It is still not clear which one will end up in the kernel. So, let’s try overlayfs.

I didn’t find any patchset ready to be applied on top of my kernel tree. I was working with David Miller’s net-next tree. Here is how I have applied the overlayfs patch on top of it:

$ git remote add torvalds git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
$ git fetch torvalds
$ git remote add overlayfs git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/vfs.git
$ git fetch overlayfs
$ git merge-base overlayfs.v15 v3.6
4cbe5a555fa58a79b6ecbb6c531b8bab0650778d
$ git checkout -b net-next+overlayfs
$ git cherry-pick 4cbe5a555fa58a79b6ecbb6c531b8bab0650778d..overlayfs.v15

Don’t forget to enable CONFIG_OVERLAYFS_FS in .config. Here is how I configured the whole root filesystem:

info "Setup overlayfs"
mkdir /target
mkdir /target/ro
mkdir /target/rw
mkdir /target/overlay
# Version 9p2000.u allows one to access /dev, /sys and mount new
# partitions over them. This is not the case for 9p2000.L.
mount -t 9p        rootshare /target/ro      -o trans=virtio,version=9p2000.u
mount -t tmpfs     tmpfs     /target/rw      -o rw
mount -t overlayfs overlayfs /target/overlay -o lowerdir=/target/ro,upperdir=/target/rw
mount -n -t proc  proc /target/overlay/proc
mount -n -t sysfs sys  /target/overlay/sys

info "Mount home directory on /root"
mount -t 9p homeshare /target/overlay/root -o trans=virtio,version=9p2000.L,access=0,rw

info "Mount lab directory on /lab"
mkdir /target/overlay/lab
mount -t 9p labshare /target/overlay/lab -o trans=virtio,version=9p2000.L,access=0,rw

info "Chroot"
export STATE=1
cp "$PROGNAME" /target/overlay
exec chroot /target/overlay "$PROGNAME"

You have to export your ${HOME} and the lab directory from host:

qemu-system-x86_64 \
  ${PREVIOUS_ARGS} \
  -fsdev local,security_model=passthrough,id=fsdev-root,path=${ROOT},readonly \
  -device virtio-9p-pci,id=fs-root,fsdev=fsdev-root,mount_tag=rootshare \
  -fsdev local,security_model=none,id=fsdev-home,path=${HOME} \
  -device virtio-9p-pci,id=fs-home,fsdev=fsdev-home,mount_tag=homeshare \
  -fsdev local,security_model=none,id=fsdev-lab,path=$(dirname "$PROGNAME") \
  -device virtio-9p-pci,id=fs-lab,fsdev=fsdev-lab,mount_tag=labshare

Network

You know what is missing from our network lab? Network setup. For each LAN that I will need, I spawn a VDE switch:

# Setup a VDE switch
setup_switch() {
    info "Setup switch $1"
    screen -t "sw-$1" \
        start-stop-daemon --make-pidfile --pidfile "$TMP/switch-$1.pid" \
        --start --startas $($WHICH vde_switch) -- \
        --sock "$TMP/switch-$1.sock"
    screen -X select 0
}

To attach an interface to the newly created LAN, I use:

mac=$(echo $name-$net | sha1sum | \
            awk '{print "52:54:" substr($1,0,2) ":" substr($1, 2, 2) ":" substr($1, 4, 2) ":" substr($1, 6, 2)}')
qemu-system-x86_64 \
  ${PREVIOUS_ARGS} \
  -net nic,model=virtio,macaddr=$mac,vlan=$net \
  -net vde,sock=$TMP/switch-$net.sock,vlan=$net

The use of a VDE switch allows me to run the lab as a non-root user. It is possible to give Internet access to each VM, either by using the -net user flag or using slirpvde on a special switch. I prefer the latter solution since it will allow the VMs to speak to each other.

Debugging

This lab was mostly done to debug both the kernel and Quagga. Each of them can be debugged remotely.

Kernel debugging

While the kernel features KGDB, its own debugger, compatible with GDB, it is easier to use the remote GDB server built inside QEMU.

qemu-system-x86_64 \
  ${PREVIOUS_ARGS} \
  -gdb unix:$TMP/vm-$name-gdb.pipe,server,nowait

To connect to the remote GDB server from the host, first locate the vmlinux file at the root of the source tree and run GDB on it. The kernel has to be compiled with CONFIG_DEBUG_INFO=y to get the appropriate debugging symbols. Then, use socat with the Unix socket to attach to the remote debugger:

$ gdb vmlinux
GNU gdb (GDB) 7.4.1-debian
Reading symbols from /home/bernat/src/linux/vmlinux...done.
(gdb) target remote | socat UNIX:$TMP/vm-r1-gdb.pipe -
Remote debugging using | socat UNIX:/tmp/tmp.W36qWnrCEj/vm-r1-gdb.pipe -
native_safe_halt () at /home/bernat/src/linux/arch/x86/include/asm/irqflags.h:50
50  }
(gdb)

You can now set breakpoints and resume the execution of the kernel.

It is easier to debug the kernel if optimizations are not enabled. However, it is not possible to disable them globally. You can however disable them for some files. For example, to debug net/ipv6/route.c, add CFLAGS_route.o = -O0 to net/ipv6/Makefile, remove net/ipv6/route.o and type make.

Userland debugging

To debug a program inside QEMU, you can just use gdb as usual. Your $HOME directory is available and it should therefore be straightforward. However, if you want to perform some remote debugging, that’s quite easy. Add a new serial port to QEMU:

qemu-system-x86_64 \
  ${PREVIOUS_ARGS} \
  -chardev socket,id=charserial1,path=$TMP/vm-$name-serial.pipe,server,nowait \
  -device isa-serial,chardev=charserial1,id=serial1

Start gdbserver in the guest:

$ libtool execute gdbserver /dev/ttyS1 zebra/zebra
Process /root/code/orange/quagga/build/zebra/.libs/lt-zebra created; pid = 800
Remote debugging using /dev/ttyS1

And from the host, you can attach to the remote process:

$ libtool execute gdb zebra/zebra
GNU gdb (GDB) 7.4.1-debian
Reading symbols from /home/bernat/code/orange/quagga/build/zebra/.libs/lt-zebra...done.
(gdb) target remote | socat UNIX:/tmp/tmp.W36qWnrCEj/vm-r1-serial.pipe -
Remote debugging using | socat UNIX:/tmp/tmp.W36qWnrCEj/vm-r1-serial.pipe -
Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
0x00007ffff7dddaf0 in ?? () from /lib64/ld-linux-x86-64.so.2
(gdb)

Demo

For a demo, have a look at the following video:


  1. stdio is configured such that signals are not enabled. QEMU will not stop when receiving SIGINT. This is important for the usage we want to have. ↩

  2. Therefore, it is not possible to mount a fresh /proc on top of the existing one. I have searched a bit but did not find why. Any comments on this are welcome. ↩

365 Tomorrows — Sunset with Coffee

Author: Julian Miles, Staff Writer Some things never change. Doesn’t matter if it’s under the multi-hued metal ceiling panels of solar stations orbiting Venus, or a cafe on London Island, with the ruined face of Big Ben a few metres above you. The time between ordering a coffee and it arriving always seems to stretch […]

The post Sunset with Coffee appeared first on 365tomorrows.

Planet Linux Australia — Audiobooks – July 2026

Alfred Hitchcock: A Brief Life by Peter Ackroyd

Short biography covers the basics without going into excessive detail but covers the highlights. Worth a read to get the general picture of his life 4/5

The Platinum Age of Television: From I Love Lucy to the Walking Dead, How TV Became Terrific by David Bianculli

Despite it’s title it traces the evolution and keys shows in each genre towards 1999 – 2016 era (The Sopranos to when the book released). Interesting and wide-ranging although US and author centric. 4/5

My Audiobook Scoring System

  • 5/5 = Brilliant, top 5 book of the year
  • 4/5 = Above average, strongly recommend
  • 3/5 = Average. in the middle 70% of books I read
  • 2/5 = Disappointing
  • 1/5 = Did not like at all

Share

Planet Debian — Birger Schacht: Status update, September + October 2026

Debian Related Work

  • Uploaded fuzzel 1.15.0+ds-1 to unstable
  • Uploaded foot 1.28.0-1 to unstable
  • Uploaded swayimg 5.6-1 and 5.7-1 to unstable
  • Uploaded wdisplays 1.3.0-1 to unstable
  • Orphaned usbguard with version 1.1.4+ds-5 and usbguard-notifier with version 0.1.0-4

The orphaning of usbguard and usbguard-notifier is because I don’t use those packages anymore. I rather spend my time on FOSS projects in areas I get something out of. This is also due to a growing frustration with the Debian community. The discussions on the mailing lists in the recent months lacked any sense of social etiquette. The delusional conviction that certain tools improve the work environment for EVERYONE took on religious overtones.

This is all the more troubling now that even central infrastructure is being drawn into this forced “blessing.” And it seems there is absolutely no awareness here of the boundary violations that are being normalized. Reminds me a bit of christian missionaries.

DH Related Work

In the APIS project I finally merged the search app I wrote a couple of months ago. Based on the proof of concept for the HTMX autocomplete, I implemented an autocomplete that uses the search app for the results, therefore allowing to list search results of multiple content types. I released 0.68, 0.69, 0.70, 0.71 and 0.72 of the APIS framework. The 0.68 release changed the way we list the Django content types, leading to less database hits. In the 0.71 release I refactored the detail & edit views for generic models.

40C3

I was torn about whether I should go to this years congress, but in the end I decided to go again. I guess it will be something about the 20th time I’m attending.

365 Tomorrows — Xoicho’s Sigil

Author: Hillary Lyon Xoicho adjusted the tiny laser on the tip of her stylus before returning to her flesh canvas. “Ever since I landed here, I’ve heard horror stories about—things—devils?—rising up out of the dunes. You’re sure this will ward them off?” Her customer, Brody, asked. “My ancestors used this for generations. Long before your […]

The post Xoicho’s Sigil appeared first on 365tomorrows.

,

David Brin — More curated jpegs that distill zingers for fence sitters.

 Lack of time - and the imminence of voting - means that I'll do same as last time... offer a few pungent links and even more pungent images that I've collected across years.

The previous two postings offer some of the best.  (My favorite shows Trump's giddy love fests with Kim Jong Un, Vlad Putin, MBS and every variety of tyrant.) Here I'll also repeat my text-rich 1-pager of challenges for those still rationalizing obscene treason, but who may still have glimmers of residual sanity that might be reached.

                 SCROLL DOWN FOR THE MARCH OF THE JPEGS!


       == News blips ==

"Hegseth reportedly fires U.S. top military planner as Trump downplays Iran peace talks." Since day one of Trump I've predicted his mafia would try to bend the US officer corps (USOC) to its will by every means. Yes, I speak often about blackmail, which is standard for all but a few GOP politicians. But they are stymied by the professionalism and sagacity of the USOC. And hence, in Trump#2 one of the first things they did was fire almost all of the JAGs who can advise officers about illegal orders. Now it's up to the courageous to STAY at their posts and demand a court martial! Hegs won't dare! 

"Trump Claims He’ll Soon Officially Ban The Term ‘Artificial Intelligence." Idiotic on so many levels though indicative of supreme, inperial yearnings. One of you in comments suggested last time: "I'd reverse SI and use Imitation Sapience (IS). Has a nice Bletchley ring to it as well."  Anyway, do see my AI book: AIlien Minds.

Remember my uplifted 'neo-dogs'? Well, some eager-beager, gung-ho contractors are pushing new kinds of military/police dogs, even cyborgs, that might be effective in combat... or else at controlling civilians... 

*** Californians: Here's a ballot recommendation list that I trust. Plus two points:

1. All of the state-level judges were appointed by Jerry Brown or by Newsom. August and sagacious professionals who show just how diametrically opposite the parties have become.

2. I agree with Newsom that Proposition 40 - the Billionaire Wealth Tax - is flawed. It shows no flexibility to prevent the zillionaires from simply leaving. Nevertheless i'll vote yes on 40 for one reason, in order to fire a shot over the moguls' bows and get them to negotiate. 

Actually, passing 40 won't matter that much. What matters far more is to defeat 41 & 42! If those pass, zillionaires will NEVER negotiate!  

* And disease!  Correlation is not causation. But Covid hit while Trump (at-best) fumbled. Now? Measles, Dengue, Screw-worm, and literally a dozen other infectious plagues that had been driven out of the USA are swarming back while the Foxites slash the CDC and all our other health and emergency services. And POLIO was on the ropes, nearly extinct... till resurging where US efforts were sabotaged under Trump.  This takes very special stoopid. Or else sabotage.


       == Images that  zing! ==

Okay... here's a bunch. When your MAGA says "You have your 'facts' and jpegs and and I have mine!" answer with 'My assertions are fact checkable with $$$ wager stakes on the line. Will you do that? Back em up with cash? With accountability?" Watch him flee! Or else he might decide to learn something.

Drag these onto desktop to expand and share.







*Of course that's "ear-wound". Cartilage doesnt heal! No independent doctor confirmed a thing. And watch the video where he clearly turns away from cameras and slaps the side of his head.


And finally... for now... my own prompted meme below reminds you all of a word that is feared by any MAGA who knows a little history. It's up to them whether the coming Appomattox will end this nasty 9th phase of the recurring, 248 year US Civil War with calmness and "malice toward none," which we will do, if the travesties and betrayals stop.

(Let's be clear. If America - the blue/sanity - wins, reds can count on our resumed generosity. If they win this phase solidly, I will be dead within a year and 1930s Germany will commence, as explicitly planned by Project 2025.)

But nothing will stop that word coming true, one way or another. We will not go back to 6000 years of cruel, unsapient feudalism. (Hear that, oligarchs? Even your "Event" will turn our rage upon every 'hidden' prepper fortress.*) 

Wear your blue Union kepi with pride!

Let us return to the GI Bill society that had the finest market economy and more freedom, creativity and incremental progress than any other across all of time... till GOPpers trashed it. 

If we go back to that generous, fair, scientific, tolerant and fact-centered nation and society, then we may all yet -- including you -- inherit the stars.





* A Canticle for Lie-bitches....
















Planet Debian — Samuel Henrique: Distributary: my artwork proposal for Debian 14 "forky"

The Distributary wallpaper split on a diagonal: on the left, the dark version, a gold river forking over dark green land with the Debian logo; on the right, the light version, the same river as green ink on pale paper

In hydrology, a distributary is a channel that forks away from a river and flows on to the sea, the opposite of a tributary. Debian is the river much of the Linux world forks from, so for a release called forky, that is my proposal for its artwork: one river, many forks.

All generated by code. A small Python program grows the river by the rules of real deltas, and renders every wallpaper, login screen, boot splash and GRUB background from it, dark and light, at any resolution: the showcase offers 51 sizes to download, from phones to 8K.

Distributary in its eight colours, Forest, Violet, Midnight, Debian red, Rose on teal, Glacier, Lineage and Silt, each as a dark and a light wallpaper side by side

It comes in eight colours, and with the palette editor you can fork your own: change any colour or option live in your browser, or roll random ones, then download the wallpaper or build the whole theme locally. Have a look at the showcase and at the proposal on the Debian wiki; the source is on Salsa and GitHub.

Planet Debian — Ludovic Rousseau: New version of PyKCS11: 1.5.21

I just released a new version of PyKCS11, a Python wrapper above the PKCS#11 API.

See PyKCS11 introduction or PyKCS11’s documentation.

The project is registered at Pypi: https://pypi.org/project/PyKCS11/

Changes:

1.5.21 - October 2026, Ludovic Rousseau

  • getMechanismList(): do not return mechanism 0x1D (debug code introduced by mistake in release 1.5.19)

  • build binary wheels for Python 3.15

Planet Debian — Russell Coker: Links October 2026

Julia Curlee wrote an informative article about serving as a CIA agent in the White House as a trans woman [1].

Bruce Schneier and Kasra Rafi wrote an interesting article about AIs and mathematical research, they won’t break crypto any time soon [2].

Otto wrote an interesting and informative blog post about the issues related to “AI” and software development with a focus on the recent Debian vote about accepting “AI” “contributions” [3].

Jared Huffman the only openly atheist congressman has some insightful commentary on the rise of Christian nationalism in the US [4].

Artem wrote an interesting blog post about trying and failing to contain a LLM agent with VMs, they think this is bad but I think it’s great that more bugs are being discovered and could then be fixed [5]. I now want to try this sort of thing on replicas of my own systems!

Techdirt has an insightful article about how the new Meta teen safety rules might allow murderous cops to get away with their crimes [6].

Anil Madhavapeddy wrote an interesting blog post “Just a rumour of a bug is enough to find a security exploit these days”, things will be difficult for the next few years if this holds at scale [7].

The Conversation has an interesting article about the current situation with nuclear weapons proliferation, not that it helps as countries with nukes get love letters from Trump and countries without get girls’ schools bombed [8].

Several Australian state governments have mandated free electricity between the times of 11AM and 2PM, but now electricity companies have changed their pricing to avoid this saving customers any money [9].

404Media has an interesting article about the ways that “AI” agents are ruining the Internet [10].

RealtimeApocalypse has an interesting article about Effective Altruism which is one of the more covert cults that prey on people in the computer industry [11].

David Brin has a good theory to explain why it’s important to allow people who have practiced bestiality to work for the FBI [12].

Cory Doctorow wrote an interesting article for Locus about the politics of “AI” systems and when they should be considered inherently evil [13].

Adrian wrote an insightful blog post about how DDR RAM works and why replacing RAM on an embedded board isn’t a good idea [14].

Arstechnica has an interesting article about organised criminal gangs stealing truck loads of goods and having a particular interest in DC gear [15].

This is one of a series of articles published in The Guardian about the Free Birth Society, a cult-like organisation that opposes involvement of trained medical experts in the process of giving birth, they “claimed resuscitation was often an unnecessary act which deprived babies of the chance to choose to begin their lives” – wow [16].

Cory Doctorow wrote an insightful article about so-called Intellectual Property and how it’s being used to attack human rights [17].

Anthropic published an interesting article about their work on formally proving libraries with LLMs, hundreds of millions of tokens for each proof so probably thousands of dollars [18].

Bruce Schneier wrote an insightful article about how AI can provide advantages and disadvantages for dictators [19].