v0.4.0 — text animations are saved, not refused
Every TextAnimation was reported as Lossy, on the reasoning that the protocol has an open set of conformers. But the three kadr ships — FadeIn, SlideIn, ScaleUp — are plain public structs with public properties.
Reporting them meant a composition built with kadr's own animation picker could not be saved at all under the default strict encoding.
The reference app hit exactly that: adding a fade to a text overlay made autosave throw, so the project silently stopped saving from that point on. It shipped that way in reels-studio v0.12.0, and this is the fix.
A conformer this version doesn't recognise is still reported rather than guessed at — the original principle intact. Duration is stored as a rational like every other time in the format, so a 1/30 s fade is still one frame after a round trip.
Not a schema bump. textAnimation is optional and appended, so a document written by 0.1–0.3 decodes with nil — now covered by a test that strips the field from real output and reads the document back.
This also answers the ROADMAP's open question, and the answer is that it needed no upstream change at all: an existential isn't automatically unencodable, only where its conformers are.
73 tests, 11 new.