v1.6.0-rc.7
Full Changelog: v1.6.0-rc.6...v1.6.0-rc.7
[1.6.0-rc.7] — 2026-07-26
Changed
- Regenerated
ui/src/boot/icon-bundle.jsonagainst the locked iconify versions (#608), fixing drift since the tabler 1.2.35 → 1.2.37 bump landed in #594.
Fixed
- The maturity soak clock no longer resets when a container is recreated.
getResultSignature(app/store/container.ts) decided whether a recreated container inherits its stashedupdateDetectedAt/firstSeenAt/maturityGatePendingSince, and it includedcreatedeven when a digest was present. Registries don't all derivecreatedfrom the digest, so it could differ between the pre-delete snapshot and the post-recreate rescan without the update candidate changing — discarding the stash and silently restarting the soak right after an update landed, which is exactly when clock continuity matters. Same defect class as #565, surviving in the recreate path that #568 never touched. - Notification dedup no longer fires a duplicate
once: truenotification when a manual recheck bypasses the registry poll cache.computeResultHash(app/store/notification-history.ts) hashedsuggestedTagandcreatedalongsidetag/digest/updateKind, so a recheck that returned a driftedcreated/suggestedTagfor the same candidate produced a different hash, madehasAlreadyNotifiedForResultreport "not yet notified", and re-fired notifications that were supposed to be one-shot. The hash now derives from the same candidate-identity definition PR #568 established for the maturity soak (tag+digest, withcreatedparticipating only when no digest is available), via a single shared helper (getCandidateIdentityFieldsinapp/model/container.ts) now used byhasCandidateIdentityChanged,getResultSignature, andcomputeResultHashalike — previously three independently hand-rolled comparators that disagreed with each other. Upgrading may produce one extra notification for updates already in flight, since history persisted under the old hash formula won't match the new one; this is a one-time false positive, not a regression. - A security scan finishing no longer reverts an update the watcher detected while it was running.
runBulkScan(app/api/container/bulk-security.ts) andpersistAndBroadcast(app/api/container/security.ts) both captured a container snapshot before starting the scan, then wrote that whole snapshot back with onlysecuritychanged. Vulnerability scans run for seconds to minutes, so a watcher poll during that window could legitimately detect a new update and haveresult,updateAvailable,updateDetectedAt, andmaturityGatePendingSincesilently rolled back by the scan's write-back. The next poll re-detected the same update and stamped a fresh timestamp, discarding the elapsed soak time. Both paths now re-fetch the live record at write-back time and merge onlysecurityonto it, matching what the scan scheduler already did, and skip the write entirely if the container is gone. - Containers with no available update are no longer ranked or filtered as if they had one.
getContainerUpdateAge(app/api/container/update-age.ts) fell back tofirstSeenAt/publishedAt/updateDetectedAtwithout checkingupdateAvailable, so a container gated bymaturityModecould still appear under?maturity=mature,?maturity=hot, and?sort=agewhile its ownupdateEligibilityblockers in the same response said it was blocked.