pool (2026.08.31.2) Two more found by fuzzing rather than by users, outside the type system. Both are ordinary-path bugs a happy-path test cannot reach. A failed statement was never released. Successful DML sent PREPARE -> EXECUTE -> RELEASE; failing DML sent PREPARE -> EXECUTE and stopped. The statement stayed allocated server-side, collided with the next PREPARE, and every subsequent call on that connection returned a nonsense error (-255 "Not in transaction" under autocommit, -285 otherwise) whose offset pointed back at the FAILED sql rather than the new statement. In practice: one duplicate-key violation bricked the connection. An INSERT tripping a unique constraint is about the most routine error an application can hit — every insert-if-not-exists pattern makes them — and afterwards nothing on that connection worked. The docstring on the parameterised path already described this hazard and guarded the parameter-ENCODING failure; it never covered EXECUTE itself failing. Fixed in all three paths (DML, parameterised DML, and SELECT — whose fetch loop had the same gap, and whose GC-time finalizer only covers scrollable cursors). Cancelling a pool acquire leaked the connection permanently. asyncio.to_thread cannot interrupt its worker, so a task cancelled while blocked in pool.acquire() left the worker to finish and hand back a connection nobody owned — checked out, never returned, one slot gone per occurrence until the pool was dead. Not theoretical for anything serving HTTP: a client disconnect cancels the request task, and under load those cancellations land precisely while waiting for a connection. The pool dies one slot at a time, only under load, and PoolTimeoutError points nowhere near the cause. acquire() now shields the inner future and returns whatever the worker produced if the caller went away; add_done_callback fires immediately on an already-resolved future, so the "worker finished just before the cancel" race is the same code path rather than a second one. The harness covered three things the type fuzzer cannot see: fetch batching (NFETCH is a 4096-BYTE budget, so batch edges move with row width — counts 0..1025 across three schema widths, every fetch style required to agree), error recovery (eight error classes, repeated, each followed by a known-good query on the same cursor and a fresh one), and concurrency (threads sharing one connection, pooled threads that fail before releasing, transaction isolation across checkouts, async cancellation). Every worker reads back a value only it supplied, so a crossed wire fails on data even when nothing raises. Two harness false positives worth recording: Informix silently truncates over-long strings (a literal SQL insert does the same, so the driver matches the server), and it rejects a bare `?` in a projection — a cast is required. 356/356 integration on 15, 14.10 and 12.10 (was 326).
Starlight Starter Kit: Basics
npm create astro@latest -- --template starlight
🧑🚀 Seasoned astronaut? Delete this file. Have fun!
🚀 Project Structure
Inside of your Astro + Starlight project, you'll see the following folders and files:
.
├── public/
├── src/
│ ├── assets/
│ ├── content/
│ │ └── docs/
│ └── content.config.ts
├── astro.config.mjs
├── package.json
└── tsconfig.json
Starlight looks for .md or .mdx files in the src/content/docs/ directory. Each file is exposed as a route based on its file name.
Images can be added to src/assets/ and embedded in Markdown with a relative link.
Static assets, like favicons, can be placed in the public/ directory.
🧞 Commands
All commands are run from the root of the project, from a terminal:
| Command | Action |
|---|---|
npm install |
Installs dependencies |
npm run dev |
Starts local dev server at localhost:4321 |
npm run build |
Build your production site to ./dist/ |
npm run preview |
Preview your build locally, before deploying |
npm run astro ... |
Run CLI commands like astro add, astro check |
npm run astro -- --help |
Get help using the Astro CLI |
👀 Want to learn more?
Check out Starlight’s docs, read the Astro documentation, or jump into the Astro Discord server.