By this point a bridge had intent, a supervisor, a heartbeat and a spend meter’s worth of machinery behind it — all of it visible only from a terminal. This phase put it on a screen, and the design constraint was stated before any of it was drawn: the surface must not be able to lie.
That is harder than it sounds, because the obvious implementation lies immediately. A status column that reads a stored enum will happily say idle about a process that died overnight, because nothing wrote the change. So every value in the state and heartbeat columns is derived, and none of it reads the stored runtime enum at all. The screen computes from evidence: intent comes from the desired state, freshness from the last heartbeat, pid and attempts from the supervisor’s own record, and a separate stamp answers whether any supervisor is watching at all.
Those are four independent facts, and the vocabulary is computed from all four rather than picked from one. A bridge can be intended to run, have a live process, and still be unwatched — and each of those combinations gets its own honest word rather than a shared green dot.
The rendering is done with template functions over the real entity, not with a view struct assembled in a service. And one button that would have shipped as decoration was caught before it did: a Retry that would have done nothing, because the supervisor’s own loop would have overwritten the state on its next pass. Pending is a first-class state here rather than a spinner, for the same reason — the UI says “asked for, not yet observed” instead of pretending the write already took effect.