We can't find the internet
Attempting to reconnect
Something went wrong!
Hang in there while we get back on track
Muse Wonder: use the Full version, and expect mixed results
Meta launched two models. Muse Wonder is available on Meta's API and in Muse Code. Muse Wonder Full is only available to Muse Code users. Both have 1M-token context, and Wonder costs $4 input / $0.20 cached / $20 output per 1M tokens. Full has no per-token price yet . On Artificial Analysis's Coding Agents Index, Wonder Full scores 68 at max effort in Muse Code. That ties Claude Code with Sonnet 5.5 (68) and is just ahead of Opus 5.5 (66). Standard Wonder scores 63 .
The two versions are not interchangeable. Theo says standard Wonder over the API is "significantly worse" than Full . He notes they use nearly the same number of tokens, but Full matches Opus xhigh on AA while non-Full scores below GPT-6.1 Sol . His working setup pairs the models. He added Muse support to T3 Code, and in Orchestrator V2 he "often [has] Opus ask Wonder for code review, copy work, and architecture review" . In a three-way bug-fix test:
- Opus found the root cause and filed a PR.
- GPT-6.1 Sol wrote 300 lines of tests , but its fix would not have worked .
- Wonder Full pointed to an existing community PR and suggested merging that instead.
DHH says he has already shipped two Omarchy PRs built with Wonder. He wants faster max reasoning and a proper agent overview in the default harness .
Not everyone agrees. Riley Brown used it for five hours and went "back to codex and claude code" . Matthew Berman found the $15 plan doesn't include Full. He then ran out of a $50 plan in three minutes, with 429 errors . Alexandr Wang later said the cause of the fast quota burn was fixed and reset Muse Code quotas . On cost per task, AA puts Wonder (max) at $4.52, below Opus 5.5 ($5.98) but well above GPT-6.1 Sol ($0.72) .
Slop is an engineering problem, so fix it in the repo
Several practitioners made the same argument from different angles: bad agent output is something you engineer away.
- Make the codebase the memory (poteto). Give the agent a way to verify its own work. Then turn every nit, mistake and bad pattern you see into a constraint, using lint rules, compiler diagnostics, types and LSPs. "Forget rules and skills. you can add those later." Better still, refactor so agent anti-patterns become impossible, and pick frameworks that shrink the architectural search space .
- Build a PR pipeline with a safety net (Kent C. Dodds). Have agents produce high-quality PRs, use agent PR reviewers, and add feature flags plus a regularly tested disaster-recovery process . Only then connect input pipes so agent work starts without you. He says he has averaged 77 merged PRs a day over five days .
-
Enforce rules with hooks, not prompts (Geoffrey Huntley). Updating
AGENTS.mdstill leaves drift. His fix is a pre-commit hook that scans the diff for direct observability calls that skip his diagnostics module, fails the commit, and tells the agent to use the approved path . He also says to test skill packs against a no-skills baseline, to delete skills andAGENTS.mdevery couple of months as models improve , and to read each lab's model card for prompting guidance . - Ask for a simplification pass (Salvatore Sanfilippo, in Italian). Left alone, AI produces solutions much bigger than the problem, and that complexity makes later AI edits harder too. Once the code works, ask it to cut useless layers and over-generalized functions one at a time .
- Prototype, then rebuild (ThePrimeagen). He uses AI to build a first version to explore the system's shape, then designs a deliberate V2. One project is going from about 100k lines to an expected 25–30k because the tests and structure were better thought out . He also warns that agents tend to pile up flaky end-to-end tests, so decide what actually needs testing . He keeps to one or two active dev tasks at a time .
Claude flows: what the workshop added
At AI Engineer NY, Anthropic presenters explained dynamic workflows. The lead agent plans, then writes an orchestration program that launches agents, collects results and manages information flow . You can still pass in pre-configured specialist subagents . Practical points from the Q&A:
- Defaults are low, so ambitious tasks need explicit encouragement to parallelize .
- The model doesn't know its budget while running, so set a session budget .
- Subagents share a filesystem but can't be told through the API to message each other .
- Claude Console lets you inspect the payload passed along every edge of the workflow graph .
- In a stock-scanner comparison, flows cost "much more" than a single agent but found more details .
Simon Willison builds a feature by voice
Willison used the Codex tab's voice mode in the ChatGPT desktop app with GPT-6 Astra High against his local Django blog. He started with Start dev server and open in browser so he could watch a live preview . In about half an hour of talking while cooking, the agent asked clarifying questions . It built a new model, four importers (including Substack's undocumented /api/v1/archive endpoint), archive pages and search integration . In PR review he replaced a Git-subprocess importer with an API call, by typing . His verdict: voice is great for multitasking, but typing still wins for details like pasting errors or pointing at specific code .
Tools and plans
- Cursor is now part of The X Subscription. Paid plans share one usage pool with Grok Build and give twice the coding usage on Grok models. On the new plans, third-party models in Cursor move to API pricing. Existing subscribers can keep their current plan .
- T3 Code nightly adds an "update everything" button. It updates the app, every environment, and providers like Claude Code and Codex, then resumes your threads . Theo says his Opus-built ts-rust port, now shipped in T3 Code, cut typechecking time by 3x .
- DHH says he usually prefers agent contributions to Omarchy because agents write more complete bug reports, and that PRs are "mostly just proofs of concept now" . The flip side is that the backlog is agent-managed, so not every item will be picked up .
- Huntley treats coding-agent harnesses as interchangeable and prioritizes cheap token access. He built Underclass, a proxy over OpenAI subscriptions that pools quota and handles exhaustion through resets/failover.
- He voice-dictates prompts and asks agents for status, deployment status, and session learnings; because models change frequently, he considers direct agent work sufficient and cautions against swarms moving faster than he can understand.
- For GitHub reviews, he sends PRs through an API into a Copilot-reviewer loop: agents address review comments, while technical decisions are escalated to another agent that reports its choices for his architectural review.
- He also describes a high-trust setup for greenfield and research work: agents get sudo access on a separate development machine he can rebuild in about 10 minutes, and integration tests prevent commits unless they pass. He favors getting a usable version quickly and validating it through use before investing in hardening; afterward he focuses on verification such as observability, boundaries, and prompts. He stresses that safeguards should reflect the domain’s risks and that verification is needed as backpressure.
- Huntley said he had rebuilt three former employers’ offerings in under 10 days and planned to release the work under MIT; the projects included an AI-first internal developer platform and a Gitpod-like service that starts a VS Code container from GitHub. These were described as planned releases, not as already shipped open source.
- To understand agent-written code, he uses an agent to summarize a codebase and produce system or state-machine diagrams, then reviews diffs and expects to be able to explain and whiteboard-defend the design; he says this is not a “complete yolo” approach.
- His verification approach puts the whole system, including the operating system and application, under test. He describes property-based checks such as ensuring a checkout charges a customer only once, and Antithesis’s deterministic container-based testing with clock and network fault injection and time rewind; he notes that property checks can also run locally and that an LLM judge cannot establish worst-case behavior.
- When generated code misses established patterns, he treats it as a workflow problem to investigate and fix; he uses pre-commit hooks and generated deterministic inspection scripts for checks such as architectural boundaries, while noting that durable best practices are still unsettled.
- After code generation, ask the AI for an “ablative” pass: remove unnecessary layers and functions, and trim overgeneralized solutions. Sanfilippo warns that AI tends to make solutions more complex than the problem requires, which can also make later changes harder.
- For open-source maintenance, he uses AI to rank and analyze issues and pull requests, then personally checks the top five for urgency and cherry-picks worthwhile work instead of trying to process the full queue. He says AI has also made branch merges easier and that fetch, rebase, and checks can be delegated to an agent. For contributions, he recommends forking and implementing the feature, then opening an issue with a few lines in your own words explaining the intent; if you use AI to draft the message, send the prompt instead.
- For his Dwarf Star local-inference project, Sanfilippo says he never opened a source file in its 135,000-line codebase: he steered the design and specified it in Markdown documents, retaining an abstract mental model of how it worked. He says the project was entirely AI-written and delivered better inference quality than other projects; he started it after seeing subtle inference-graph errors in existing engines and difficulty keeping quality up amid frequent model releases.
-
Simon Willison used Codex in the ChatGPT desktop app’s voice mode against his local Django blog checkout, first starting the dev server to inspect a live preview; he dictated requirements while cooking for about half an hour, and Codex asked clarifying questions as it modified the code. The session used GPT-6 Astra High and produced the newsletter model, imports, archive pages, and search integration; the agent also found Substack’s undocumented
/api/v1/archiveendpoint and worked out its pagination. - Voice plus a live preview worked well for multitasking and broad feedback, but Willison switched to typing for precise changes; PR review caught an import script using a Git subprocess where an API was preferable for accessing a private repository, and he asked Codex to replace it before merging.
-
A reusable integration pattern: have a coding agent read a new API’s documentation and adapt an existing plugin as a reference. Willison used GPT-6 Astra to build
llm-openai-decisionsfrom the OpenAI Decisions API docs, inspired byllm-typesafe; install it withllm install llm-openai-decisions.
- The video sketches a reverse-engineering-to-agent workflow, but does not show a finished reimplementation: use Reverse Engineer Anything with a read-only native-binary analysis integration to inspect one feature in a local Premiere installation, then give a coding agent the resulting pseudocode, assembly, strings, symbols, calls, and references to attempt a Rust implementation.
- In its Apify sponsor segment, the video presents Apify’s MCP server as a way to connect an agent to thousands of “actors”: make a one-line connection, describe a task in natural language, and have the agent choose a tool and return structured data. Examples include scraping YouTube data and monitoring Amazon prices; the video says exposing a small set of core tools and running the selected actor in the background helps limit token bloat.
- Huntley’s loop-engineering workflow began with Cursor and manually run loops; he identifies filesystem-as-state as one pattern for autonomous software building. His “Z80” approach is to clean-room an existing application into specifications, then rebuild from those specs, with legality varying by jurisdiction.
- Treat agent output as a draft: Huntley found earlier models left stubs and partial implementations, so he focused on supplying completeness reasoning and verification. He still distrusts the tools, though he says newer models need fewer prompts about missing work.
- Budget for inference and monitor unattended runs: the interview recounts Huntley leaving an agent running and topping a credits-burn leaderboard; he says he became known for triggering quotas and rate caps. He also warns that subsidized token pricing can obscure the cost of exploratory projects at real rates.
- Claude Managed Agents’ dynamic workflows entered public beta: a lead agent creates a plan that runs across multiple agents in phases, then combines their results; Anthropic describes it as designed for ambitious workloads.
- At AI Engineer NY, Anthropic’s @cjav_dev and Harrison Stall presented a full-length workshop on Claude flows. Its write-up says they drew on Unix/Linux lessons to explain how agents can tackle bigger projects without overwhelming developers.
Meta’s Muse Wonder is available via API, while Muse Wonderful is available only through a Muse Code subscription. In the host’s coding-model comparison, Muse Wonderful scored 79 and Muse Wonder 78.8 on Deep Suite, ahead of Fable 5.1 (67), GPT-6 Astra (71), and Opus 5.5 (74); the host considers this benchmark a useful reflection of developers’ coding impressions. Early access came with severe quota limitations: after the $15 plan lacked the full model, the host exhausted a $50 plan in three minutes with 429 errors, then ran out again shortly after upgrading to $200; Meta’s AI head said the issue was known and being fixed.
Sanfilippo outlines an LLM-assisted clean-room workflow: use an LLM to turn existing code into a specification, delete the initial instance’s logs, then have a separate LLM instance reimplement the software from that specification. He connects the approach to a clean-room experiment, including an earlier Spectrum emulator effort.
- Huntley uses a fleet of agents that coordinate in parallel through a shared blackboard, recording changes such as contract edits and refactors; a separate agent runs a retrospective. In an experimental code-smell detector, he normalized retrospective text with a Python NLP library before feeding it to a fruit-fly-inspired method, which could identify recurring smells and detect them in new codebases.
- Treat agent compliance as an engineering problem, not just a prompt-writing problem: for example, add a pre-commit hook that checks diffs for direct observability calls lacking the required diagnostics module, then fails the commit and prompts the agent to use the approved path.
- Test whether skills or agent instructions help against a no-skills baseline, and periodically reassess or remove them as models improve; read each model’s release/model card because prompting guidance can differ between models. Huntley also recommends sticking with a model that works to reduce the overhead of adapting to frequent changes, while reevaluating when needed.
- Prototype with an agent, then deliberately rebuild: Prime first uses an AI-assisted prototype to explore features and system shape, then designs a more thoughtful V2 using what he learned. In one project, he expected to go from about 100,000 lines to 25,000–30,000, crediting better tests and structure—not fewer lines as a goal in itself—and says the rebuild gave him a stronger sense of ownership.
- Choose tests instead of defaulting to end-to-end coverage: He warns that prompting agents for features can produce excessive end-to-end tests, which can accumulate into thousands and become slow or flaky; decide what actually needs testing and trim unnecessary coverage.
- Limit active coding tasks to match your context-switching capacity: Prime says he generally handles one task, at most one or two development tasks, and starts losing focus at three or four; he can run more concurrently when he is not actively working through code.
- Anthropic’s dynamic workflows (“flows”) grew out of Claude Code’s “harness for every task” concept and support work that runs longer than a single agent or fixed roster. Claude determines the agent topology: the lead plans the work and writes an orchestration program to launch agents, collect results, and manage information flow; developers can still add preconfigured specialists. Flows are available in Claude Console for API developers.
- A demonstrated pattern distributed individual stock tickers to agents with isolated contexts, then reviewed their findings before producing a report. For agent fan-out, Anthropic cited evals and low defaults; explicitly encourage more parallelization for ambitious tasks. Set a session budget, since the model does not know its budget while running. In the scanner comparison, flows cost much more than a single-agent approach but were reported to find more details.
- Developers can inspect the workflow graph in Claude Console, including what the lead passed to each subagent; agents share a filesystem, but cannot be instructed through the API to message one another directly. For repeated runs, “dreaming” is a research-preview feature that reorganizes memory using past session transcripts; it is not built-in flow self-improvement, though the presenters suggested combining dreaming with hill-climbing.
Python 3.15 adds explicit lazy imports, which defer importing a module until its symbols are used. This may reduce startup overhead in Simon Willison’s LLM CLI plugin ecosystem: installing plugins with heavy dependencies such as sentence_transformers had added multiple seconds to each command invocation, leading him to recommend manual lazy imports to plugin authors.
WordCraft is an AI-assisted Microsoft Office clone attempt written in Rust and still in alpha; its creator had previously started AI-driven Photoshop and other Adobe-project clones . ThePrimeagen called it “cloning office with tokens” and joked it could not be worse than its predecessor; the posts provide no reproducible coding-agent workflow or evidence of a finished product .
Peter Steinberger says “vibes coding” is a slur . The quoted post he shared calls AI coding “precision engineering” and argues that models can produce more coherent architecture and code than average software engineers, potentially even top engineers, because of their larger context windows .
- Kent Dodds recommends a three-part quality and safety process for agent-written code: ensure agents produce high-quality PRs, use agent PR reviewers, and protect production with feature flags plus a regularly tested disaster-recovery process; he says the same process applies to human developers. He adds that, once those pieces are in place, teams can connect input pipelines to launch agentic work unattended; he reports averaging 77 merged PRs per day over the previous five days.
- Treat the codebase as agent memory: let agents verify their work, turn recurring mistakes and annoyances into constraints, and strengthen existing diagnostics such as lint rules, compilers, type systems, and LSPs. Refactor or choose libraries and frameworks so agent anti-patterns become impossible and the architectural search space is smaller.
Steinberger favors “6.1 Sol ultrafast” over “6 Astra,” describing them as roughly similar in cost but a “whole different game” at 250 tpm; the post gives no task or benchmark context and does not explain “tpm.”
Kent C. Dodds says he moved from wanting a better way to organize a list of running agents to talking to @bot about everything and letting it handle them; he no longer tracks how many agents are running.
Kent C. Dodds recommends using cloud agents in response to a developer reporting that running 20–30 subagents made an M5 Pro MacBook with 48 GB of RAM generate substantial heat; this is a practical option to consider when local high-concurrency agent runs strain a machine.
ThePrimeagen reported that Opus 5.5 had become “really really annoying” over the weekend, a negative practitioner signal about the model; he gave no specific cause or workflow details.
I built a new feature for my blog using my voice
In this newsletter:
A new feature for my blog, built using my voice
Claude Haiku 5.5
Hello Python 3.15, goodbye 3.10, and now I can use 3.11
Plus 5 links, 7 quotations, 1 note, 6 releases, 1 TIL, 1 tool, and 2 comments
Sponsor message: Static OAuth scopes and leaky sandboxes aren’t enough to protect autonomous AI agents. Legacy playbooks and threat models fail when applied to dynamic agentic workflows. Pomerium’s fine-grained access control gives you the confidence to move fast with agents. See why leaders like NVIDIA, OpenAI, and Uber trust Pomerium (opens in new tab).
I shipped a new feature for my blog: the Newsletters (opens in new tab) page, which offers an index of all of the newsletters I’ve sent out, both my free weekly Substack (opens in new tab) and my monthly sponsors-only (opens in new tab) updates. I built the feature almost entirely using my voice, chatting away to my laptop while I cooked dinner.
Codex voice mode
I used the ChatGPT desktop app for this, in the Codex tab, using the voice conversation mode, running against a local development environment. Here’s what that looks like:

