MeshCore has no reaction packet. MeshCore Open (and Offband, meshcore-web)
sends "r:<hash>:<index>", MeshCore One "@[target]<emoji>\n<hash>" in
channels and "<emoji>\n<hash>" in DMs, all as plain text, so a reaction
landed as a raw bubble ("r:6801:02").
- ReactionCodec.h (host-tested): both parsers, MeshCore Open's v1 form
(shown, not matched), the Dart String.hashCode hash over UTF-16 units,
the SHA-256 / Crockford Base32 hash, and MeshCore Open's 184-entry
emoji table in its wire order. test/test_reaction_codec.cpp runs
meshmonitor's known-answer vectors (PR #5771) for both hashes and the
table digest.
- newMsgImpl stores and shows '<emoji> reacted to "<start of target>"'
when a recent message in the thread hashes to the reaction, and
'<emoji> reacted' when none does. After the Lua hook (apps still get
the wire text), before the chime and the glance.
- Sent bubbles keep the packet's timestamp (mesh RTC + uniqueness bump)
instead of the system clock appendMessage stamped, within the same
sanity window as incoming ones. The hash is over the on-air time, so a
bubble a second off was a reaction to your own message that never
matched.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01He9DHDrX4s3uz37C3QzfdU