Changelog
Grouped by the change that matters. Dates are when the work landed on the development branch.
September 2026
Flags carry their Health Score row
Every flag now reports which Health Score row it counts toward, as scoreCategory — or an explicit "not scored" for findings that are shown but deliberately not charged.
The field is written even when null, against the API's usual omit-nulls policy, because an unscored finding is an answer the UI displays.
Attribution is asked of the same component that counts findings in bulk, so a flag's stated row and the breakdown card cannot drift apart.
CU history: per-item breakdown, catch-up and a SQLite store
The largest change to the capacity module so far.
- SQLite replaces per-capacity JSON files. Not about size — the JSON was a few megabytes — but about the shape of the questions. Soterre asks for slices ("this item over March", "top ten last week"), and answering those from a document means loading the whole thing and filtering in memory. Merge semantics now come from primary keys: a row is identified by
(tenant, capacity, date[, item]), so re-collecting a day is an upsert. - Per-item history, kept in its own document. On a 95-item capacity it outweighs the daily trend by two orders of magnitude, so keeping them together meant rewriting everything nightly.
- Item names snapshotted at collection time. The fact table carries only GUIDs and the inventory lists only what exists today — delete a report and months of its history would render as an unidentifiable GUID.
- Catch-up. A run asks for everything since the last stored day, so a gap left by an outage is refilled. Gaps wider than the source's 30-day window are reported as unrecoverable.
- Daily-trend fix.
- 90-day retention, 30-day default view window.
Health Score methodology 1.1
Five categories, down from six. The sixth scored error-severity findings, and since nothing emits Error it handed every report 22 free points while measuring nothing. It was removed, and returns under a new version when error-level checks exist.
The per-category breakdown now comes back with the score through the API, so Soterre can explain the number it shows.
Duplicate columns became a Warning, matching the other duplicate flags.
Health Score
Replaced the placeholder that returned 0 for every real report. The old formula subtracted per finding with no floor, so roughly thirty-four warnings drove any report to zero.
Weighted categories, each with a per-category floor so a category spends its own points and stops. The maximum is exactly 100, enforced in validation — a named difference from QSDA, where the maximum was 101 and the cap was commented out. Methodology.