Skip to content

v1.1.0 — Correctness & hardening

Choose a tag to compare

@yib7 yib7 released this 03 Jul 03:50

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_DEFAULT is now actually enforced — endpoints without an explicit limit (including /login and /register) were previously unthrottled.
  • .xls uploads now work (added the xlrd engine; 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 Dataset table (never read back). On a pre-existing database the now-unreferenced datasets table remains but is harmless — it is simply no longer created or written.

Full details in CHANGELOG.md.