carlos / platform Public

plan: fleet worst-of includes stale boxes — prose corrected to match spec + fixture

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Paul Campbell ea4ddee07228360ce0d80cf07cd828c0fb3ab06b parent 85db914
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`.