I started the session against my local simonwillisonblog (opens in new tab) checkout by typing:
Start dev server and open in browser
This gave me a preview of the site that it would be working on, and meant that I could later ask it to show me the new pages so I could visually track its progress.
Then I clicked the “Start new voice chat” button - that’s not the microphone button, it’s the one to the right of it - and set my laptop up in the kitchen so I could talk to it while I cooked.
Talking to my computer
I had a pretty good idea of what I wanted to build, and it’s a simple enough Django feature that I was certain the model (in this case GPT-6 Astra High) would be able to do it. A new model, a migration, some view code, templates, and a couple of import functions to populate the database from external sources.
Here’s an extract of my voice transcript that was captured by Codex:
Um, they do not. Um, this is going to be a new type of content. Um, it’s not going to show up… Oh, hold on. Yeah, no- I do not want this to show up in my, um, tag pages and date archive pages and… Actually, no, I think… I don’t want it on the tag pages. I don’t want it on the, um, blog index page. But I think I do want it to show up on the date-based pages. You know, if you navigate to September the 19th, and I sent a newsletter on that page, I think I want that to show up. So… this is- so I think we probably need a new model. The other thing is that I want them searchable, uh the Substack ones are not searchable, because those are actually just copies of other s- on content on my blog. These monthly ones do contain unique content, and spe- and once they’re… published, like once they’re made public a month after they’ve gone out, I want them to show up on my search results.
Apparently this was clear enough that the model knew what I wanted to build! You can read the full transcript, disfluencies (opens in new tab) and all, in this Gist (opens in new tab).
We went on like this for about half an hour (the time it took to cook dinner). The model would reply and occasionally ask clarifying questions, then get to work modifying the code.
What we built
We got a surprisingly long way entirely by voice:
A new model and migration to represent imported newsletters in Django, plus Django Admin configuration for that
Four working imports:
The most recent Substack items via RSS
Every other Substack item via their undocumented API, which GPT-6 Astra knew about (it tried
/api/v1/archivedirectly) and then ran a search to figure out how to paginate it and found this article (opens in new tab) by Karen SpinnerAll of my published monthly newsletters from my simonw/monthly-newsletter-archive (opens in new tab)GitHub repository
My most recent private sponsors-only newsletter from a private repository
The /newsletters/ (opens in new tab) and /newsletters/2026/ (opens in new tab)public archive pages
Newsletters showing up on day and month archive pages too, but not on tag pages or my homepage
Weekly Substack newsletters link to Substack; archived monthly newsletters have their own pages
Integration with my site search engine
It was almost ready to ship. The catch was the imports: Astra offered to export data from my local copy so I could import that into production, but I wanted it to work like my other import scripts. Since some of the data lived in a private GitHub repository, this would involve creating a new API key, and for that I knew I’d have to sit at the keyboard for a while.
Finishing it with a review
Once I had finished cooking and judged it mostly feature-complete, I had Codex create a branch and open a pull request.
I reviewed the code in the GitHub PR interface. It was nearly what I needed, except it had chosen to use Git in a subprocess for one of the import scripts. I needed one of the imports to pull from a private Git repository, so I figured the API would be a better bet. I switched to typing and had Codex swap that out for an API-based import instead.
You can see the changes I made during the review in the extra commits on the PR (opens in new tab). I fixed the import mechanism and made a few tweaks to the display of those public pages. It took an additional half hour of typing-based prompting to get to the point where I was happy to deploy it to production by landing the PR.
The end result
You can see the end result at the new newsletters index page (opens in new tab), or view the page for a previous monthly newsletter (opens in new tab).

