A hub teardown now says what caused it

The platform runs a small live component for each thing you are working with. Those components are stopped and rebuilt constantly - after an update, when something needs rebuilding from fresh source, or simply because nothing has touched it for a while and the space is better used elsewhere.

If work was queued behind one when it stopped, the platform writes a report. That report is careful: it names the message that was discarded, who sent it, and which startup step it was still waiting for. It is the report that becomes a bug ticket when it happens for a bad reason.

It ended by asking what had caused the teardown - because it genuinely did not know.

Why it did not know

Teardowns arrive two ways. Most are requested, and a request carries a reason, so the report can quote it. But a component can also simply be stopped outright, with nothing to carry a reason at all. Those reported themselves as, in effect, "nobody asked" - honest, and no use to anyone reading the ticket.

The largest single source of those is the most ordinary one there is: the platform reclaiming a component that has gone idle. It knows exactly why it is doing so, and records that reason one line earlier in its own log - a line written at a level the ticket pipeline never collects. So the answer existed, a few microseconds and one log line away from the question, and never met it.

Measured before the fix, on one recorded incident: 364 occurrences across a week and thirteen machines, every one naming the discarded work and its sender, and not one naming the cause.

What changed

Anything that stops a component directly can now say who it is and why, and the teardown report carries it. The ordinary idle-reclaim case now does exactly that.

Two things were deliberately kept. A stopper that genuinely has no reason still reports as having stated none, rather than leaving a blank that reads as nothing to report. And where a component was already asked to restart by name and the reclaim merely caught up with it afterwards, the original request keeps the attribution - the first cause is the real one, and a later arrival does not get to overwrite it.

Reconnecting…
The connection to the server was interrupted. Trying to restore it…
Trying again…
The connection could not be restored. Reloading the page…
The server was updated. Reloading the page to pick up the latest version.