Everything else about the app mirrors the web, but for the two new visuals — the compact link card and the embed container — the direction reverses: the web is the source, the app must catch up. Phase 3b brings it level.
What shipped: a freezed model field for the embedded_post with its embed_mode (link renders a compact doorway card; embed renders the target's own blocks inline inside an attributed container); one level of depth (an embed inside an embed degrades to the link card); the same clamp + "Show the rest" length governor; and tap-through navigation to the full post. Legacy rows with no mode are treated as link.
The discipline that kept it honest: parity is measured, not judged. Every value was taken against the live web render on dev — the shipped card and container CSS, the render decision tree, the length-governor semantics — not eyeballed. Full Flutter suite green; on-device smoke passed; the Go-side review findings all resolved the next day.