Skip to content

v0.3.0 — a CSV on-ramp, declared interventions, faster fits

Latest

Choose a tag to compare

@devonds devonds released this 13 Oct 05:27
0848f34

You can now point breakdown at a folder of CSV or Parquet exports and run an RCA, with no warehouse needed. This release also lets a tree declare interventions you already know about, and makes exact fits a lot faster.

Heads up if you're upgrading a tree

A few things that loaded on 0.2.0 will now be refused, each with a message that says what to change:

  • duckdb: if a CSV date column could be read day-first or month-first, you'll need to declare bind.date_format.
  • If every metric comes back with no rows, the tree won't load. Pass --start-date / --end-date that cover your data.
  • duckdb only reads inside data_dir now. To read other paths, https:// or s3://, set provider.allow_external_access: true.
  • A dimension with a real value named __other__ or __null__ can't be sliced.
  • duckdb timestamps with an offset now bucket by UTC date. If your server runs under a non-UTC TZ, daily totals will shift.

Security and deployment

  • If you set BREAKDOWN_API_TOKEN, callers who don't present it no longer get sql / bind from GET /metrics/{name}, raw load errors, or metric names on GET /health.
  • MCP analysis tools now run inside the per-tree engine guard, and they give the same refusal messages the HTTP routes do.

What's new

  • provider: duckdb: use a tree's own bind: blocks over a folder of CSV / Parquet exports.
  • interventions: on a node: declare a step or pulse you know happened, and the fit sizes it and shows it as its own row in an RCA.
  • Reference-window sensitivity: every RCA now re-runs under two neighbouring reference blocks and tells you whether the answer holds up.
  • Faster fits: the local level is integrated out of NUTS fits with a Kalman filter. The demo's slowest cold RCA went from 47.0 s to 19.1 s.
  • --warm latest: each metric's default analysis is fitted in the background, so the first click is already warm.
  • Per-metric windows and sparse: true.
  • breakdown check: see what serve would refuse, without serving.

Fixed

  • A parent held at a value like 4.99 wasn't recognised as constant, and could show up as a cause with a contribution near 1e13.
  • A window that missed the data loaded as zeros while /health said ok.
  • A source metric with a declared intervention didn't show up on the Root cause tab.

The full list is in CHANGELOG.md.