Skip to content

2026-08-03 — chat-composer-upgrade closed (Slack-class composer, honest wire)

The table chat runs on professional chat primitives — TipTap composer (plain-text-only, atomic mention chips, Enter sends / Shift+Enter breaks) + react-virtuoso feed — with the wire format unchanged (PRs #197, #209).

  • Falsification proved the wire contract is a PATH property — the composer honored "newlines as \n" and the feed was ready to render them, but a server normalizer written before multiline existed flattened every newline; multiline chat had been arriving single-line. Fixed with newline-preserving hygiene (horizontal-only collapse, runs capped).
  • The cap is enforced against the SERIALIZED text — mention atoms count 1 in-editor but expand to @NAME on the wire; over-cap sends are now refused with the draft kept, instead of silently server-truncated (possibly mid-mention).
  • Enter defers to IME composition — confirming a kana→kanji conversion no longer sends the half-composed draft.

Current state: chat-composer-upgrade decision · conversation-first-chrome decision (the column the composer lives in).