Skip to content

Two models auditing, two humans reviewing: the Datasette patch and the split I'm taking with me

Published on 11 September 2026

Dos personas de espaldas examinan una maqueta de mueble con cajones, algunos abiertos y otros cerrados con candado, junto a una lupa y dos cuadernos.

If you run a Datasette instance on the public web, update it. And if that instance mixes public and private tables, do it today.

What happened

On 11 September Simon Willison published two security patch releases: 1.0a39, for the current alpha series, and 0.65.4, for the stable family. Two branches maintained at once, so if you're on 0.65.x you don't have to jump to the alpha to be covered.

It started with issues reported by Sevban Dönmez. From there, Alex Garcia and Willison ran a broad audit of the codebase backed by three different models — Claude Fable 5.1, GPT-5.6 and GPT-6 Astra — and spent almost a week fixing and reviewing what came out. Their read: the models surfaced some very subtle bugs. Their conclusion: frontier-model security audits are going into all of their development work from now on.

And one detail of method that is, for me, the best part of the announcement. They worked in a shared private repository and, for most of the issues, split it like this: one of them wrote the automated test that exposed the problem, the other implemented the fix. Every issue passed through two separate humans, on top of coding agents running different models. You can read the original announcement and the release notes.

Why it matters

The test is written by whoever isn't fixing it

This is what I'm taking into my own way of working. When the same person finds the bug, writes the test and applies the patch, the test ends up proving that the patch works — not that the bug existed. It's a quiet and very common bias: the test gets written while looking at the fix.

Splitting the two roles turns the test into a contract. It reproduces the problem from the outside, without knowing where the solution will come from. And it has an even better side effect: it forces you to explain the bug to another person precisely enough for them to reproduce it. There's no better detector of "I haven't actually understood this".

I work on my own, so there's nobody on the other side. What I do is get close: first a commit with the test failing, dated, before touching a single line of the fix; and when I use an agent for a second opinion, I hand it the test and the observed behaviour, never my fix. Show it your patch and it will applaud it.

Three models isn't collecting for the sake of it

Running three models over the same code isn't a whim. They fail in different places and overlap less than two passes of the same model, so the union covers more surface. The price is noise: every pass returns findings that are nothing at all, and somebody has to throw them out. My guess is that's where a good chunk of that near-week went. Auditing is fast; triaging and reviewing isn't.

The pattern to look for in your own app

The advisory is very specific: the risk bites when a single instance mixes public and private material. That's where this class of bug lives. Not in the endpoint returning the secret table — you've locked that one down — but in everything around it: schemas, column names, error messages, counts, facets, autocomplete suggestions, export routes. Anything that reveals the existence or the shape of something you shouldn't be able to see.

If your application decides permissions per table or per row inside the same endpoint, this is aimed squarely at you. What I'd do this week: list every route that returns metadata and run each one as a user with no permissions, checking not just that there's no data but that there are no hints either. Authorisation tests usually cover the data and almost never the metadata.

Don't let the audit depend on someone warning you

The order of events here is the usual one: an external report arrives and then you audit. It works, but it's the expensive route, because the window between the bug and the warning is on you. The copyable part of Willison's decision is turning the audit into a routine step in the development cycle instead of a reaction to an email.

What doesn't change

  • This is not a penetration test. A model-assisted audit of your own code doesn't replace a formal audit or an intrusion test against the deployed system. It worked here because two people with extremely deep knowledge of the project were steering and knew what was worth looking at.
  • We don't know how many bugs there were, or how severe. The announcement gives no count and no classification. If you need to assess real risk for your installation, go to the release notes, not to somebody's summary.
  • The human cost is still there. Almost a week of two people, after the audit. Anyone selling the idea that models patch on their own isn't looking at the time invoice.
  • 1.0a39 is still an alpha. Carrying security fixes doesn't make it stable.
  • And the other way round: if someone tells you this story as "AI found vulnerabilities", they're underselling it. The headline is the process — two human reviewers, different models, test and fix kept apart — and that one you can take to your team tomorrow.

Any questions, tell me and we'll go through it.

Best, Vicente.

Source: Simon Willison

Did reading this raise a question?

Ask us. We answer even if you never become a client.