The index page shows my most recent Substack weekly newsletters and GitHub sponsors monthly newsletters mixed together in reverse chronological order. Further down the page are links to my by-year archive pages.
GPT-6 Astra designed the page, and then tweaked that design based on my vocal feedback from glancing at the local preview across the kitchen.
Better for multi-tasking than as a daily driver
OpenAI love using voice-driven demos like this one for things like DevDay (opens in new tab) - and they do work well in that environment. I don’t think this is going to be a daily driver for me though.
I’ve written before (opens in new tab) about how much “work” I get done using ChatGPT voice mode on my phone while walking the dog - mostly research and brainstorming, but occasionally actual development work by having ChatGPT write and test out snippets of code.
This feels different. The addition of the visual preview, plus being able to type or paste things in via the keyboard when I need to communicate something that doesn’t work vocally, makes this a much more powerful way of interacting with a coding agent.
I still switch back to typing once I get down to the details of things though. Being able to paste in examples and error messages, or directly highlight the code or feature that needs changing, remains more efficient than trying to describe it in words.
I mainly work from home, which is good because there’s no way I’d want to talk to my computer like this in a shared workspace!
The killer feature for me is the ability to multi-task. I usually cook with a podcast or TikTok running; now I can actually build stuff instead.
Claude Haiku 5.5 (opens in new tab) - 2026-10-07
As previously promised (opens in new tab), here’s Anthropic’s new fast, low cost model: Introducing Claude Haiku 5.5 (opens in new tab).
The previous Haiku, 4.5, was very much showing its age. It came out almost a year ago (opens in new tab), and was priced at \$1/million input and \$5/million output - relatively expensive even back then, and a full 10x the price of OpenAI’s GPT-6 Luna (opens in new tab), released last month.
The new Haiku exactly matches the price of GPT-6 Luna - \$0.10/\$0.50 - up to 100,000 tokens. Beyond 100,000 tokens the price increases 5x to \$0.50/\$2.50. Luna itself has a price increase at 272,000 tokens but only to \$0.20/\$0.75.
Haiku 5.5 also uses a new, less generous tokenizer. My Claude Token Counter (opens in new tab) tool shows that the same long prompt uses around 1.25x as many tokens with Haiku 5.5 compared to Haiku 4.5, so there’s a hidden price increase there.
If your workloads fit in 100,000 tokens, Haiku is the same price as Luna and reports higher benchmark scores. Above 100,000 tokens, Luna looks like a much better deal.
The most recent release of llm-anthropic (opens in new tab) finally fixed it so I don’t need to ship a new version of that plugin for every new model. I tested the new model like this:
llm install -U llm-anthropic
llm anthropic refresh
llm -m claude-haiku-5.5 "Generate an SVG of a pelican riding a bicycle" -o thinking_effort lowPelicans
Here are pelicans for low, medium, high, xhigh, and max (opens in new tab). The new Haiku doesn’t let you disable reasoning, and defaults to medium. I got a good bicycle frame for everything beyond low. The low effort pelican (opens in new tab) cost 0.0936 cents and took 7 seconds.
This max effort pelican (with a reasoning trace (opens in new tab)that starts “This is the classic pelican-on-bicycle SVG test…”) took 5 minutes 9 seconds to generate, but still only cost me 3.3826 cents (opens in new tab):

