Meridian Runtime · Release Log

Every shipped
line, since v1.0

Meridian is an edge scheduling runtime. This is the complete public record of what changed, what broke, and what we removed — written by the people who wrote the patch.

184Releases
6,412Lines added
2,097Lines removed
31Contributors
2026
v4.0.0 a91f4c2

Deterministic scheduler

The queue is now content-addressed. Two identical workloads submitted to two different regions produce byte-identical execution plans — which means replays are finally trustworthy.

Breaking Feature Perf
core/scheduler/plan.ts +18−9
@ -142,9 +142,18 @@ class PlanBuilder  build(jobs: Job[]): Plan {    const order = jobs.sort(byPriority)    return new Plan(order, Date.now())    const order = jobs.sort(byContentHash)    const digest = blake3(order.map(j => j.hash))    return new Plan(order, { digest, epoch: this.epoch })  }  replay(digest: string): Plan {    return this.store.mustGet(digest)  }
BreakingPlan constructors no longer accept a timestamp. Pass a PlanMeta object instead. Run meridian migrate --to 4 to rewrite call sites automatically.
  • New --deterministic flag on meridian run, on by default.
  • Plan digests are exposed on the X-Meridian-Plan response header.
  • Median scheduling latency down from 41ms to 9ms on 10k-job batches.
  • Removed the legacy priority heap; it had drifted from the spec since 2.3.
RK TM ЛП JD
Rowan Kessel, Tomás Mireles, Lena Prieto, Jae Do
v3.9.2 0c7e88d

Token scope hardening

A worker token issued for one namespace could enumerate job names in sibling namespaces. No payloads were exposed. Patched, backported, and disclosed the same day.

Security Fix
auth/scope.ts +6−3
@ -58,3 +58,6 @@ export function canList  if (token.kind === 'worker') return true  return token.ns === target.ns  if (token.ns !== target.ns) return false  if (token.kind === 'worker') {    return token.scopes.includes('jobs:list')  }  return true
  • Tracked as CVE-2026-31884, severity moderate (CVSS 5.3).
  • Backported to 3.8.x and 3.7.x. Older lines are end-of-life.
  • Rotate worker tokens issued before 18 May with meridian auth rotate.
TM SB
Tomás Mireles, Sofia Brandt · reported by @halfquiet
v3.9.0 5db1a30

Streaming job output

Logs now arrive while the job is still running instead of at exit. The dashboard tails them, the CLI tails them, and so can you over plain SSE.

Feature Deprecated
api/logs.ts +11−2
@ -20,2 +20,11 @@ router.get('/jobs/:id/logs')  const body = await store.readAll(id)  return json(body)  const stream = store.tail(id, { from: req.query.cursor })  return sse(stream, {    heartbeat: 15_000,    retry: 2_000,    onClose: () => stream.release(),  })
  • GET /jobs/:id/logs returns text/event-stream unless you send Accept: application/json.
  • meridian logs -f replaces the old meridian watch command.
  • Deprecated: logs.pollInterval config key. It is ignored and will be removed in 5.0.
JD RK NA
Jae Do, Rowan Kessel, Nadia Alvi
2025
v3.8.4 e4402ff

Retry storms, quieted

Failed jobs were retrying in lockstep across the fleet, producing five-minute thundering herds. Backoff is now jittered per worker.

Fix Perf
core/retry.ts +4−1
@ -31,1 +31,4 @@ function nextDelay  return base * 2 ** attempt  const ceil = Math.min(base * 2 ** attempt, MAX_DELAY)  // full jitter — Marc Brooker, AWS Arch Blog  return Math.random() * ceil
  • Peak retry concurrency down 87% in the eu-west canary.
  • MAX_DELAY is configurable via retry.ceilingMs, default 300000.
ЛП RK
Lena Prieto, Rowan Kessel
v3.8.0 bb70e15

Regional pinning

Jobs can now declare where they are allowed to run. Useful for data residency, painful for anyone who liked pretending the network was flat.

Feature Fix
schema/job.yaml +7−0
@ -12,0 +12,7 @@ job:job:  name: nightly-rollup  placement:    regions: [eu-west-1, eu-central-1]    strategy: strict   # or: prefer    fallback: fail     # or: nearest  residency:    class: gdpr-restricted
  • Six new regions: sa-east-1, af-south-1, ap-south-2 and three edge PoPs.
  • Fixed a scheduler crash when a namespace had zero eligible workers.
  • Placement decisions are recorded on the job timeline for audit export.
NA SB JD
Nadia Alvi, Sofia Brandt, Jae Do
v3.0.0 17c0d9b

The rewrite nobody asked for

We replaced the Python control plane with a Rust one and kept the wire format identical, so most of you noticed only that the p99 got boring.

Breaking Feature
Cargo.toml · meridian-control +9−6
@ -1,6 +1,9 @@ [package][tool.poetry]name = "meridian-control"python = "^3.11"[package]name = "meridian-control"edition = "2024"[dependencies]tokio = { version = "1", features = ["full"] }
BreakingPython plugins are gone. The replacement is a WASM plugin ABI — see the porting guide. Roughly 90% of community plugins were ported by the 3.2 release.
  • Cold start down from 2.4s to 190ms.
  • Memory ceiling per control node down 71%.
  • Single static binary; the Docker image dropped from 412MB to 24MB.
RK ЛП TM SB +7
and 7 others over 11 months