plan: fleet worst-of includes stale boxes — prose corrected to match spec + fixture
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 file changed,
+1
−1
docs/superpowers/plans/2026-08-01-plan-fleet-status-page.md+1 −1
diff --git a/docs/superpowers/plans/2026-08-01-plan-fleet-status-page.md b/docs/superpowers/plans/2026-08-01-plan-fleet-status-page.md| index ab6fcb766..dc4f2ac92 100644 |
| --- a/docs/superpowers/plans/2026-08-01-plan-fleet-status-page.md |
| +++ b/docs/superpowers/plans/2026-08-01-plan-fleet-status-page.md |
| @@ -269,7 +269,7 @@ func TestFleetWorstOfAndStale(t *testing.T) { |
| ``` |
| - [ ] **Step 2: Run — FAIL.** |
| -- [ ] **Step 3: Implement `fleet.go`.** `BuildFleet`: `s.List(ctx, "status/boxes/")`, Get + unmarshal each (a corrupt snapshot is skipped with a logged warning, never fatal); staleness = `now.Sub(GeneratedAt) > 3*period`; instance sums add only non-null components (any null makes the summed field null); worst-of via band rank map `{plenty:0, getting-full:1, at-capacity:2}` over non-stale boxes (nil bands don't vote; all-nil → nil). Apps: group non-static, non-`svc/` routes by `App`; only groups where **every** route has StatusNamed publish (one un-opted route keeps the app dark); Healthy = all routes `Status=="ready"`; Channel/Version from the first route (log a warning if routes disagree). `AppsUnlisted` = distinct app groups minus published. Services: routes with `Kind=="service"`, Up = `Status=="ready"` (svc names are platform-reserved, not tenant hostnames). Replication = worst across fresh boxes (unhealthy beats healthy beats unknown-only→nil). `PublishFleet`: Put `status/fleet.json`, then each embedded asset (Task 4). |
| +- [ ] **Step 3: Implement `fleet.go`.** `BuildFleet`: `s.List(ctx, "status/boxes/")`, Get + unmarshal each (a corrupt snapshot is skipped with a logged warning, never fatal); staleness = `now.Sub(GeneratedAt) > 3*period`; instance sums add only non-null components (any null makes the summed field null); worst-of via band rank map `{plenty:0, getting-full:1, at-capacity:2}` over ALL boxes including stale ones — a box that stopped reporting at-capacity may have stopped *because* it's dying, and its last band staying in the worst-of is the loud choice (the spec's "the worst box's band"; nil bands don't vote; all-nil → nil). Apps: group non-static, non-`svc/` routes by `App`; only groups where **every** route has StatusNamed publish (one un-opted route keeps the app dark); Healthy = all routes `Status=="ready"`; Channel/Version from the first route (log a warning if routes disagree). `AppsUnlisted` = distinct app groups minus published. Services: routes with `Kind=="service"`, Up = `Status=="ready"` (svc names are platform-reserved, not tenant hostnames). Replication = worst across fresh boxes (unhealthy beats healthy beats unknown-only→nil). `PublishFleet`: Put `status/fleet.json`, then each embedded asset (Task 4). |
| - [ ] **Step 4: Tests pass.** |
| - [ ] **Step 5: Commit** — `status: fleet merge — worst-of bands, loud staleness, opt-in apps`. |