Bynk's shared diagnostic-rendering layer.
The presentation layer over [bynk_syntax::CompileError]: ariadne human
output and the short/json-feeding line forms. Every renderer takes
&[CompileError] + source + filename — it is agnostic about where the
errors came from. Both CLI front-ends adopt it so they render identically
(ADR 0100).
Invariant (ADR 0100): this crate depends on bynk-syntax only (plus
ariadne). It must never see AttributedError/ProjectFailure (which live
in bynk-emit): the AttributedError → CompileError flattening stays above
render, in the front-end, so there is no render → emit cycle. A function
here taking a ProjectFailure would not even compile — the dependency isn't
present, by design.
Extracted from bynkc as slice 6 of the crate-decomposition track.