(Since the reasoning trace exhibits awareness of the benchmark, here’s Generate an SVG of an armadillo in fishnet tights jaywalking on Mars (on xhigh) (opens in new tab), and the same prompt against some other recent models (opens in new tab). Background on that (opens in new tab).)
For comparison, here’s the pelican I got a year ago (opens in new tab) from Haiku 4.5 (for 0.7583 cents (opens in new tab) - Haiku 4.5 did not support reasoning levels). It suckedat drawing pelicans:

And a generous API credit scheme for subscribers
In addition to Haiku 5.5, Anthropic announced today that they are halving the price of cache reads for Sonnet 5.5. They’ve also added API credits to subscription plans:
Second, this week, we’ll roll out a new monthly API credit to all Max and Team subscribers for use on the Claude Platform. Max 5x users will get \$100 in credits per month, Max 20x users will get \$200, and Team subscribers will receive up to \$500, pooled across their users.
Claiming this is pleasantly easy: navigate to Settings -> Billing (opens in new tab) and select the API organization that should benefit from the credits every month:

The API credits exactly match the cost of the subscription itself. This is really generous - it makes it much easier for subscribers to use the API. Anthropic also let you disable auto-reload for the API, with the consequence that “API requests will stop when your balance runs out” - exactly what you want if you’re planning to burn through those API credits without risk of a nasty billing surprise (opens in new tab).
Note that the monthly credits do not roll over (opens in new tab) - use them or lose them.
OpenAI still allow you to use your Codex subscription for personal API use, which works out as a better deal for heavy API users. This new credit scheme goes at least some way to overcoming that difference.
Python 3.15 is here (opens in new tab)! Here’s the essential What’s new in Python 3.15 (opens in new tab) guide, this year curated by 3.14 and 3.15 release manager Hugo van Kemenade. As someone who builds open source software that works in every supported Python version, I get to say goodbye to Python 3.10 and start embracing features from Python 3.11.
First, some highlights from Python 3.15.
Explicit lazy imports
I’m most excited about Explicit lazy imports (opens in new tab)from PEP 810 (opens in new tab). These let you import modules like so:
lazy import json
lazy from pathlib import PathThe module will then be imported the first time those symbols are used in the code that follows.
My LLM (opens in new tab) CLI tool implements plugins. I had to recommend manual lazy imports (opens in new tab) in the plugin author documentation, because simply installing plugins that used heavy dependencies such as sentence_transformerscould add multiple seconds to every invocation of the llm command. Lazy imports directly address this startup cost.
Unpacking in comprehensions
The new [*sublist for sublist in lists]unpacking syntax is neat. Here’s an illustration lifted from the documentation (opens in new tab):
lists = [[1, 2], [3, 4], [5]]
[*L for L in lists]
# [1, 2, 3, 4, 5]
# equivalent to [x for L in lists for x in L]sets = [{1, 2}, {2, 3}, {3, 4}]
{*s for s in sets}
# {1, 2, 3, 4}
# equivalent to {x for s in sets for x in s}dicts = [{’a’: 1}, {’b’: 2}, {’a’: 3}]
{**d for d in dicts}
# {’a’: 3, ‘b’: 2}
# equivalent to {k: v for d in dicts for k,v in d.items()}PEP 798: Unpacking in Comprehensions (opens in new tab) by Adam Hartz and Erik Demaine proposed this as an extension of the unpacking syntax from PEP 448 (opens in new tab), which landed in Python 3.5 (opens in new tab) back in 2015.
A sampling profiler
Python’s existing tracing profiler has been renamed from cProfile to profiling.tracing (opens in new tab), and has been joined by an exciting new sampling profiler called Tachyon, aka profiling.sampling (opens in new tab).
Sampling profilers work by periodically capturing stack traces from running processes, then using those to calculate which functions have the most time spent inside of them. They’re very low overhead and can provide a deep insight into running systems, without needing to instrument those systems first.
I’ve previously used tools (opens in new tab) like py-spy (opens in new tab) for this. Now this capability is baked into the standard library.
If you have the PID of an existing Python 3.15 process you can start gathering samples by running this (I had to use sudo on macOS):
sudo uv run --python 3.15 python -m profiling.sampling attach 1234Interact with the main program a bit, then hit Ctrl+C to stop gathering and see a report, which looks something like this:

