The probe now compares canonical JSON rather than text. The C wraps its
output in an envelope and spreads nested objects over many lines, so a
textual diff was only testing formatting; both streams are now parsed
and re-emitted sorted, with the C's array terminators dropped.
Two real differences surfaced once MENU was covered:
Dialog contexts were numbered from 1 here and from 0 in the C. Clients
key on the value, so they now start at 0.
EXIT MENU compiles to a menu action entry the C sends alongside the
commands - {"ACTION":"fgl_exit_menu","CMD_NO_TIMEOUT":n} - which was
never emitted. AddAction() sends it, so a menu built here is the same
menu on the wire.
Eight messages now identical, including the whole nested MENU.