Alerting gets sharper, the MCP reads stop overstating what they saw, and the secret-file ACLs can finally be applied by something other than the installer.
Store schema v79. Existing stores migrate on first start; the three rungs are additive column adds, no rewrite.
Added
- Alert on database file SIZE growth, graded per server (#2349) — between
tempdb Space, whose denominator grows with autogrowth so its percentage falls as tempdb balloons, andVolume Free Space, which fires on the consequence and cannot attribute it to a file, sits a file that has grown large but has not yet filled its disk. Two gates: a RISE gate (this file grew N MB in the window), primary because a level alone re-pages forever about a size that has been true since Tuesday; and a LEVEL gate (this file is N% of its volume), which self-scales across a heterogeneous fleet. Zero disables either independently. Ships OFF. Both SKUs. DatabaseandLastEventUtcon the incident projection (#2361) — consumers had to string-searchDetails[]for the database, which was exact only for deadlocks and returned the wrong value on a multi-incident alert spanning databases.- Occurrence totals on every fingerprinted alert (#2362) — Long-Running Query, Volume Free Space, Version Store, Long-Running Job and Failed Agent Job now carry the monotonic total that blocking and deadlocks already had.
--harden-files(#2352) — re-applies the secret-file ACLs from an elevated prompt. The service computes the correct DACL and detects when the real one is wrong, but cannot apply it: re-ACLing a file it does not own needs WRITE_DAC. Verifies each target afterwards and exits non-zero if anything is still exposed.- Declared peer stores (#2339) — a Darling MCP server can name its siblings instead of answering "unknown server" for a host a peer covers. Disclosure only: no credentials, no addresses, no cross-store connections.
Changed
- Compose
statement_timeoutis a store setting (#2357), defaulting to 15s, clamped to [5,600] on both read and use. - MCP tool results serialize compact (#2350) — the only consumer is a language model, and indentation buys it nothing. Config files people hand-edit keep indenting.
- Test suites run under Microsoft.Testing.Platform (#2347) — the .NET 10 SDK dropped VSTest-mode support for MTP-based frameworks.
Fixed
get_query_trendsilently truncated any window past 4 days (#2353) — it read only the raw tier while echoinghours_backback unchanged, and its empty path asserted "no history found in the last 168 hours" over a span it never read. It now routes to the hourly rollup by the age of the window's oldest point and reportssource,effective_hours_back,bucketandtruncated. Columns the rollup does not carry come back NULL, never zero — on an aggregate row a zero reads as "none observed".get_query_store_topreported a window it could not serve (#2364) — same class, no rollup to route to, so the fix is honesty: the response carries the window actually served, and the empty path no longer blames Query Store configuration for a span it never read.- Server Inventory's
Last Updatedwas a config-snapshot time wearing a freshness label (#2359) —server_propertiescollects once on server load, so the column showed the last service start and every actively-monitored server looked days stale. - Extended-length paths slipped past the install-location guards (#2348) —
\\?\UNC\server\shareis the long spelling of a real share; skipping a check is not the same as passing it. - The service now says WHY it cannot start when installed somewhere its own account cannot read (#2185).
- The per-database watermark read was an unbounded MAX over every chunk in retention (#2344) — measured on a live 106 GB store: 25,766 buffer reads cold against 29 ms bounded, and the cost scaled with store size rather than with anything the monitored server was doing.
Full detail in CHANGELOG.md.