Tug: push direction depends on absolute seat (model must infer from turn parity); generate() does not check supports() #22
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
How it was found
Code review of the omniastra repo (findings supplied by the user, 2026-10-06). Not re-verified by me in this session.
Confidence it is a bug
Medium. The seat dependence is a design asymmetry the reviewer flagged; the missing
supports()check is a code reading.Explanation
In Tug, which way you push depends on your absolute seat, which the model can only infer from turn parity, so the observation is not seat-relative. Also
generate()does not checksupports(), so unsupported configurations can be generated.Suggested fix
Express direction relative to the acting player in the observation, and check
supports()ingenerate().Fixed on local branch fix/review-findings in
967e07a(not pushed yet). Tug now stores a per-player lead resource (the two always sum to zero) instead of one absolute track variable, so push direction is seat-relative in the observation. generate() asserts Family::supports instead of silently making a normal game. Tests: tug_is_seat_symmetric_and_zero_sum, generate_refuses_unsupported_variants. Generated tug games change (new hashes); acceptance rate in the generator test looks similar to before, but I did not rigorously compare it.Verified the open caveat: ran the generator's measurement over 80 seeds on the pre-change tree (clean worktree, separate target dir) and on this branch. Tug Normal accepts 57/80 in both and Inverted 63/80 in both, with identical rejection reasons, so the seat-relative rewrite does not change which games pass. Included in PR #25.