A migrated Go UserEntries read can return invalid replacement-character text in the review field for entries whose stored encrypted review value is exactly 32 hexadecimal characters. Flutter treats a non-empty review for free write, highlight, and lowlight entries as JSON and calls jsonDecode(review), so the malformed value can crash the journal page after entries download.
The user outcome is: journal entry list reads should preserve the legacy JS-visible contract where an encrypted empty review decrypts to the empty string, allowing Flutter to use Review.none() instead of parsing garbage as JSON.