fix(latest,web): finish the atomic deletion and honest empty states (#145)

Review fixes on top of cb2b104:
- Delete the write-only in-memory refuseUntil map and setRefusalBackoff now
  that status.go is gone: the pass gate reads the durable stamp, so the map
  was half-deleted dead state (spec review C-1).
- An outcome-query failure no longer blanks the Lane table into the false
  'no data yet': rows render with 'none observed' chips instead (I-1).
- due-query and eligible-count skips get their own sentences instead of the
  merged 'check failed' (I-2).
- ADR-0012 constrain wording corrected and trailing newline added (M-1)
This commit is contained in:
2026-08-21 20:31:50 +07:00
parent cb2b104e63
commit fc8a40cfc6
3 changed files with 17 additions and 25 deletions
+11 -7
View File
@@ -84,13 +84,14 @@ func (h *Handler) lanesView() lanesView {
return v
}
now := time.Now()
outcomes, err := h.store.LanePassOutcomes(time.Now().Add(-ownerWindow).UnixMilli())
outcomes, err := h.store.LanePassOutcomes(now.Add(-ownerWindow).UnixMilli())
if err != nil {
// The rows are complete without the chips, so a failed outcome sum
// must not blank the table into "no data yet" — that is the confident
// wrong statement the page exists to avoid. Every row renders "none
// observed" instead, which is honest.
log.Printf("admin lanes: outcomes: %v", err)
return lanesView{
PollerOff: v.PollerOff,
BrowserConfigured: v.BrowserConfigured,
}
outcomes = nil
}
bySite := make(map[string]store.SiteOutcomes, len(outcomes))
for _, o := range outcomes {
@@ -193,8 +194,11 @@ func laneState(p store.LanePass, now time.Time) (phrase string, good, attention
case latest.SkipAsleep:
phrase = "browser asleep"
good = true
case latest.SkipDueQuery, latest.SkipEligibleCount:
phrase = "check failed"
case latest.SkipDueQuery:
phrase = "due query failed"
attention = true
case latest.SkipEligibleCount:
phrase = "eligible count failed"
attention = true
case latest.SkipNothingEligible:
phrase = "nothing eligible"