v1.1.0 — Correctness & hardening
A full-codebase audit closed 16 issues (2 P0, 6 P1, 8 P2) across rate limiting, the LLM and sandbox layer, storage integrity, input validation, and billing. No breaking changes for end users. Test suite grew from 178 to 216; ruff, byte-compile, and pip-audit all clean.
Highlights
- Rate limiting:
RATE_LIMIT_DEFAULTis now actually enforced — endpoints without an explicit limit (including/loginand/register) were previously unthrottled. .xlsuploads now work (added thexlrdengine; the format was advertised but failed).- LLM robustness: the Gemini client now has an HTTP timeout, so a stalled call can't pin a worker thread.
- Sandbox: a timed-out Docker run is now killed instead of orphaned with its full resource allowance.
- Storage integrity: version-history/metadata/approved-script files are written atomically — a crash mid-write can no longer silently reset a dataset's cleaning history. TTL cleanup now runs on ordinary traffic and prunes empty dirs.
- Input validation: malformed JSON on several endpoints returns a clear 400 instead of a 500.
- Billing (when enabled): credit debiting is a single atomic operation and runs only after moderation — no double-spend, no charges for blocked requests. Constant-time master-password compare.
- Accounts: duplicate registration returns 409; a failed verification email reports a distinct message.
Removed
- The unused write-only
Datasettable (never read back). On a pre-existing database the now-unreferenceddatasetstable remains but is harmless — it is simply no longer created or written.
Full details in CHANGELOG.md.