v0.314.0: a restore puts the setup gate back as it was (R-1057); a test build moves with the floor (R-1053); Prowlarr links itself (R-1058); the box claims Plex by address (R-1060)
gates / gates (push) Successful in 47s

MinAgent 0.155.0 (unchanged). Tests red-proved by mutation (A: 10, B: 7, C: 1, C2: 2).

Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
2026-10-15 14:34:33 +02:00
parent e209a8d724
commit 17863fe8bc
22 changed files with 762 additions and 21 deletions
+12 -2
View File
@@ -70,6 +70,8 @@ type Updater struct {
// persisted UpdateState guards across restarts). Auto-target is ALWAYS the floor, never latest.
floor string
lastAutoFloorAttempt string
// lastUnparseableWarn (v0.314.0, R-1053): the (version|floor) last warned about, so the WARN is once per change.
lastUnparseableWarn string
// Seams (default to the real implementations; overridden in tests to avoid network/docker).
queryFn func() (string, error) // resolve latest registry tag (default u.queryRegistry)
@@ -624,10 +626,18 @@ func (u *Updater) MaybeAutoUpdate() {
u.dbg("maybeAutoUpdate: an update is already running — skip")
return
}
curVer, err := ParseVersion(u.currentVer)
// R-1053 (v0.314.0): a test build (0.313.0-rc.4) is BELOW its release, so the floor moves it. A version that still
// cannot be read is said at WARN once per (version, floor) — it used to be a DEBUG line nobody saw while Tester 1
// sat on rc.4 below the floor.
curVer, err := util.ParseVersionPre(u.currentVer)
if err != nil {
key := u.currentVer + "|" + floor
warn := u.lastUnparseableWarn != key
u.lastUnparseableWarn = key
u.mu.Unlock()
u.dbg("maybeAutoUpdate: current %q not parseable (dev?) — skip", u.currentVer)
if warn {
u.logger.Printf("[WARN] [selfupdate] auto-update: this box runs %q, which is not a version the floor can compare — the floor %s will NOT move it", u.currentVer, floor)
}
return
}
floorVer, err := ParseVersion(floor)