Repository navigation
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 declarebind.date_format.- If every metric comes back with no rows, the tree won't load. Pass
--start-date/--end-datethat cover your data. duckdbonly reads insidedata_dirnow. To read other paths,https://ors3://, setprovider.allow_external_access: true.- A dimension with a real value named
__other__or__null__can't be sliced. duckdbtimestamps with an offset now bucket by UTC date. If your server runs under a non-UTCTZ, daily totals will shift.
Security and deployment
- If you set
BREAKDOWN_API_TOKEN, callers who don't present it no longer getsql/bindfromGET /metrics/{name}, raw load errors, or metric names onGET /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 ownbind: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 whatservewould 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
/healthsaidok. - A source metric with a declared intervention didn't show up on the Root cause tab.
The full list is in CHANGELOG.md.