Skip to content

Reticulum Games — Ratspeak parity checklist

Living matrix for issue #773. Wire protocol is lrgp-rs (LRGP v1). Product surface reference is Ratspeak:

  • crates/ratspeak-tauri/src/commands/games.rs
  • dashboard/static/js/games_tab.js

Update this file when Games PRs land. pnpm run update warns only when a published Ratspeak GitHub Release is newer than the reviewed-ref pin on the games-parity entry in scripts/update.sh (bump that pin after review). Tags, main, and RCs without a GitHub Release are ignored.

Last review: 2026-09-25 (Ratspeak v1.0.33 — large-file/photo attachment fixes, Bluetooth Peer transfer timeouts, discovery on busy links, first-message delivery; no Games API or games_tab.js delta vs v1.0.32. Four in a Row UI remains done; wire-interop rows still todo until a live gold test). Prior: 2026-09-22 (Ratspeak v1.0.32 — Android sharing / Network Ownership / voice + LoRa routing; no Games API delta; games_tab.js only adds openGameSession(sessionId, isCurrent) stale-open cancellation).

Status: done | partial | wontfix | todo

Commands / API

Ratspeak command mesh-client Status Notes
send_game_action POST /api/v1/games/action + reticulum:gamesAction done Direct-preferred send
get_available_games GET /api/v1/games/apps done
get_all_game_sessions GET /api/v1/games/sessions done optional ?peer=
get_active_games GET /api/v1/games/sessions?peer= done peer filter
get_game_session_detail GET /api/v1/games/sessions/:id done
mark_game_read POST …/read done
delete_game_session DELETE …/:id done
resend_last_game_action POST …/resend done same envelope/nonce; overlay DB survives restart

UI

Ratspeak UI mesh-client Status Notes
Games tab Left-rail Games (Gamepad2) done Reticulum-only via hasLrgpGames
Session list filters GamesPanel filters done
Unread badge session unread + Games tab badge done tab and rail red pill via gamesUnread
TTT board TicTacToeBoard done
Chess board ChessBoard done
Challenge from contacts Peers / Chat DM Challenge done
Draw / resign session actions done
Delivery state / resend session delivery_state + Resend done LXMF outbound bridge; chips; Resend on failed
Notification route lrgp:<session> lrgp: + lxm://game/<id> → Games tab done MeshClientDeepLinkHost + openReticulumGameSession
Optimistic rollback UI client backup + restore done TTT + Chess optimistic paint; WS/action_result rollback
Chess promotion picker ChessBoard chooser done q/r/b/n filtered by legal_moves
Threefold / 50-move claims Claim buttons → draw_offer { r } done 3fr / 50m when draw_offer_reason set
Win celebration burstConfetti on local win done confettiBurst.ts canvas burst; once per session_id; reduce-motion aware
Four in a Row FourInARowBoard done 7×6 gravity board; column click sends { c }; optimistic drop + win/draw detection; winning line highlighted

Wire interop

Scenario Status
mesh-client ↔ mesh-client TTT done
mesh-client ↔ mesh-client Chess done
mesh-client ↔ Ratspeak TTT done
mesh-client ↔ Ratspeak Chess done
mesh-client ↔ mesh-client Four in a Row todo
mesh-client ↔ Ratspeak Four in a Row todo

Manual gold test: two clients on a TCP hub — challenge → accept → play → resign/draw.

Remaining follow-ups

None for the delivery / envelope / optimistic / Chess promotion+claim track. Envelope bytes live in sidecar companion games_outbound.db (not lrgp-rs LrgpStore schema).

Four in a Row ships with unit + axe coverage, but the two wire-interop rows above are still unverified on a live mesh — run the manual gold test against Ratspeak before marking them done. The board follows lrgp-rs SPEC.md appendix C: 42 cells row-major (row * 7 + column), markers A (challenger, first) / B, local outgoing payload exactly { c } with the sidecar deriving n, landing row/cell, and terminal claims.