It can also produce flame graphs like this (opens in new tab) and heat maps like this (opens in new tab), and can even output a format that can be viewed in the Firefox profiler UI.
3.15 isn’t much faster than 3.14
Miguel Grinberg investigated How fast is Python 3.15? (opens in new tab) the other day against the 3.15.0rc3 release and found performance to be mostly the same as 3.14, with the exception of the experimental JIT. The JIT gave a 1.2x boost over the standard 3.15 interpreter (on a Fibonacci test), the first time Miguel observed a meaningful JIT performance increase.
Miguel’s explorations of 3.14 (opens in new tab) last year found significant boosts against Python 3.13 across many more categories.
Upgrading to Python 3.15 with uv
I used the following sequence of commands to get uv to use Python 3.15 on my Mac. First I had to upgrade uv itself to ensure it knew about the new release:
uv self updateThen I installed the stable 3.15 release:
uv python install 3.15
And told uv that I wanted that to be the default for every uv run command, unless the project itself pinned a different version:
uv python pin --global 3.15Now the following reports 3.15 as the version:
uv run python --version
I already have a bunch of tools installed using uv tool install. I reinstalled them to use Python 3.15 like this:
uv tool upgrade datasette --python 3.15Then I can confirm the version like this:
datasette --get /-/versions.json | jqHighlights from Python 3.11
The release of 3.15 means that Python 3.10 (released in 2021) is officially no longer supported (opens in new tab).
My policy for my main open source projects is to keep them working in every supported Python version. I can now drop 3.10 and start using features that were introduced in 3.11.
Here’s the What’s new in Python 3.11 (opens in new tab)document. I finally get to rely on tomllib (opens in new tab) being available!
Datasette makes extensive use of asyncio. 3.11 adds TaskGroup (opens in new tab) and timeout() (opens in new tab), and several more (opens in new tab) new features.
datetime.UTC is a new in 3.11 alias for datetime.timezone.utc.
Python’s SQLite support got some significant upgrades in 3.11, including:
setlimit() (opens in new tab) and getlimit() (opens in new tab) expose a mechanism for setting SQLite runtime limits (opens in new tab) from Python.
create_window_function() (opens in new tab) lets us create custom window functions in Python, as a class with
step(),value(),inverse(), andfinalize()methods.blobopen() (opens in new tab) provides an efficient mechanism for partial reads and writes of large
BLOBbinary values stored in a SQLite row.You can now call
set_authorizer(None)to remove a SQLite authorizer. Datasette had a workaround for this!
Plus a whole bunch of improvements to Python’s typing system (opens in new tab).
I plan to land Python 3.11 improvements to a bunch of my projects over the next few weeks. Here’s my first Datasette PR (opens in new tab) removing that set_authorizer(None) workaround.
I’ve also updated my click-app (opens in new tab), datasette-plugin (opens in new tab), python-lib (opens in new tab), and llm-plugin (opens in new tab) cookiecutter templates to test against Python 3.11 through Python 3.15.
Quote 2026-10-05
The “old” version of Cowork runs model inference in the cloud, executing tool calls in an Anthropic-provided VM we shipped to your computer. We added the VM for capability, safety, and security reasons - mapping in just the data you explicitly added to your session. People loved what they were able to do with Claude but didn’t love the disk, battery, and performance cost of running the VM locally. Also, people didn’t love that closing your laptop means the work stops.
The “new” version of Cowork runs model inference and the VM in the cloud. Each session gets its own sandbox, not sharing state with other sessions. When the VM needs something on the users’ device (like a file), the desktop app is responsible for that file access tool call. […]
We think this solves a lot of problems we’ve heard about (like using Cowork from a phone, keeping work running, or getting all the same power without losing battery to the VM)
Felix Rieseberg (opens in new tab), Anthropic, see also this help page (opens in new tab)
I wanted to see if Claude Opus 5.5 could compose music, so I tried this (opens in new tab):
I want you to write some computer game music for me. First design simple text based format for the music and build an artifact that can play it out loud - include some example tracks in that artifact
I am looking for music of the quality of the original secret of Monkey Island
It leaned a lot harder into the Monkey Island theme than I had intended, but the results are surprisingly good.

