Subscribe free
Morning Merge · Sunday, October 25, 20266 min read

uv and ty team up, and Brotli needs patching

uv check lands in preview, C++26's ballot is disapproved, and PingCAP confirms a breach

The main thing

An isometric tool carriage holds a socket wrench and a measuring probe over the same engine block, with only the carriage coloured orange.

Got a folder of one-off Python scripts, each with its own dependencies? Your editor may finally stop putting red squiggles under every import. You can try it today, as long as you're fine with "experimental".

Astral has released an experimental integration between uv and ty, available in preview. uv knows your project's environment and dependencies. ty, Astral's type checker and language server, knows your code. Together, ty reads PEP 723 inline metadata and asks uv to build an environment for each script. It then checks every script against that script's own declared requirements, even when they differ from the rest of the project. Completions, hover and Go to Definition use the same environments.

The other half is uv check. One command prepares your project's environment, installs dependencies and runs ty. It uses the ty version recorded in your lockfile, so your laptop and CI run the same ty without a separate pin. If you never run it, nothing changes. ty only gets installed the first time you do.

One caveat is worth reading twice. Installing dependencies can run third-party Python code, so automatic environment setup for scripts is opt-in for now. Later, Astral plans to turn script support on by default, add Ruff to uv check, and add checks that need both tools, such as finding unused dependencies.

What to do today: Upgrade to uv 0.12.3, then try uv check on one repo. Turn on ty.experimental.useUv only for scripts whose dependencies you trust.

Quick bits

HTTP2Shell spreads Node2Shell to anything that decodes Brotli. Aikido describes CVE-2026-111497 as an out-of-bounds write in Google's Brotli decoder, versions 1.0.3 through 1.2.0. Aikido says OpenAI found it in February and reported that it works in both directions: a malicious client can take over an unpatched server, and a malicious server can take over a client that accepts compressed responses. A commenter disputes the OpenAI credit, saying Google fixed the code in February without knowing it was a security bug. Per Aikido, Python environments are exposed if they have Brotli 1.2.0 or earlier, or brotlicffi 1.2.0.x, installed, because requests, httpx and aiohttp load these packages automatically. Aikido noted that as of October 23, advisory databases didn't map the CVE to either PyPI package, so pip-audit, Dependabot and Safety wouldn't flag them. Fixed versions, per Aikido's patch list:
- libbrotli 1.2.1, or the patched 1.0.10 and 1.1.1 for older release lines
- Python: Brotli 1.2.1 and brotlicffi 1.2.1.0
- C++: Aikido says patches are available, but the advisory does not name a fixed release
- Node.js 22.23.4, 24.22.1 or 26.12.1
- Bun 1.4.4, then rebuild any compiled executables
- Envoy 1.40.0, 1.39.3, 1.38.6 or 1.37.8; Istio 1.29.9, 1.30.6 or 1.31.2

Rebuild your images, redeploy and restart. If you can't patch yet, turn off Brotli decoding, or uninstall Brotli and brotlicffi wherever they're optional.

The PHP Foundation is "under-funded" with one full-time staff member, its director tells Reuters. We couldn't load the article, so the headline is all we have. This comes in the same week as the PHP2Shell bugs. The discussion links to the foundation's Open Collective spending.

Dan Luu wants you to build bigger. His examples: Michael Malis's pgrust, whose testing keeps finding real Postgres bugs, and Luu's own regex engine, ripgrep fork and faster Rust builds. He says those took a low single-digit number of hours, not a year. One commenter counters that pgrust was just removed from ClickBench for cheating the benchmark. Ambition: now with footnotes.

PingCAP confirms theft of source code and customer data. PingCAP says the exported records included user names, emails, organization and project associations, and SQL editor text. FulcrumSec claims it took 10.6 TB, including API keys, but no one has verified that. PingCAP itself recommends that TiDB Cloud customers replace active TiDB Cloud management API keys and watch for targeted phishing.

C++26's ballot came back Disapproved. 12 of 20 P-members voted in favor (60%, where 66.66% is needed), and 9 of 22 member bodies voted no (41%, where the limit is 25%). The post doesn't say what happens next. C++ can still surprise people.

Cerebras explains how it serves trillion-parameter models, using the ~3T-parameter Kimi K3 as an illustrative example. In that example, the model needs 59 WSE-3T wafers with 44 GB of on-chip SRAM each. Weights stay put, and only activations hop between wafers, at about 2 microseconds per hop. Cerebras claims 1000 to 2000+ tokens per second. The discussion asks what happens when one wafer in the pipeline fails.

Gemini 4 Argon spent 11 unattended hours optimizing Google's ADK. Reviewers accepted two of its changes: about 40% less in-memory session-preparation overhead in long sessions, and cold imports 21% faster. They rejected four others. The night shift still needs a day shift.

Also happening

Patch Brotli first, then go build something ambitious.

← All issues

Get this in your inbox every morning.

Free. Five minutes. Unsubscribe in one click.

Subscribe free →