Scorekeeper: share a sheet between devices

A host can share its score sheet and others nearby can join it, found the
same way games are, or by typed address over a hotspot.

- A joining guest is not let in on its own say-so. The host is prompted with
  the guest's name and answers Allow or Deny. A device already let in that
  drops out (locked phone) is let straight back; the host can remove anyone.
- The host's sheet is authoritative. What travels is what was done (SheetOp:
  add round, rename, move column, ...), not whole sheets, so changes made at
  the same moment all land. A guest's own changes show at once and are laid
  over the host's sheet until confirmed (SheetReplica).
- Sync asks the host for the sheet as it stands, and runs on its own when
  the app returns to the front, as it does for a game table.
- Hello carries a purpose and hosts advertise one, so a game join screen does
  not list score sheets and a game guest typing a sheet's address is told so.
- The Scorekeeper screen now expresses every edit as a SheetOp, so one grid
  serves a local sheet, a hosted one and a joined one.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01CBG7URddsUZjQ6KE1Kqf6G
This commit is contained in:
James Wallace
2026-10-10 01:27:40 +00:00
co-authored by Claude Sonnet 5.5
parent 16f9321ca3
commit 89b19a894a
14 changed files with 1807 additions and 38 deletions
+20
View File
@@ -79,6 +79,26 @@ Points are taken away by typing a minus, or with the **±** button, which flips
the last number typed. Not every keyboard offers a minus on its number pad, and
subtracting has to work on all of them.
### Sharing a sheet between devices
Tap **Share** and this phone becomes the host of its sheet; others choose
**Scorekeeper → Join a shared sheet nearby**. Discovery and joining by address
work exactly as they do for a game, hotspot included. Nobody is let in on their
own say-so: the host gets a prompt with the guest's name and has to **Allow** or
**Deny** it. A guest who was let in and drops out — a locked phone, say — is let
straight back in rather than asked again, and the host can **Remove** anybody
from the Sharing panel.
Everyone on the sheet can add rounds, correct them, rename and move columns. The
host's copy is the truth, and what travels is what was *done* ("add a round
with these points"), not whole sheets, so two people entering a round at once
get two rounds rather than one overwriting the other. A guest's own change shows
immediately and is laid over whatever the host sends until the host confirms it.
**Sync** asks the host for the sheet as it stands, and happens by itself when the
app comes back to the front. The host keeps the sheet as its own saved one;
a guest's view is not saved, and leaving puts them back on their own sheet. Only
the host can start a new game.
The sheet is saved as it is edited, so leaving the app or taking a phone call
does not lose the game. It is kept in its own DataStore rather than with the
settings, because it is a game in progress rather than a preference.