I wonder if the ability to compose competent music is similar to the 3D graphics thing - a new capability for text models that emerged in the past few months?
Would need some careful experiments with other recent and not-so-recent models to confirm if this is new or if they’ve been able to do this for a while.
A minor fix for compatibility with the latest Datasette alphas. This meant we could upgrade the datasette.io (opens in new tab) site to Datasette 1.0a41.
comment: Mistral Large 4 (opens in new tab)
wren6991 (opens in new tab): The benchmark is saturated. Frontier models are tested with an armadillo in fishnet tights jaywalking on Mars.
OK well I couldn’t resist this one:
llm -m claude-opus-5.5 'Generate an SVG of an armadillo in fishnet tights jaywalking on Mars'
llm -m gpt-6.1-sol 'Generate an SVG of an armadillo in fishnet tights jaywalking on Mars'
llm -m gemini-3.8-flash 'Generate an SVG of an armadillo in fishnet tights jaywalking on Mars'
llm -m mistral/mistral-large-4 'Generate an SVG of an armadillo in fishnet tights jaywalking on Mars'Default reasoning levels for each: https://tools.simonwillison.net/markdown-svg-renderer?url=ht… (opens in new tab)
I saw Parseable in a Show HN (opens in new tab) - it’s a new observability platform with both an open source (AGPL) (opens in new tab) Rust implementation (a single ~180MB binary), an “Enterprise” version with extra features and a cloud hosted option.
Since Datasette 1.0a41 added OpenTelemetry support (opens in new tab) (thanks, Alex Garcia), I decided to fire up Codex and have it figure out how to run Parseable and feed it traces from Datasette.
Here’s my (human-written) TIL showing the patterns that worked, and here’s a screenshot of a Datasette trace displayed within the Parseable localhost web application:

Link 2026-10-06 Introducing Mistral Large 4: Le chonk (opens in new tab):
Mistral are back in the game. They released a preview of Mistral Large 4, a 1 trillion parameter, 49 billion active parameter model trained on their own cluster of 3,800 NVIDIA Grace Blackwell GPUs.
The preview is available via their API. They promise to release the open weights model at the “end of this month”.
The model only supports two reasoning levels - “none” and “high” - via the Mistral API. Here are both pelicans (opens in new tab) - the “high” one looks better, though surprisingly it only used 2,717 output tokens compared to “none” which used 3,275:

