toString
Renders as JSON when it can, which is what a failing assertion or a debugger wants to show. Values JSON cannot express fall back to a structural description rather than throwing — toString failing is never helpful.
Above TO_STRING_BYTE_LIMIT it falls back to toSummaryString instead, because at that size the JSON has already stopped being what anybody wanted: a debugger cannot show it and a log line cannot hold it. The crossover is not a knob and there is nothing to configure — a caller who wants the JSON of a large value calls toJsonString, which is unchanged at every size. That is what keeps this a change of ergonomics rather than of answers.