JSON boundary for note snapshots. Field lists preserve duplicate keys until validation; they are not parsed as dictionaries that silently discard duplicates.
Encode explicitly finalized rows; strings are escaped by Elm's JSON encoder.
Callers must obtain rows from finalize before treating them as a merge result.
Decode a list of rows, then validate before creating an opaque snapshot. Errors are fixed codes and row numbers rather than source values.