Every node and every edge below is derived, not drawn. The graph is regenerated daily from
four sources that are each maintained for some other reason — the metrics agent’s probe
inventory, the configuration inventory, live database connections, and one declared file for a
dependency no API can enumerate. Nothing is placed by hand, which is what makes it impossible for
the map to drift without something else breaking first.
Estate topology — derived, never drawn
Snapshot taken — build-time, not live
appbackupinfraitsmmediamonitoringnetworksecurity
Labels are pseudonyms by design. Node names, hostnames, dashboard links and service URLs are removed by the build's sanitiser, which then asserts its own output and fails the build on any survivor. Radius is degree — how many derived relationships a node participates in. Four independent derivation sources contributed this graph: alloy (63), ansible_inventory (19), postgresql (6), services_yml (8). The estate's internal copy of this map fails closed if any one of them dies or answers thinly, so a half-empty graph is never published in place of a complete one.
The internal copy of this map names every service and host, and links each node to its
dashboard, its documentation page and its hostname. That is the correct design for an operator
and the wrong thing to publish: it is an enumeration of the estate’s attack surface, and
information disclosure is the one genuine risk this site carries.
So the build strips names, hostnames, URLs and descriptions, replaces each label with a role word
derived from the node’s own attributes, and then asserts its own output — any surviving
estate identifier, internal domain or private address aborts the build. That assertion is proven
to fire against a deliberately poisoned graph before it is trusted, in line with the
gate testing rule every control here follows.
What survives is the part worth reading anyway: how many things there are, how they cluster by
domain, which kinds of relationship exist between them, and that four independent derivations
agree about all of it.
Radius is degree — how many derived relationships a node takes part in. The large nodes are
the ones a lot of other things depend on.
Colour is domain. Eight domains, held at one lightness so no category reads as more
important than another.
Thick-stroked nodes are hosts, the rest are services.
Filtering by edge kind hides nodes that take no part in that kind of relationship, rather than
leaving them floating unattached — an isolated node under a filter would read as this thing
has no dependencies, which is the opposite of true.
This is a build-time snapshot, stamped with the moment it was taken, and it is never presented
as live. The site is a static bundle with no origin and no estate API — a deliberate posture
decision, because a live panel would require publishing an interface into the estate, which is a
larger change than any visualisation is worth.
The internal map has one further property this one inherits: it refuses to publish a
confidently-wrong version of itself. If a derivation source dies the render aborts; if a source
answers thinly, a calibrated per-source gate rejects the staged graph and the previous map stays
live. A stale map announces its age. A half-empty one announces nothing at all — that story is the
map that could not be trusted.