A guest was timing out with nothing ever shown on the host. Without a
device to look at, this makes the next test say where it stops, and fixes
what was found on the way.
- The host's Sharing panel shows links received and join requests read, which
tells "nobody reached this phone" from "reached it and not understood".
- The guest says when its link is up and it is waiting for an answer.
- A request waiting shows on the host's top bar ("Sharing . 1 waiting"), and
the Sharing panel steps aside while one is up so two dialogs never stack.
- Join is a top-bar action on a sheet already under way; it was only offered
on an empty one.
- LanTransport: a host being cleaned up no longer unregisters the
advertisement or clears the address of a newer host started in its place.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01CBG7URddsUZjQ6KE1Kqf6G
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
Zeros are now stored so a typed 0 shows as 0 while a blank cell stays blank.
Tapping a score in an earlier round opens that round for correction with the
cursor in the tapped cell, instead of needing the row number first.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Holding dice works whatever order they are tapped in, and the hold survives
the throw. Verified on dev by ci.yml runs 118 and 121 and published as
v1.2.123-dev from this tree.
The selection survives a throw and clears on a turn boundary, keyed on the
round as well as the seat so a solo game resets too. Verified by ci.yml
run 121.
Holding dice did nothing unless they were tapped left to right: a tap-ordered
list was not among the ascending ones legalMoves offered, and the controller
drops what it cannot find there. Verified by ci.yml run 118.
Solitaire, Card Games and Board Games, with Trick-taking under Card Games,
and a game listed in every menu it belongs to rather than just one.
Verified by ci.yml run 105.
Three more patiences, all playable, and the Klondike table laid out the way
a real one is.
Verified by ci.yml runs 100 and 101, green across build, tests and lint.
A dice game and the first card solitaire, both playable. The ace-low
convention patience needs is now shared in game.solitaire rather than
defined per game.
Verified by ci.yml runs 90, 92, 93 and 94, all green.
Two new games and the first single-player one. GameRules needed no change
for a one-seat table; CatalogTest's floor of two players is the only
invariant that moved.
Verified by ci.yml run 86 on 480f0ba: build, unit tests and lint all green.
Brings the rtk output-filtering hooks to the default branch, so sessions
cloned from main get them, and opens the 1.2 series on main.
Verified by ci.yml runs 76, 77 and 80; run 80 published v1.2.80-dev from
this tree.
Adds a PreToolUse hook that rewrites Bash commands through rtk, a
SessionStart hook that installs the pinned binary into the empty sandbox
container, and moves the version series to 1.2.
Verified on the branch by ci.yml runs 76 and 77, both green.
Cribbage for two, three or four players; the fix that lets an
end-of-hand scoreboard be dismissed, which Golf, Wizard and Crazy 8s
have needed since they shipped; the update channel read off the running
APK rather than chosen in Settings; and a check on launch that finally
runs and only speaks when there is something to install.
The update channel is now a property of the installed APK rather than a
setting that could point a phone at the other channel's builds, and the
"check on launch" switch is wired to a check that speaks only when there
is something to install.
Adds cribbage — the crib, the cut, the play and the show, for two head to
head, three playing singly, or four in partnerships — and fixes the hold
that left every end-of-hand scoreboard impossible to dismiss.
Verified green on the feature branch before merging: build, unit tests
and Android lint (ci.yml run 51). Nothing in the catalogue is marked
coming soon any more.
Adds CLAUDE.md documenting that nothing the sandbox does — pushing,
opening a PR, merging one — triggers a workflow run, and that
workflow_dispatch is the only mechanism that does.
Verified on this branch: dispatching ci.yml on a feature branch runs
build, unit tests and lint while skipping the staging and publishing
steps, which are gated on refs/heads/dev. Run 31128906621 passed all
three and skipped both publish steps.