carlos / platform Public

spec: fleet architecture — say what ships

The spec is the binding document and lives in this branch; shipping code
that silently contradicts it is how a spec stops being trusted.

- §7: the third missing-inventory state is "unreadable", not "stale".
  The implementation is the improvement — an age is already on the page,
  so staleness is a number the operator reads, not a fourth state, and a
  snapshot that will not parse is the failure worth naming.
- §6.4: describes the layer order that actually ships, which satellites
  are drawn (bucket, alarm) and which are table-only (identity, and
  likewise firewall/network/disk/certificate), and what "anchored to its
  owner" means in a layered layout.
- §6.4: anchor-linking nodes to their detail cards is NOT delivered.
  Recorded as a follow-up rather than left as a false promise, and noted
  in §10 as deferred.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Paul Campbell pushed by paul@keymail.dev 7375388a63fb69109f8c12d57b672ad5fcb745f2 parent 9a375e7
1 file changed, +30 −8
  • docs/superpowers/specs/2026-08-19-fleet-architecture-diagram-design.md +30 −8

CI passed — run details

diff --git a/docs/superpowers/specs/2026-08-19-fleet-architecture-diagram-design.md b/docs/superpowers/specs/2026-08-19-fleet-architecture-diagram-design.md
index eabe177ae..0598d14c5 100644
--- a/docs/superpowers/specs/2026-08-19-fleet-architecture-diagram-design.md
+++ b/docs/superpowers/specs/2026-08-19-fleet-architecture-diagram-design.md
@@ -258,9 +258,19 @@ This is the rule that makes the page worth building:
A deterministic layered pass in Go, no JavaScript library, no CDN
(the vendored-icons rule):
-1. **Layer by kind** — `zone`/`record` at layer 0, `router` at 1, `box`
- at 2, `app`/`instances` at 3, with `bucket`, `alarm` and `identity`
- as satellites anchored to their owner.
+1. **Layer by kind** — left to right: `zone`, `record`, `ip`,
+ `router`/`external`/`alarm`, `box`/`machine`, `apps`, `bucket`. Of the
+ satellites, `bucket` and `alarm` are DRAWN and `identity` is not:
+ `alarm` sits in the column immediately left of the box or machine it
+ watches — few enough per fleet (one auto-recover alarm per box) that an
+ armed alarm beside its box is worth the ink, and left of it so the
+ `watches` edge reads in the same direction as every other edge.
+ `identity`, and likewise `firewall`, `network`, `disk` and
+ `certificate`, are listed in the resource tables below the diagram
+ instead: a graph that draws every IAM role is a hairball. "Anchored to
+ its owner" in a layered layout means ordered by the row of the thing it
+ watches, which is what the barycentre sweep in (2) does — not pinned to
+ the same Y.
2. **Order within a layer** to reduce crossings: one barycentre sweep
down and one up, then a stable sort by name so the same fleet always
produces the same picture. A diagram that reshuffles between refreshes
@@ -269,9 +279,13 @@ A deterministic layered pass in Go, no JavaScript library, no CDN
`viewBox` so it scales without script.
Legibility as the fleet grows: instances are drawn as one `instances`
-node per box carrying a count, never one node per instance. Nodes link
-by anchor to detail cards below the SVG, so the page needs no JS to be
-useful and no click handler to be complete.
+node per box carrying a count, never one node per instance.
+
+**Not delivered (follow-up, 2026-08-19):** nodes were to link by anchor to
+their detail cards below the SVG. They do not; the page needs no JS
+regardless, because everything on it is server-rendered, but clicking a
+node does nothing and the reader scrolls to find the card. Recorded here
+rather than left as a promise the page does not keep — see §10.
## 7. The page
@@ -299,8 +313,13 @@ Body, in order:
**Every section soft-fails independently.** A missing inventory renders
the CARLOS half of the page with an "inventory not available" panel,
naming which of the three states applies: never taken, not granted
-(latched), or stale. A failed registry read costs the overlay, not the
-page. Nothing renders a confident "none" for a read that did not happen.
+(latched), or unreadable — the snapshot object exists but could not be
+fetched or parsed. ("Unreadable" rather than "stale", which an earlier
+draft of this section said: the snapshot's age is already on the page
+beside the account id, so staleness is a number the operator reads, not a
+fourth state, and a snapshot that will not parse is the failure actually
+worth naming.) A failed registry read costs the overlay, not the page.
+Nothing renders a confident "none" for a read that did not happen.
## 8. The IAM grant (precondition)
@@ -362,3 +381,6 @@ as ungranted, which is the designed state and not a fault.
that a CLI door is a small follow-up, but it is not this spec.
- Cost Explorer actuals on this page. `/fleet/economics` owns money;
this page owns shape, and shows the modelled per-box figure only.
+- **Deferred, not dropped:** anchor-linking each diagram node to its detail
+ card below the SVG (§6.4). The page ships without it; every fact the
+ anchors would have jumped to is on the page already.