Tug: push direction depends on absolute seat (model must infer from turn parity); generate() does not check supports() #22

Closed
opened 2026-10-06 15:14:34 +08:00 by Breadway · 2 comments
Owner

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 check supports(), so unsupported configurations can be generated.

Suggested fix

Express direction relative to the acting player in the observation, and check supports() in generate().

## 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 check `supports()`, so unsupported configurations can be generated. ## Suggested fix Express direction relative to the acting player in the observation, and check `supports()` in `generate()`.
Author
Owner

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.

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.
Author
Owner

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.

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.
Sign in to join this conversation.
No labels
bug
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Breadway/omniastra#22
No description provided.