Expand description
Identifiers.
A StepId and a RunId mean different things and are deliberately not
interchangeable. A step is identified by what it is — the digest of its
specification, so the same step in two runs has the same id. A run is
identified by when it happened — a ULID, which sorts chronologically.
Mixing them up would silently corrupt the ledger, so the type system stops it: neither converts to the other, and neither exposes the inner value in a way that invites a cast.