Appearance
SystemsLab 153.0.0
Added
- A
systemslab view <export>command opens a context export (the.zip/.tar/directory produced bysystemslab export context) and serves the familiar SystemsLab dashboards for it locally — no server, database, or network required. It serves the same web UI and GraphQL schema the full server does, resolved read-only from the export, and runs entirely offline. Pass--opento launch a browser,--listento choose an address (default127.0.0.1:0), and--workdirto control where the export is unpacked. - A
durable.reserved_database_connectionsconfig option (default 8) reserves connections in the durable worker's pool for its own bookkeeping. The worker now bounds concurrent task execution so a burst of ready tasks cannot consume every connection and starve the heartbeat, leader election, cleanup, and task-claiming queries that keep the worker alive. - New MCP tools let an agent build a context incrementally:
create_contextopens a new context,attach_experimentsappends experiments (with tags/params) and can be called repeatedly, andseal_contextfreezes it for execution. - A
get_experiment_specMCP tool returns the experiment specification captured on submit, for a single experiment or for every experiment in a context, so an agent can recover how a run was configured. - An
artifact_schemaMCP tool returns the column/series schema (name, type, nullability, metadata) of a parquet artifact so an agent can discover what it can query before reading it. - Summary tables now support multi-column sorting: plain click sorts by one column, shift-click adds secondary/tertiary sorts that keep rows grouped across axes, and the header shows a priority number when more than one sort is active.
- Home-page context rows now show per-state experiment counts as colored badges (running / pending / success / failure / error / timeout / cancelled) instead of a single total, and these counts update live as experiments progress.
- Experiment and context pages now have a per-entity bell toggle to opt in to a browser notification when that experiment or context reaches a terminal state while the page is open.
- PromQL metric series are now labeled with
experiment_id,job_id, andjob(the job name, e.g.server/client) in addition toartifact_id, so queries can slice per job (cpu_usage{job="server"}) and span experiments. This applies retroactively to existing artifacts with no re-ingest. - A
job_diragent config option (and--job-dirflag) relocates per-job scratch space (working directory, recorded metrics, event log) off the system temp directory, which is typically a tmpfs ramdisk, onto real disk. The packaged agent now defaultsjob_dirto/var/cache/systemslab-agent; unset, it falls back to the system temp directory as before.
Changed
- An agent with no
cluster_idof its own now adopts the cluster id reported by the server at registration, so its telemetry (and theSYSTEMSLAB_CLUSTER_IDpassed to runner processes) is tagged with the same cluster as the server it connects to.
Fixed
- Cancelling a running experiment now reliably kills workloads that escaped their process group (via
setsid/double-fork/nohup) or ran in shell-action sub-cgroups. Since the previous release the runner only SIGKILLed tracked process groups, so such processes survived for up to several minutes until the agent tore down the cgroup tree; the runner again SIGKILLs the whole job cgroup when one is configured. - Experiments could get stuck in
pendingforever after the scheduler's Postgres LISTEN/NOTIFY connection briefly dropped and silently lost ahost_updatednotification. The scheduler now resynchronizes its host view on listener reconnect, and tolerates work-queue rows deleted concurrently (cancel/timeout/completion/pause) instead of tearing down and restarting. - The durable service no longer stays silently dead after its worker exits on its own (e.g. after a transient DB pool timeout), which had left scheduled runs undispatched and hosts stuck in
assigned; the worker's exit is now observed so the supervisor restarts it. - A run that completes after its host was marked
lost(e.g. during host teardown) now records its real terminal outcome instead of staying mislabeledlost: the runner's authoritativelost -> terminalPATCH is accepted as an idempotent upgrade rather than rejected with a 400. DELETE /api/v1/experiment/{id}no longer returns 500 for experiments whose metrics had been imported; the referencing metrics-metadata rows are now cleaned up automatically on delete.GET /api/internal/host/{id}/statusnow returns 502 Bad Gateway when the target agent is unreachable and 504 Gateway Timeout when it times out, instead of 500.GET /artifact/{id}/parquet-metadataand/artifact/{id}/schemanow return 4xx instead of 500 when the backing parquet object is missing (410) or its recorded size is NULL or too small to be a valid parquet file.- Context KPIs no longer disappear once the KPI cache is populated: non-finite (NaN) KPI values now round-trip correctly through the JSONB cache instead of failing every cached read.
- Running an MCP tool against an auth-proxied server with no cached credentials now returns a clear message pointing to
systemslab logininstead of an opaque JSON-parse error from the proxy's HTML login page.