<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: Comments</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/atom/beats/comment/" rel="self"/><id>http://simonwillison.net/</id><updated>2026-09-11T17:28:37+00:00</updated><author><name>Simon Willison</name></author><entry><title>Feeling sad about AI</title><link href="https://news.ycombinator.com/item?id=49661506#49662090" rel="alternate"/><published>2026-09-11T17:28:37+00:00</published><updated>2026-09-11T17:28:37+00:00</updated><id>https://news.ycombinator.com/item?id=49661506#49662090</id><summary type="html">&lt;p&gt;&lt;a href="https://news.ycombinator.com/item?id=49661506#49662090"&gt;My comment&lt;/a&gt; on &lt;a href="https://news.ycombinator.com/item?id=49661506"&gt;Feeling sad about AI&lt;/a&gt; &amp;mdash; Hacker News.&lt;/p&gt;&lt;p&gt;I'm not sure how useful it is to say this, but I think a lot of people (myself included, a few years ago now) have been through this moment of existential crisis and come out the other side.&lt;/p&gt;
&lt;p&gt;The initial reaction, when some coding agent does a piece of work that would have taken you a week in an hour and does it &lt;em&gt;well&lt;/em&gt;, is to be very disheartened by it.&lt;/p&gt;
&lt;p&gt;Once you come to terms with the idea that translating an exact specification into decent code isn't a unique skill any more, you can start looking at the larger set of problems that you face as a software engineer and realize that there is &lt;em&gt;so much left&lt;/em&gt;, and your existing skill and experience mean you can master these new tools, provide value, and execute at a level far greater than anyone who is just getting started building software using agents without any of your depth.&lt;/p&gt;
&lt;p&gt;If you don't want your profession to change at all then you're going to have a tough time with this - but that's surely been true for the history of software engineering? Has there ever been any stability to the tools and language we use beyond about a five year time horizon?&lt;/p&gt;
&lt;p&gt;These changes are happening a bit faster, but if you chose software development as a passion you've opted into pretty frequent radical change from the start.&lt;/p&gt;</summary><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="deep-blue"/></entry><entry><title>There's No Limit to How Bad Code Can Get</title><link href="https://lobste.rs/s/rfn2mn/there_s_no_limit_how_bad_code_can_get#c_8kdtaw" rel="alternate"/><published>2026-09-06T09:08:06+00:00</published><updated>2026-09-06T09:08:06+00:00</updated><id>https://lobste.rs/s/rfn2mn/there_s_no_limit_how_bad_code_can_get#c_8kdtaw</id><summary type="html">&lt;p&gt;&lt;a href="https://lobste.rs/s/rfn2mn/there_s_no_limit_how_bad_code_can_get#c_8kdtaw"&gt;My comment&lt;/a&gt; on &lt;a href="https://lobste.rs/s/rfn2mn/there_s_no_limit_how_bad_code_can_get"&gt;There&amp;#x27;s No Limit to How Bad Code Can Get&lt;/a&gt; &amp;mdash; Lobste.rs.&lt;/p&gt;&lt;p&gt;&lt;em&gt;[In reply to a comment about burning it down to start from scratch when technical debt becomes overwhelming]&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In my experience it's &lt;em&gt;so rare&lt;/em&gt; for that to work.&lt;/p&gt;
&lt;p&gt;You announce the old thing is irrecoverably drowning in tech debt. You spin up a team to rewrite it from scratch. Work begins.&lt;/p&gt;
&lt;p&gt;Meanwhile the old thing remains a moving target: it's running the core business, so changes are still necessary. The developers working on it know that it's going to be made obsolete by the new thing soon, so they don't have any incentive to go beyond the smallest effort possible to add the new features. Technical debt continues to mount.&lt;/p&gt;
&lt;p&gt;Meanwhile, the team working on the new thing are ambitious and probably a little naive. They start out at a great pace - it's greenfield after all - but as time progresses it becomes apparent that nobody fully understands the behavior and scope of the thing they are replacing. If it was well documented and tested it wouldn't &lt;em&gt;need&lt;/em&gt; to be replaced, after all...&lt;/p&gt;
&lt;p&gt;After months (or even years) without delivering value, the pressure is on to "ship it", so the new system is launched to handle a subset of what the old system handled - or often for some new feature that was too hard to build with the now mostly unmaintained old system.&lt;/p&gt;
&lt;p&gt;... so now you have TWO systems in production - the janky old system that nobody wants to touch, and a new system which handles just a few production features and is 80% inactive code that is meant to replace the old system, eventually.&lt;/p&gt;
&lt;p&gt;If you're &lt;em&gt;really lucky&lt;/em&gt; the company won't have lost patience with the new system and will allow that work to continue. The longer this all takes, and the longer the old system stays in production and stubbornly continues to work, the higher the risk that "priorities have changed" and the new system total replacement work is abandoned, leaving you with two systems where you used to have one.&lt;/p&gt;
&lt;p&gt;The best article I've read about completing this process responsibly is &lt;a href="https://lethain.com/migrations/"&gt;Migrations: the sole scalable fix to tech debt&lt;/a&gt; by Will Larson.&lt;/p&gt;
&lt;p&gt;If I run into a situation like this in the future, my strong recommendation will be to shore up the old system with as much automated testing as possible and then seeing if targeted refactors can get it to the desired shape. My hunch is that in many cases that will have a much higher chance of success than the siren call of a greenfield replacement.&lt;/p&gt;</summary><category term="migrations"/><category term="technical-debt"/></entry><entry><title>Now we have a timeline of the OpenAI accidental attack against Hugging Face</title><link href="https://news.ycombinator.com/item?id=49220609#49221745" rel="alternate"/><published>2026-08-08T14:06:41+00:00</published><updated>2026-08-08T14:06:41+00:00</updated><id>https://news.ycombinator.com/item?id=49220609#49221745</id><summary type="html">&lt;p&gt;&lt;a href="https://news.ycombinator.com/item?id=49220609#49221745"&gt;My comment&lt;/a&gt; on &lt;a href="https://news.ycombinator.com/item?id=49220609"&gt;Now we have a timeline of the OpenAI accidental attack against Hugging Face&lt;/a&gt; &amp;mdash; Hacker News.&lt;/p&gt;&lt;p&gt;I think one of the most interesting details here might be tucked away in that first bullet point:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;May 7: OpenAI starts a new training run for an experimental, unreleased model. &lt;em&gt;(Do they mean an evaluation run? They say training run in the video, and later mention a “reward signal to judge how well they’re doing”, so I guess this really was about training a model, not evaluating one that was already trained.)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The more I think about this the more I suspect that the fact this happened while &lt;em&gt;training&lt;/em&gt; a new model is key to understanding what went wrong.&lt;/p&gt;
&lt;p&gt;In RLVR - Reinforcement Learning with Verifiable Rewards - you set the model a goal and have it take &lt;em&gt;any steps necessary&lt;/em&gt; to achieve that goal.&lt;/p&gt;
&lt;p&gt;Clearly one aspect of OpenAI's training here is to RLVR their models for cybersecurity tasks. Just like pre-training benefits from dumping in vast sources of knowledge, the more tasks you can feed into RLVR the more of a general purpose capable model you get at the end.&lt;/p&gt;
&lt;p&gt;This also helps explain why the models had nothing to cause them to hold back. Those safety behaviors are added much later in the process.&lt;/p&gt;
&lt;p&gt;AND it explains (but does not excuse) why monitoring was so lax. If you're training a new model like this you presumably set it thousands of tasks like this in parallel. I can see how you might miss that a tiny subset of your training agents have started leaving each other messages in filenames on your packaging server.&lt;/p&gt;
&lt;p&gt;Someone once told me that you can't just leave the racist materials out of your training data if you want a non-racist model: it has to have seen examples of racism in order to later be taught that racism is bad.&lt;/p&gt;
&lt;p&gt;I can see echoes of that here. If your model doesn't know how to aggressively hack things how do you later teach it not to?&lt;/p&gt;
&lt;p&gt;(I have little knowledge of how RLVR works in practice so I'm looking forward to hearing from people who can help me understand if I'm on the right track here.)&lt;/p&gt;</summary><category term="ai"/><category term="openai"/><category term="generative-ai"/><category term="llms"/><category term="ai-security-research"/><category term="openai-hugging-face-incident"/><category term="accidental-cyberattacks"/></entry><entry><title>Devtools must be open source (exe.dev)</title><link href="https://news.ycombinator.com/item?id=49156111#49156719" rel="alternate"/><published>2026-08-03T15:30:38+00:00</published><updated>2026-08-03T15:30:38+00:00</updated><id>https://news.ycombinator.com/item?id=49156111#49156719</id><summary type="html">&lt;p&gt;&lt;a href="https://news.ycombinator.com/item?id=49156111#49156719"&gt;My comment&lt;/a&gt; on &lt;a href="https://news.ycombinator.com/item?id=49156111"&gt;Devtools must be open source (exe.dev)&lt;/a&gt; &amp;mdash; Hacker News.&lt;/p&gt;&lt;p&gt;One of the arguments for open source software for end-users has always been the freedom to examine and modify how that software works.&lt;/p&gt;
&lt;p&gt;The reality for most people - even expert programmers - has been that the freedom is more about being able to lean on &lt;em&gt;other people&lt;/em&gt; to do that. Most people can't justify the time commitment needed to read and then modify the code for tools they use very often.&lt;/p&gt;
&lt;p&gt;I think LLMs have changed that equation in a way that makes the original dream much more feasible.&lt;/p&gt;
&lt;p&gt;Several times a day I'll prompt regular Claude chat to "Clone x/y from GitHub and tell me how Z works".&lt;/p&gt;
&lt;p&gt;Getting software to compile in order to start hacking on it used to be enough friction that I often wouldn't bother. Now I treat that as a zero time investment challenge: tell Codex or Claude Code to checkout and build X and then come back ten minutes later and see how it got on.&lt;/p&gt;
&lt;p&gt;I'm not habitually &lt;em&gt;modifying&lt;/em&gt; the software I use yet, but I can see a path to that which didn't exist a year or so ago.&lt;/p&gt;</summary><category term="hacker-news"/><category term="open-source"/><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="ai-assisted-programming"/></entry><entry><title>encode/httpx: Version 1.0 public call.</title><link href="https://github.com/encode/httpx/discussions/3344#discussioncomment-14170874" rel="alternate"/><published>2025-08-20T03:07:26+00:00</published><updated>2025-08-20T03:07:26+00:00</updated><id>https://github.com/encode/httpx/discussions/3344#discussioncomment-14170874</id><summary type="html">&lt;p&gt;&lt;a href="https://github.com/encode/httpx/discussions/3344#discussioncomment-14170874"&gt;My comment&lt;/a&gt; on &lt;a href="https://github.com/encode/httpx/discussions/3344"&gt;encode/httpx: Version 1.0 public call.&lt;/a&gt; &amp;mdash; GitHub.&lt;/p&gt;&lt;p&gt;I'm not thrilled about the 1.0 version changing the design of HTTPX so thoroughly - it looks like it's splitting &lt;code&gt;httpx&lt;/code&gt; and &lt;code&gt;ahttpx&lt;/code&gt; into entirely separate packages.&lt;/p&gt;
&lt;p&gt;Python's single biggest weakness when it comes to dependency management is that it isn't possible to install two different versions of a package in the same environment. This makes backwards-incompatible changes really painful, because they lead to a prolonged period where different third-party dependencies may themselves require conflicting versions of another dependency.&lt;/p&gt;
&lt;p&gt;This happened with Pydantic 2 and it was &lt;em&gt;miserable&lt;/em&gt; - there was a solid 8-12 month period where depending on Pydantic could actively harm a project if that project also depended on something else that used Pydantic 1 - you couldn't upgrade to 2 until your dependency also upgraded to 2, and if you wanted to depend on libraries X and Y where X depended on Pydantic 1 and Y depended on Pydantic 2 your project just couldn't be built using those libraries!&lt;/p&gt;
&lt;p&gt;I fear that an HTTPX breaking change could be even more painful than the Pydantic one was.&lt;/p&gt;
&lt;p&gt;Consider two of the most popular libraries for interfacing with LLMs - Anthropic and OpenAI's.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/anthropics/anthropic-sdk-python/blob/main/pyproject.toml"&gt;https://github.com/anthropics/anthropic-sdk-python/blob/main/pyproject.toml&lt;/a&gt; depends on &lt;code&gt;"httpx&amp;gt;=0.25.0, &amp;lt;1"&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/openai/openai-python/blob/main/pyproject.toml"&gt;https://github.com/openai/openai-python/blob/main/pyproject.toml&lt;/a&gt; depends on &lt;code&gt;"httpx&amp;gt;=0.23.0, &amp;lt;1"&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;There are plenty of other projects that depend on both - anything that attempts to provide an abstraction layer over multiple LLM providers, for example (&lt;a href="https://llm.datasette.io/"&gt;cough&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Now what happens if HTTPX 1.0 comes out with a breaking API, and Anthropic upgrade to it but OpenAI don't? Any package that depends on both of those underlying packages will be stuck in a no-mans land - it will be forced to stick with HTTPX&amp;lt;1.0 and pin the older version of the Anthropic package, then will be blocked waiting for OpenAI to ship their upgrade.&lt;/p&gt;
&lt;p&gt;It's not just LLM packages though. Show me Python software that &lt;em&gt;doesn't&lt;/em&gt; use an HTTP client these days! &lt;a href="https://github.com/encode/httpx/network/dependents"&gt;https://github.com/encode/httpx/network/dependents&lt;/a&gt; lists 527,282 repositories and 13,654 packages. Will every one of those need to make changes to handle the switch to HTTPX 1.0?&lt;/p&gt;
&lt;p&gt;I understand that complaining about a 0.x to 1.0 having breaking changes is &lt;em&gt;distinctly&lt;/em&gt; uncool of me. That's the whole point of a pre-1.0 version number, at least for projects that follow SemVer.&lt;/p&gt;
&lt;p&gt;I have to admit: I had optimistically hoped that HTTPX wasn't going to follow SemVer given the Python ecosystem's uniquely painful response to breaking changes in major packages that other packages depend on.&lt;/p&gt;
&lt;p&gt;If I'd know this was going to happen I would have tried to find some other post-1.0 HTTP library to build all of my stuff around!&lt;/p&gt;
&lt;h2&gt;Solution: call the package httpx2!&lt;/h2&gt;
&lt;p&gt;I don't like complaining without offering solutions, so here's the one way I can see that this change could be implemented while avoiding all of that pain: &lt;strong&gt;change the package name&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If &lt;strong&gt;httpx2&lt;/strong&gt; came out with this new design, leaving &lt;strong&gt;httpx&lt;/strong&gt; in place, &lt;em&gt;all&lt;/em&gt; of these problems go away.&lt;/p&gt;
&lt;p&gt;Some projects can switch to&lt;code&gt;httpx2&lt;/code&gt; as their client library. Old projects can stick with &lt;code&gt;httpx&lt;/code&gt;. If my project needs to mix and match dependencies that don't agree on that version then it's fine - I can have both &lt;code&gt;httpx&lt;/code&gt; and &lt;code&gt;httpx2&lt;/code&gt; installed in the same environment at the same time.&lt;/p&gt;
&lt;p&gt;Mark &lt;code&gt;httpx&lt;/code&gt; as deprecated and no longer supported (and/or offer to keep on patching it in exchange for paid sponsorship of the work). Make &lt;code&gt;httpx2&lt;/code&gt; clearly the better option.&lt;/p&gt;
&lt;p&gt;That way projects get to switch to &lt;code&gt;httpx2&lt;/code&gt; - and handle the breaking changes - on their own time and without causing any pain for other projects that depend on them but are not yet ready to upgrade their other uses.&lt;/p&gt;
&lt;p&gt;I really, really wish Pydantic had done this with their Pydantic 2 upgrade.&lt;/p&gt;
&lt;p&gt;I get that it feels ugly to have a &lt;code&gt;2&lt;/code&gt; on the end of the name - &lt;code&gt;jinja2&lt;/code&gt; got stuck with that seventeen years ago. But I think that tiny bit of ugliness may be a price to pay for shipping significant breaking changes to a library with 500,000 existing users.&lt;/p&gt;</summary><category term="open-source"/><category term="packaging"/><category term="python"/><category term="httpx"/><category term="pydantic"/></entry></feed>