Sprites API
Improved: Storage sync jobs are now resilient to deploys
Large storage syncs are now broken into a chain of small jobs, one per page of buckets, instead of one long-running job. This means a rolling deploy no longer forces a full re-sync from scratch — each page finishes well within the deployment grace period and any interrupted page is safely retried without producing duplicate billing records.
Improved: Remote MCP server tools are clearer and safer
The Sprites remote MCP server now exposes metadata that lets Claude distinguish read-only tools from destructive ones. Users also get more actionable error messages when required parameters are missing or a backend routing issue occurs.
Improved: Storage sync resumes from where it failed
If a storage sync job hits an error partway through paginating buckets, it now picks up from the point of failure instead of starting over from the beginning. Buckets already processed are not lost, and a follow-up job is automatically queued to continue from the last successful offset.
Fixed: Oban queue stats were silently failing to report
A type mismatch in the queue stats query was causing an error on every poll, which meant job queue metrics (sprites_oban_queue_stats_count, oldest_age_ms) were never emitted to Prometheus. The query now runs correctly and metrics appear as expected.
Fixed: Empty job queues now report zero instead of disappearing from metrics
When a job queue drained completely, its metrics series would vanish from Prometheus rather than showing zero. Queue stats now explicitly emit a zero value for every tracked state, so dashboards and alerts behave correctly even when queues are empty.
Improved: Prometheus metrics are now active in production
The Prometheus metrics endpoint is now enabled in the application’s supervision tree. Metrics were previously collected but not served; they are now available and scraped in production.
Fixed: Metrics server no longer fails to start during blue/green deploys
The Prometheus metrics listener previously crashed with an address-in-use error when a new instance started before the old one finished shutting down during a blue/green deploy. The server now uses socket options that allow both instances to bind the same port simultaneously during the cutover window.