Reduce a limited-description table to plain, serializable data.
Each computed label/description/result that is a live
sohl.entity.expr.SafeExpression is replaced with its serialized form (a
__kind-tagged source string); literals pass through. A toJSON must emit
this — not the raw table — because a live SafeExpression holds a back-reference
to its parent logic, and the deep undefined→null pass over a toJSON result
would recurse into that cycle. reviveLimitedDescriptionTable is the
inverse.
Reduce a limited-description table to plain, serializable data.
Each computed
label/description/resultthat is a live sohl.entity.expr.SafeExpression is replaced with its serialized form (a__kind-tagged source string); literals pass through. AtoJSONmust emit this — not the raw table — because a live SafeExpression holds a back-reference to its parent logic, and the deepundefined→nullpass over atoJSONresult would recurse into that cycle. reviveLimitedDescriptionTable is the inverse.