This was ready as 1.9.20, which was tagged and never published. The release check that arrived in it, refusing a build while a known defect is unresolved, ran for the first time without reusing cached test results, and immediately found two failures the cache had been hiding: an ICMP counter blind to the path Windows actually uses, and a whole test suite sharing one store on Linux because redirecting HOME does not redirect a config directory. Both are fixed below. The version moved on rather than shipping macOS from one commit and Windows from another.
The uplink report exists to be handed to a provider. That only works if every number in it can survive being read closely, and several could not.
An empty ledger is not a perfect line
No recorded outages means one of two things: the connection never dropped, or nobody was looking. The uptime arithmetic treated them the same and printed 100 % for both. A collector with its WAN check switched off reported a flawless month.
The report now carries the span it can actually speak for. A server running for a day answers a thirty-day question by saying so, rather than by claiming thirty days of evidence it does not have. Where nothing was measured at all, the PDF says "not measured". It previously printed the internal marker for that state as an availability figure of -1.00 %.
The same applies to holes in the middle. A machine switched off for three weeks used to count those weeks as watched, and the availability came out too good by exactly the time nobody was there. The record keeps one entry per stretch the collector was running, and the gaps stay out of the denominator.
One device, one row
Two addresses can belong to the same hardware: a laptop that switched from cable to Wi-Fi, a phone with a private address. Linking them is what that feature is for, and several things it should have merged were left behind.
Twelve of the twenty-three fields a device carries were dropped on every link, including both AI identifications and the Fingerbank result. Purchase dates, warranty, location and your own name for the device travel now, as do the daily availability figures, so the SLA report lists the device once, with all of its samples, instead of twice with two partial figures.
Separating a pair gives the data back. Everything written while the two were linked went to one of the addresses; cutting the link used to hand the other one back an empty record. That is a poor answer to someone who has just told the app it got something wrong.
An outage that was open at the moment of a merge could also be stranded: only the most recent one was ever closed, and the other kept growing against the current time for as long as the device existed.
The components we ship
DeviceShelf links open-source libraries, and MIT, BSD and Apache-2.0 all require them to be named wherever a binary is distributed. The desktop and server editions generate that list from what the compiler actually links: sixty modules with their full licence texts. It travels inside the application bundle. The mobile apps now show theirs too, under Settings, collected by the build itself, so nothing can be left off it.
Also in this release
The AI features send scan data as clearly labelled input rather than gluing it into the model's own instructions, and the server checks consent on every call that would send inventory outward — including endpoints that speak the OpenAI protocol without being on your network.
Asset fields reject a date that does not exist instead of storing it, and say so in the colour of an error.
A release can no longer be built while a known defect is unresolved. The check runs first, before anything is compiled, and it covers every edition the defect affects.