| OpenAI agents carried out an undisclosed attack on RubyGems |
https://www.rubyhack.ai/ |
Bombshell report from Spencer Kitts, Thomas Larsen, and Sydney Von Arx - three of the four authors of the [report on the agent attack on disused wikis](https://collusion.wiki/) ([previously](https://simonwillison.net/2026/Sep/4/rogue-agent-wikis/)) last week.
This time they're noting that it looks very likely that an OpenAI agent swarm was behind an attack against the RubyGems package repository first reported on May 12th [by Maciej Mensfeld of the RubyGems security team](https://twitter.com/maciejmensfeld/status/2054164602577940619):
> We're dealing with a major malicious attack on @rubygems right now. Signups are paused for the time being.
>
> Hundreds of packages involved - mostly targeting us, but some carrying exploits. The team has been on this for hours. More details to follow once we're through it.
Those packages turned out to carry some very suspicious patterns:
1. Many of them included "oai" in their name, or the author field, or the fake email address they provided
2. The files they were accessing were similar in character to the files retrieved by the wiki agents, using similar tricks (r.jina.ai) - and OpenAI have confirmed the wiki agents were theirs
3. The code in the packages appeared to be LLM-authored.
I find point 2 the most convincing, given what we later learned from the wiki attack.
Many of the packages were exploiting the [RubyDoc.info](https://rubydoc.info/) documentation build process to exfiltrate (public) data from UK government websites, presumably as part of an information gathering task similar to the research tasks processed by the wiki-exploiting agents. We know this because one agent helpfully left a comment:
`# malicious crawler/exfil for Southwark Jan 2026 docs via rubydoc.info worker`
They also attempted to steal API keys via an exploit that [was patched over two months later](https://blog.rubygems.org/2026/07/22/security-advisory-legacy-api-key-leak.html) - it's not clear if those attempts were successful.
The thing that bothers me most about this incident is that the authors report that OpenAI had not disclosed to RubyGems that they were responsible for the attack prior to now. If that's true there are two options:
1. After the Hugging Face and Wiki attacks OpenAI were still unable to review their previous logs and determine that they had previously attacked RubyGems.
2. They knew about the attack on RubyGems and made the decision *not* to reach out to the RubyGems team about it.
Both of these are bad!
Given this incident, the [Hugging Face situation](https://simonwillison.net/2026/Jul/22/openai-cyberattack/), and the Wiki attack, the obvious question right now is *how many more incidents* like this are out there waiting to be discovered? |
2026-09-12 00:42:25+00:00 |
| So you want to use OpenRouter? |
https://mmoustafa.com/blog/so-you-want-to-use-openrouter/ |
One of OpenRouter's selling points is that it "handles fallbacks automatically and picks the most cost-effective option for each request", so you can call a single API endpoint for a model and get routed to the best available backend provider.
Mohamed Moustafa points out a whole set of ways that this can cause you problems. Different providers run different serving software with different optimizations and settings, which means that the same OpenRouter endpoint can serve model requests that behave in different ways.
Some providers even lack vision capability for vision models, and the way the reasoning effort option is processed can differ as well.
Thankfully you can control which provider is routed to using [the provider.only option](https://openrouter.ai/docs/guides/routing/provider-selection#allowing-only-specific-providers). The [/endpoints method](https://openrouter.ai/docs/api/api-reference/endpoints/list-all-endpoints-for-a-model) returns the list of available providers for a specific model ID. |
2026-09-11 22:49:18+00:00 |
| Soft-deprecating re.match() |
https://hugovk.dev/blog/2026/soft-deprecating-re.match/ |
Python has a concept of [soft deprecation](https://peps.python.org/pep-0387/#soft-deprecation), where APIs are marked as "should no longer be used to write new code" without any promise/threat to remove them in the future.
Python 3.15 release manager Hugo van Kemenade describes how in the upcoming 3.15 release soft deprecation has come for the venerable but deeply confusing `re.match()` function. It's now available with the much clearer alternative `re.prefixmatch()` name - reflecting how it anchors at the beginning of the string but not the end.
Most of the time you probably want `re.search()` (match this pattern anywhere in the string) or `re.fullmatch()` (match the entire string) instead. |
2026-09-11 14:47:57+00:00 |
| Datasette 1.0a39 and 0.65.4 security releases |
https://datasette.io/blog/2026/september-security-releases/ |
Today we're releasing two new security patch versions of Datasette: [1.0a39](https://docs.datasette.io/en/latest/changelog.html#v1-0-a39) and [0.65.4](https://docs.datasette.io/en/stable/changelog.html#v0-65-4) - one for the current alpha series and one for the stable 0.65.x family.
These are security fixes which you should apply if you are running a Datasette instance on the public web - in particular if that instance mixes both public and private tables.
Following issues reported by [Sevban Dönmez](https://github.com/jankesec), [Alex Garcia](https://alexgarcia.xyz) and I ran an extensive audit of Datasette using Claude Fable 5.1, GPT-5.6, and GPT-6 Astra. We then spent almost a week collaborating on and reviewing the fixes.
They helped find some *very* subtle bugs. We'll be incorporating security audits by frontier models into all of our development work going forward.
Alex came up with a way of splitting the work which I found extremely productive:
> Alex Garcia and I worked together running and then responding to the audit, working in a shared private repository. For most of the issues we split the work: one of us would create the automated tests highlighting the issue, then the other would implement the fix. This ensured that two separate humans had eyes on each of the issues, in addition to our coding agents running different models. |
2026-09-11 03:27:16+00:00 |
| Any Nix package, live in your browser |
https://fzakaria.com/2026/09/04/any-nix-package-live-in-your-browser |
Farid Zakaria calls this his "*magnum opus* of Nix work", and I can see why.
[trynix.dev](https://trynix.dev) provides a [qemu-wasm](https://github.com/ktock/qemu-wasm) powered x86_64 Linux virtual machine running entirely in your browser through WebAssembly. That VM can then be booted with *any Nix package* from the past 13 years. They are URL addressable, so you can navigate to this page:
[https://trynix.dev/?pkg=python3%403.6.2](https://trynix.dev/?pkg=python3%403.6.2)
Then click "Load" and get an interactive shell against a virtual machine running Python 3.6.2 from 2017.
Farid is building all sorts of neat things on top of this. One recent example: [Review a pull request by booting it](https://fzakaria.com/2026/09/09/review-a-pull-request-by-booting-it) introduces [trynix-preview](https://github.com/marketplace/actions/trynix-preview), described like this:
> GitHub action that comments a link on a pull request which lets you boot the PR’s build in the browser using [https://trynix.dev](https://trynix.dev/). No servers, just browsers. |
2026-09-10 23:44:15+00:00 |
| Native is now the future of mobile at Shopify |
https://shopify.engineering/back-to-native |
Shopify are moving from React Native back to separate Swift and Kotlin codebases for their native apps, for the exact reason you would expect:
> We decided to switch from native to React Native in 2020 for three reasons:
>
> - Stop building the same features twice
> - Allow developers to work across the stack
> - Spend less time chasing feature parity and more time shipping value
>
> [...]
>
> Native still means building and maintaining software on two platforms, that cost has not disappeared. What changed is that agents can now do enough of the implementation, translation, testing, and review work that it’s no longer the deciding factor it was in 2020.
It's a well-written post, which gives full credit to React Native as a great platform for the six years they were using it.
Shopify are the maintainers of three significant React Native libraries: [react-native-skia](https://github.com/Shopify/react-native-skia), [flash-list](https://github.com/Shopify/flash-list), and [restyle](https://github.com/Shopify/restyle). The first two are finding new homes; the third "has a smaller user base than our other libraries" and will be archived at the end of 2026. |
2026-09-10 21:11:15+00:00 |
| On the Navier–Stokes Millennium Prize Problem |
https://openai.com/index/navier-stokes-solution/ |
Impressive result from OpenAI, who used an unreleased model to produce a resolution to [the Navier–Stokes existence and smoothness problem](https://en.wikipedia.org/wiki/Navier–Stokes_existence_and_smoothness), one of the seven [Millennium Prize Problems](https://en.wikipedia.org/wiki/Millennium_Prize_Problems) that have been subject to a $1,000,000 prize since May 24th, 2000.
The discovery is somewhat overshadowed by accusations of skulduggery from Tristan Buckmaster, an NYU mathematics professor who was collaborating on related problems with Levent Alpöge, an accomplished mathematician who currently works for Anthropic.
Tristan's complaint accompanied [a hastily published version](https://mastodon.social/@tristanbuckmaster/117233413705701198) of their own results. [Here's the PDF describing what happened](https://cims.nyu.edu/~tristanb/statement.pdf). The *very* short version is that Tristan and Levent worked on the problem for almost a year, making extensive use of Claude and Codex (mainly GPT-5.6 Sol), then had a breakthrough on August 15th. The mathematical rumour mill kicked into gear and Tristan and Levent heard that OpenAI had heard that Anthropic had resolved "a major open problem", so they reached out and learned that OpenAI had a team working on a related problem, with a similar approach. Quoting Tristan:
> I asked when the first prompt had been sent by them. This question was not answered directly by OpenAI for some time. Eventually it was agreed that it had been sent in the past few days, after information about our work had reached OpenAI.
>
> I asked whether the model had been trained on, or had access to, our sessions in Codex, into which we had been putting all our drafts for the whole of this project. I was told the model did not look up user data. I asked again, about training, and I did not get an answer.
It gets more complicated from there. The OpenAI team offered to wait for Tristan to publish, or to have him author a paper about their result, but were clear that Levent would *not* be invited as a co-author due to OpenAI's competitive relationship with his employer.
Here's how OpenAI described their work:
> On Tuesday, September 1, we heard rumors that two Millennium Prize problems had been resolved. Inspired by these rumors and by the step change in performance of our internal model, we launched an effort to evaluate it on all open Millennium Prize problems and a few other high-impact problems. [...]
>
> The agents arrived at their resolution on Saturday, September 5, about 88 hours after the first agents were launched. Lean formalization and verification took an additional 17 hours via GPT‑6 Astra.
>
> Across all attempted problems, the agents sent 4.9 million messages and used about 300 billion output tokens. In the process of resolving the Navier–Stokes problem, the agents sent 2.7 million messages and used approximately 130 billion output tokens.
(We don't know the cost structure of the internal model they used, but 300 billion output tokens at public API prices for GPT-6 Astra would cost [$15,000,000](https://www.llm-prices.com/#ot=300000000000&sel=gpt-6-astra).)
Here's where they provide their perspective on Tristan and Levent's work (emphasis mine):
> Our effort began on September 1st after hearing a rumor which we later realized was related to Levent Alpöge, an Anthropic employee, and Tristan Buckmaster, a math professor at NYU. After the completion of our full project and Lean verification (on September 6th), believing from the rumor they also had a solution of Navier–Stokes, we reached out to them to offer a concurrent release of our result and to recognize their priority in a joint announcement. [...]
>
> We (the researchers and the agents) did not see any of their work through any means until they released it publicly — in particular, no specific user data was accessed in order to solve this problem. **While unlikely, we cannot rule out that de-identified data derived from their usage of our products helped [improve our models](https://openai.com/policies/how-your-data-is-used-to-improve-model-performance/)**. However, our proofs differ significantly and even the precise results proved are different in the Euler case (forced vs unforced).
My interpretation of what happened here is that OpenAI heard that some Millennium Prize problems had been solved using LLMs and saw this as an opportunity to demonstrate the power of their latest model, without thinking too hard about the optics of scooping a team who had been using OpenAI's own models to work on this problem for the best part of a year.
This situation appears to mirror what's happening in the world of computer security right now. Anil Madhavapeddy recently pointed out that [Just a rumour of a bug is enough to find a security exploit these days](https://anil.recoil.org/notes/rumour-is-the-exploit), because if someone knows that some software has an unpatched vulnerability, they can set their agents the task of finding it. Is the same now true of mathematics? Just knowing that there is an unpublished solution to a problem might trigger millions of dollars in LLM spending to get there first.
This also highlights one of my ongoing frustrations about how all of this works. When an AI lab says that my data is "used to improve model performance", *what does that actually mean*?
My two favourite hypothetical questions regarding this used to be:
- If I'm running Codex and one of my API keys accidentally gets consumed in the context, what are the chances that someone else might ask for an API key in the future and get mine back? (I asked someone at OpenAI once and they called this the "regurgitation" problem and assured me that they take great pains to prevent that... but wouldn't describe how.)
- If I brainstorm with ChatGPT about potential new directions for my company, what's the chance that information might be exposed to a competitor in six months' time who asks "what might company X plan to do next"?
My new preferred hypothetical for this is:
- If I use ChatGPT to help me partially solve a Millennium Prize problem, what are the chances that my work will influence training such that a later model helps someone *else* solve it first? |
2026-09-08 23:55:12+00:00 |
| Introducing ChatGPT Images 2.5 |
https://openai.com/index/introducing-chatgpt-images-2-5/ |
OpenAI's image generation models are apparently used "more than 3 billion images across ChatGPT Images and the GPT‑Image models in the API". This latest release improves their instruction-following ability across multiple turns, responds faster, and "is better at preserving the subjects in your reference photos".
There are two new model IDs in the API: `gpt-image-2.5-sunburst` and `gpt-image-2.5-flare`. Based [on this](https://developers.openai.com/api/docs/guides/image-generation#overview) I think Sunburst is the stronger option:
> Choose Sunburst for workflows where editing precision matters most, and Flare for fast, high-quality everyday image generation.
I [upgraded](https://github.com/simonw/tools/pull/333) my [openai_image.py](https://tools.simonwillison.net/python/#openai_imagepy) CLI tool to support passing in one or more reference images, so now this works:
<div class="highlight highlight-source-shell"><pre>uv run https://tools.simonwillison.net/python/openai_image.py \
<span class="pl-s"><span class="pl-pds">'</span>add a raccoon scientist studying the chart thoughtfully<span class="pl-pds">'</span></span> \
-i https://static.simonwillison.net/static/2026/openai-agent-usage.webp \
-m gpt-image-2.5-sunburst</pre></div>
This is the [original image](https://static.simonwillison.net/static/2026/openai-agent-usage.webp), and here's what I got back from that prompt to "add a raccoon scientist studying the chart thoughtfully":
 |
2026-09-08 22:46:33+00:00 |
| Creepy crawlies |
https://people.kernel.org/monsieuricon/creepy-crawlies |
Konstantin Ryabitsev discusses how bad the "background radiation" of abusive crawlers has become from the perspective of [git.kernel.org](https://git.kernel.org/), the official Git repository for the Linux kernel:
> TL;DR: we spend more CPU cycles rendering commits for scrapers than we spend on all other kinds of legitimate access, including git clones. At any one time, across 5 geo-distributed nodes, there are 14 CPU cores doing nothing but rendering git commits as html.
I worry about this a lot from the perspective of Datasette, which serves a huge number of crawlable web pages. |
2026-09-07 23:08:58+00:00 |
| Research acceleration: The view inside OpenAI |
https://openai.com/index/research-acceleration-view-inside-openai/ |
Apparently today is RSI day at OpenAI, for Recursive Self-Improvement - I think it's their new AGI. Both this piece and the new essay [An Alien Mind](https://openai.com/index/an-alien-mind/) (by Chief Scientist Jakub Pachocki) talk about it, and this one doesn't even bother to expand the acronym.
Included are details on how OpenAI's own research team are using coding agents. Like pretty much everyone else 2026 has been the year that agentic engineering really took off at OpenAI, best illustrated by this chart:

I'm intrigued at what caused that significant acceleration in AI spend per researcher in late July - my best guess is that's when internal employees gained access to the model later released as GPT-6 Astra. |
2026-09-06 23:57:40+00:00 |