Skip to content

v0.15.9

Choose a tag to compare

@nuclon nuclon released this 16 May 14:44
· 951 commits to main since this release

What's Changed

Features

  • Job duration insights — A new Duration insights card on the Task Detail page shows p50/p95/avg/min/max over the last 50 completed runs, a per-step duration breakdown, and a zero-dependency SVG sparkline with p50/p95 reference lines. The Job Detail page now shows an ETA pill on running jobs (step-weighted estimate from historical step p50s) that flips to an Overrun badge when a job has been running longer than the task's typical median. Step rows in the timeline show inline p50: Xs badges, and a running step's elapsed time turns amber once it passes the step's p50. (f97e232)

  • Server-level default timeouts — Two new server-config.yaml keys, default_step_timeout and default_job_timeout, fill in when a task or step does not specify its own timeout. The resolved value is written to the DB row at job-creation time and enforced by the existing recovery sweep — operators can finally close the "stuck pod runs forever" footgun with a single config line. Capped at 24h (step) and 7d (task), matching the existing per-task / per-step caps. Inherited uniformly by retries, hooks, type: task sub-jobs, and for_each instances. To opt one task out of a global default, set its timeout to the maximum. Omit the keys to keep the previous unbounded behaviour. (f97e232)

New API

  • GET /api/workspaces/{ws}/tasks/{name}/stats?limit=N — Aggregated duration statistics for a task. Returns { window, task: {sample_size, avg_ms, p50_ms, p95_ms, min_ms, max_ms, recent}, steps: [...] }. ACL: View permission sufficient (read-only). limit clamped to [1, 500], defaults to 50. Failed/cancelled/skipped runs are excluded; for_each instance rows are excluded from the per-step breakdown. (f97e232)

Internal

  • New DB migration 036_job_duration_index.sql adds a partial composite index (workspace, task_name, completed_at DESC) WHERE status='completed' to keep the three stats queries fast on tasks with thousands of historical jobs.
  • MAX_STEP_TIMEOUT_SECS and MAX_JOB_TIMEOUT_SECS constants extracted to stroem-common::validation and shared with the new ServerConfig validation so the two cap sites can't drift.
  • 35+ new tests across DB integration, server handler, config unit, and frontend Vitest suites.

Full Changelog: v0.15.8...v0.15.9