01 · Scenario A: the burst
Sixteen alerts in four minutes, across four teams.
orders-api is timing out, payments reports
its database unreachable, a node exporter goes quiet, a queue backs
up. Each alert, read on its own, points at a different service and
a different owner.
Today each one gets its own investigation and, if it warrants one,
its own issue. Sixteen honest findings about the wrong thing.
02 · What exists today In development
A known-cascade table for Kubernetes alerts.
A deterministic co-firing correlator already knows that
KubeletDown explains the pod alerts on that node, and
that a scraper going dark makes its targets look down. It elects a
root and annotates the others as dependents, confined to one tenant
so an outage elsewhere is never mis-labelled as "fix the root".
It ships switched off and only annotates; it does not yet collapse
N issues into one. And it cannot see what is outside the cluster:
a switch, an uplink, a VLAN.
03 · Ask the inventory Roadmap
NetBox knows which switch port every host hangs off.
Each alert's instance or node label is
joined, in-process, to a NetBox record: address to host, host to
interface, interface to switch port and VLAN. Fourteen of the
sixteen alerts land on hosts behind the same access switch uplink.
The join is strict. A key that matches two hosts abstains rather
than guessing, and "not in NetBox" is only said when the read was
complete.
04 · A second witness Roadmap
Zabbix saw the port go down first.
For VM and bare-metal estates monitored by Zabbix, its problems
become one more alert source and its host inventory (OS, hardware,
resources) sits beside NetBox as observed context.
Here Zabbix raised an interface-down problem on the switch uplink
about ninety seconds before the first Kubernetes alert. Two independent
sources, one cause.
05 · Masked at the source Roadmap
The model learns what a host is, never which host.
Inventory is core-infrastructure detail. Addresses, MAC addresses,
serials, VLAN ids, racks and site names are used for the join and
then dropped. What reaches an LLM is a closed-schema card: role,
platform family, status, update cadence, whether an owner is
declared and an opaque team handle.
Topology is expressed as relations between opaque handles, not as
invented addresses. Any field not on the allowlist is dropped by
default, and a canary test proves no raw value survives.
06 · One finding Roadmap
One root-cause issue instead of sixteen.
The dependents are folded into a single issue that names the
shared uplink, lists every alert it explains, and states what could
not be joined. The two alerts that did not fit the pattern keep
their own investigation.
07 · Scenario B: the playbook
An Ansible run fails fetching a secret. Every hour.
The scheduled Ansible apply mints its SSH certificate from Vault
before any play runs. Since last night it fails at that step:
HTTP 503, Vault is sealed. The playbook repo is fine.
The problem is somewhere else.
08 · Follow the declared edge Roadmap
From the CI log to the repo that owns the cause.
The failure signature (vault … 503 … sealed) is
classified deterministically. The CI script itself names the Vault
address and auth mount, so the dependency is declared, not guessed.
The cluster map resolves that Vault to its HelmRelease in the
cluster repo.
In the cluster, the Vault pods are Running, 0/1 ready,
zero restarts. The one auto-unseal attempt at startup failed
against Google Cloud KMS, and nothing ever tried again.
09 · The missing check In development
Auto-unseal, and no liveness probe on seal status.
A rule in the availability pack looks for exactly this shape: a
Vault HelmRelease with KMS auto-unseal and no liveness probe.
Readiness only takes a sealed pod out of the Service; a liveness
probe on /v1/sys/health restarts it, and the restart
retries the unseal.
The rule fires on its own, outage or not. The attribution in step
8 is what lets the MR cite the playbook failures as evidence.