JS Wei (Jack) Sun

httpx2 swap breaks Anthropic and OpenAI SDK tracers, SELF hides ELF in SQLite

Every URL the pipeline pulled into ranking for this issue — primary sources plus the supporting and contradicting findings each Researcher returned. Inline citations in the issue point back here.

← Back to the issue

Sources

Your executable is a SQLite database simonwillison.net

Your executable is a SQLite database Farid Zakaria describes a neat Linux pattern for creating a SQLite database file that can be directly used as an executable binary. The trick sets the SQLite file format’s 4-byte application ID (68 bytes into the file) to SELF, standing for Structured Executable & Linkable Format. The various components of the ELF executable format are then arranged into a number of different SQLite tables, using this schema . Their self-exec interpreter ( C code here ) can…

llm-anthropic 0.27 simonwillison.net

Release: llm-anthropic 0.27 This release of the Anthropic plugin for LLM mainly provides compatibility with the recently released anthropic v1.0.0 Python library, which switches from httpx to httpx2 . OpenAI made the same change in their v3.0.0 release two weeks ago. Anthropic provide this migration guide for upgrading to 1.0, so I prompted Fable 5 in Claude Code with: Upgrade to anthropic>=1 - read https://raw.githubusercontent.com/anthropics/anthropic-sdk-python/refs/heads/main/MIGRATION.md a…

References

Pydantic httpx2 migration docs pydantic.dev

httpx2 defaults to using the operating system’s trust store via truststore instead of the certifi bundle… Support for Python 3.9 was dropped, requiring Python 3.10+… httpx2.Response is type-incompatible with the original httpx.Response, making isinstance checks fail across library boundaries.

ecorpit.com — Anthropic SDK v1 breaking changes writeup ecorpit.com

Anthropic has significantly ‘cleaned’ the SDK surface by removing sampling parameters—temperature, top_p, and top_k—from core methods like messages.create()… newer generations, such as Claude Fable 5, return a 400 error for non-default sampling values.

Simon Willison (Aug 2025) — earlier warning on httpx split simonwillison.net

Splitting the library into two distinct packages (httpx vs httpx2) exacerbates Python’s inability to install multiple versions of the same dependency, leading to a ‘miserable’ transition period similar to the Pydantic V1-to-V2 leap.

manueltgomes.com — httpx2 ecosystem impact manueltgomes.com

A major conflict occurred when the Anthropic Python SDK v1.0 migrated to httpx2, causing immediate runtime crashes for users of Pydantic AI (v2.32 and earlier) who had not yet updated to support the new client.

Anthropic release notes / migration guide (claude.com) platform.claude.com

The SDK documentation prescribes calling httpx2.alias_httpx() at startup… however, this workaround may not satisfy all tracing tools, leading to cases where outbound calls ‘quietly stop’ appearing in observability dashboards without raising errors.

securityarsenal.com — LLM 0.33 dependency-churn security review securityarsenal.com

Security researchers noted that such ‘rapid dependency churn’ is a significant change-control trigger, as dependency swaps are a common vector for supply-chain attacks.

Farid Zakaria — ‘Your executable is a SQLite database’ (author blog) fzakaria.com

Two processes running the same SELF binary do not share text pages the way a normally-mmap’d ELF does, because the bytes are copied out of the b-tree rather than mapped.

Tildes.net discussion (~comp) tildes.net

SELF binaries copy data out of the SQLite B-tree into memory… system monitors like ps and top mistakenly display the interpreter (self-exec) as the running process rather than the application itself.

fzakaria/selfdb GitHub — benchmarks github.com

Packing an entire Linux userland (723 executables and 400 libraries) into one database reduced total size from 644.4 MiB to 611.9 MiB due to natural deduplication of symbols and strings; a stripped single SELF is within 1% of the original ELF (1.79 MB vs 1.76 MB).

selfdb README — tooling as SQL github.com

ldd is a view that joins the symbols table with segments to find required shared libraries, while strip is implemented as a simple DELETE transaction followed by a VACUUM; a proof-of-concept dynamic linker self-ld performs symbol resolution and relocation patching entirely through SQL queries.

LWN — kernel developer commentary on binfmt_misc lwn.net

Manipulating kernel paths to facilitate custom loaders is ‘ripe for malicious loader injection attacks.’

Jack Sun

Jack Sun, writing.

Engineer · Bay Area

Hands-on with agentic AI all day — building frameworks, reading what industry ships, occasionally writing them down.

Digest
All · AI Tech · AI Research · AI News
Writing
Essays
Elsewhere
Subscribe
All · AI Tech · AI Research · AI News · Essays

© 2026 Wei (Jack) Sun · jacksunwei.me Built on Astro · hosted on Cloudflare