On Artificial Analysis it scores 38 (opens in new tab), just behind DeepSeek 4.1 Flash, which is a 552B model. It’s a huge improvement on last December’s Mistral Large 3, which drew this terrible pelican (opens in new tab)and scored 9 on AA (opens in new tab).
It’s certainly not a Fable-class model, but it’s great to see Mistral put out a model that’s back to being maybe about 6 months behind the frontier.
comment: EmbeddingGemma 2 (opens in new tab)
I really appreciate that EmbeddingGemma 2 (opens in new tab) is under the Apache 2.0 license.
For embedding models in particular, I don’t think it makes sense to use a closed, proprietary, hosted-only model.
Most applications of embedding models involve calculating thousands or even millions of embedding vectors and storing them for later comparison.
If your model is proprietary, the vendor is likely someday going to decide to stop offering that model. They’ll have a better model to replace it, but you still need to pay to re-calculate those millions of stored existing vectors.
(In April 2024 OpenAI offered to “cover the financial cost of users re-embedding content with these new models” - https://openai.com/index/gpt-4-api-general-availability/ (opens in new tab) - but I don’t think that’s something we can rely on from every provider.)
Notably, I don’t want to host the model myself. I’d much rather pay a provider for a hosted model while knowing that if they ever stop hosting it I can run the open weights version myself - or find another vendor who can do that for me.
Release: llm-mistral 0.16 (opens in new tab)
Adds support for reasoning models, such as the newly released Mistral Large 4 (opens in new tab).
OpenAI released their new Jev-style Decisions API (opens in new tab), as previously announced at last week’s DevDay.
Since I already have an llm-typesafe (opens in new tab) plugin for talking to Jev, I had GPT-6 Astra read the new OpenAI API documentation and build an llm-openai-decisions plugin inspired by llm-typesafe.
Unlike Jev, the new gpt-6-luna decision model supports image input in addition to text. Both models charge for input it and not for output: OpenAI’s is 10 cents per million input tokens, Jev’s is 4.2 cents per million.
Otherwise the API shape is very similar to Jev, at least conceptually. Jev supports three question types (opens in new tab) for yes/no, choices, or scores. OpenAI Decisions supports the same three types.
Install the plugin like this:
llm install llm-openai-decisionsHere’s an example query against an image attachment:
llm -m openai-decisions/gpt-6-luna -a https://static.simonwillison.net/static/2025/two-pelicans.jpg -s ‘Does this image contain any mammals?’And example output:
{”type”: “predicate”, “name”: “evaluation”, “probability”: 0.0}Consult the README (opens in new tab) for full details of how to run the other types of questions.
Quote 2026-10-06
Since the Medicare breach, OpenAI has put in place additional monitoring to allow “immediate intervention” by staff to stop training if the company’s models access the internet in ways they’re not supposed to, Mr. Kwon [chief strategy officer at OpenAI] said.
Victoria Kim (opens in new tab), Reporting from the Australian parliament
Given how tempting a target wikis are for rogue agent swarms, it’s not a huge surprise that Wikipedia found evidence of that activity once they went looking:
The Wikimedia Foundation conducted its own investigation to see whether Wikimedia websites had been similarly affected by AI agents, focusing on those operated by OpenAI. We can confirm that we have discovered some activity by these “rogue” OpenAI agents on Wikimedia platforms. The unauthorized bot activities included edits to our wikis, some unsuccessful attempts to exploit a public note-taking tool we host, and heavy traffic, which are described more below.
They found evidence of agents editing sandbox pages, trying to use pieces of infrastructure such as Etherpad to help proxy content from elsewhere, and saw widespread crawling and “hundreds of thousands of data queries” to their Wikidata Query Service.
My best guess is that most of this was a similar (or the same) swarm of agents as those that defaced that German wiki (opens in new tab) while training for research tasks.
The Wikipedia sandbox wiki edits appear to have started on May 12th, and the initial test edits to the UseModWiki Sandbox page reported by that incident started on May 11th.
Quote 2026-10-07
I was a graph theory junkie long ago and even moved to Budapest for awhile to study among the greats. While I was there I started working on Barnette’s Conjecture which came to occupy my thoughts over the next 24 years of my life, on and off as I worked in many different fields. Last summer I even thought for a few days that I had actually solved it.
But it’s supposedly proven here - problem 180 (opens in new tab). I don’t know what to think exactly. I spent thousands of hours on that problem. I really enjoyed it. Hearing that it is solved somehow makes me sad in a far-off way, like hearing an ex-girlfriend died suddenly in a car crash. I don’t know, there’s probably a lot of people feeling odd emotions tonight.
Jake Boggan (opens in new tab), Hacker News comment on openai/math (opens in new tab)
Link 2026-10-07 Anti-Patterns in Software Blogging (opens in new tab):
Some excellent writing advice from Michael Lynch. Michael warns against “meandering intros”, misjudging your reader’s existing knowledge, assuming they’ll read your previous posts, and excessive formality.
He also warns against overreliance on links (opens in new tab) as an excuse not to explain terminology. This one hurt! I do this all the time, but I have a nagging suspicion that almost nobody ever clicks on them.
(In a Lobste.rs comment (opens in new tab) Michael clarifies that “My rule of thumb is that my article should still make sense to the reader even if they don’t click any links”. That works for me.)
This point about using your own voice is crucial:
Beginner software bloggers suffer from a mass delusion that you have to write in a stiff, overly formal way for people to take you seriously […]
Just write the way you talk.
With so many developers delegating their writing to AI, software blogging is becoming bland and homogenous. Readers are hungry for writing with personality.
Quote 2026-10-07
I’ve always been kind of into computers since I was young. And then when film started to move from analog film to digital, I became more interested in that aspect of it. And the visual effects workflow for many years has included machine learning.
So I can write like pretty shitty Python scripts and stuff like that because with convolutional neural networks, which were the sort of precursors to what the transformer can do, which is just much more computation simultaneously, you would do things like look at what’s called a tensor, which is just the numerical translation of a visual image in numbers — like the batch number, the frame number, the red, green, and blue values of each pixel in each frame.
And a tensor, you use a convolutional neural network to identify patterns in that that would reveal what’s called edge detection or feature extraction, which is just identifying patterns enough to know like this is where the window ledge is, so we can more easily take the green screen image out and replace it with something.
Ben Affleck (opens in new tab), Pythonista
Quote 2026-10-08
Computer programming is, fundamentally, about two things:
Problem-solving using computers
Learning to control complexity while solving these problems
I have a hard time imagining a future where knowing how to solve problems with computers and how to control the complexity of those solutions is less valuable than it is today, so I think it will continue to be a viable career even with the advent of AI tools.
Release: ttok 0.4 (opens in new tab)
ttok is my CLI tool for counting tokens, using OpenAI’s open source tiktoken (opens in new tab) library.
It hasn’t been in updated in a couple of years, but I finally fixed a Click warning, updated CI, and added a --list-models command to list available models.
It works with uvx, so you can count tokens in anything like this:
cat file.txt | uvx ttokRelease: ttok 1.0 (opens in new tab)
I released ttok 0.4 (opens in new tab), ran uv tool upgrade ttok, piped a file into the new version… and realized that it was defaulting to the GPT-4 tokenizer when it should very clearly default to GPT-5/GPT-6 instead!
I figured switching the default was a reasonable excuse to finally ship a 1.0.
OpenAI haven’t actually confirmed that GPT-6 uses the same tokenizer as the GPT-5 family yet - there’s an angry issue about it (opens in new tab) - but I found this commit (opens in new tab) by William Liu which reports on an experiment he ran confirming that the tokenizers are likely the same:
All seven GPT models (5.5, 5.6 Sol/Terra/Luna, 6 Astra/Sol/Luna) report 44,794 tokens and match each other on every one of the 31 fixtures. GPT-6 introduces no input-count change on this corpus.
Quote 2026-10-09
Everyone is very concerned about being respectable, so I’m going to be the goofball who raises worst-case possibilities. I think there is a 1% chance we live in Minicrypt, and a 15% chance we functionally lose confidence in our existing public-key encryption algorithms. […]
The problem here is that the speed of AI producing surprises, and the speed of human beings replacing standards (even with the very best AI assistance) are just orders of magnitude different. You only recover from a surprise like this if you do the preparation in advance.
Matthew Green (opens in new tab), on Twitter. I looked it up and Minicrypt is Russell Impagliazzo’s hypothetical world (opens in new tab) in which public-key encryption is impossible.
Link 2026-10-09 Deno is joining Cloudflare (opens in new tab):
The Deno team released the first version of celld (opens in new tab) back in August - their open source implementation of the Durable Objects pattern from Cloudflare Workers.
Today, Cloudflare are acquiring Deno outright, with the goal of building on celld to “make workerd self-hosting a first-class supported way to build and run apps using the Workers programming model” (see the Cloudflare blog (opens in new tab).)
The bad news is that Deno itself will not be maintained by Cloudflare beyond the next year:
We will support the Deno runtime (opens in new tab)for another year with monthly releases containing bug fixes and security updates. After that year we will end our development of the Deno runtime. Deno will remain open source, and we welcome others who want to continue its development.
Deno (and Node.js) creator Ryan Dahl explained that decision in a comment (opens in new tab) on Hacker News:
It’s a joint decision and I agree with it. I’m most invested in its success and have put the most work into it - and I no longer think it’s where I can do the most important work. There are some good ideas in Deno and it’s well engineered - but it ultimately is not solving big problems. It has been sucked into the gravity well of node compatibility, which forces it to behave exactly as Node does. Why reimplement Node? It works. Marginal performance or UX or security benefits are not enough.
I’m interested in building powerful new abstractions. celld has been working remarkably well, depending only on object storage for coordination and persistence. It is not just a slightly different API to interact with the file system or network - it’s an entirely new model for server development.
My favorite feature of Deno has long been the permissions system, where you can run a Deno script and specify exactly which files and folders it can read and write to, and which network hosts it can access.
Node.js has a similar permissions model (opens in new tab) these days, added in Node v20.0.0 (opens in new tab) in April 2023 and declared stable in Node v22.13.0 (opens in new tab) in January 2025. They don’t yet support allow-listing specific network hosts though - networking is either on or off.
Quote 2026-10-10
Anthropic detailed the activity of its A.I. agents in a blog post (opens in new tab) on Friday, without naming the targeted websites. But two sources with knowledge of the incidents said Anthropic’s A.I. agents had submitted 20 visa applications through a form available on the State Department’s website. All the applications were incomplete and were not processed, they said.
The New York Times (opens in new tab), Anthropic Agents Tried to Fill Out Visa Forms on State Dept. Website
Link 2026-10-10 Python 3.15.0 added to actions/python-versions (opens in new tab):
Bit of a niche link, but I’ve been waiting for this for a couple of days - I even told ChatGPT (opens in new tab) to check for it:
Clone https://github.com/actions/python-versions and git pull once an hour until they add the stable 3.15 - then tell me about it
Now that this has landed, you can add "3.15"to a GitHub Actions testing matrix to run tests against the new Python 3.15.0 release (opens in new tab).
I remember hearing a while ago that Dwarf Fortress didn’t use version control. That fact has been lodged in my head, because given its inherent complexity I have trouble imagining a codebase that would benefit from version control more. That’s art.
I went looking and I’m sad to report that the days without version control appear to have ended. Quoting Tarn Adams over time:
That March 2023 quote comes from an interview about the release on Steam which made them millionaires (opens in new tab). I’m a tiny bit sad that they gave in before they hit that milestone, but what an impressive run.
My plugin for detecting and listing all Datasette instances on the current machine now works with the latest version, and displays the detected PID as well. Knowing the PID makes it easier to attach the new Python 3.15 profiler (opens in new tab).
If you find this newsletter useful, please consider sponsoring me via GitHub (opens in new tab). \$10/month and higher sponsors get a monthly newsletter with my summary of the most important trends of the past 30 days - here are previews from June (opens in new tab) and July (opens in new tab) and August (opens in new tab).
-
Simon Willison used Codex in the ChatGPT desktop app’s voice mode against his local Django blog checkout, first starting the dev server to inspect a live preview; he dictated requirements while cooking for about half an hour, and Codex asked clarifying questions as it modified the code. The session used GPT-6 Astra High and produced the newsletter model, imports, archive pages, and search integration; the agent also found Substack’s undocumented
/api/v1/archiveendpoint and worked out its pagination. - Voice plus a live preview worked well for multitasking and broad feedback, but Willison switched to typing for precise changes; PR review caught an import script using a Git subprocess where an API was preferable for accessing a private repository, and he asked Codex to replace it before merging.
-
A reusable integration pattern: have a coding agent read a new API’s documentation and adapt an existing plugin as a reference. Willison used GPT-6 Astra to build
llm-openai-decisionsfrom the OpenAI Decisions API docs, inspired byllm-typesafe; install it withllm install llm-openai-decisions.