Call who shows first at the showdown, instead of leaving the dealer to remember #90
Closed
jheaps
wants to merge 1 commits from
fix/casino-holdem-showdown-order into fix/casino-holdem-hand-log-filter
pull from: fix/casino-holdem-showdown-order
merge into: :fix/casino-holdem-hand-log-filter
:master
:feature/socialism
:polish/holdem-seats-one-size
:fix/holdem-dealer-chip-eats-its-seat
:polish/holdem-game-night-ready
:polish/holdem-round-next
:polish/holdem-seat-collisions
:polish/holdem-offline-and-render
:fix/naming-a-blind-deals-the-hand
:release/casino-holdem-polish
:fix/casino-holdem-phone-look
:fix/casino-holdem-sidebar-crowding
:fix/casino-holdem-contribution-rule
:fix/casino-holdem-one-stack-rule
:fix/casino-holdem-default-stack-buyin
:feat/casino-holdem-waiting-list
:feat/casino-holdem-misdeal
:feat/casino-holdem-cash-out
:feat/casino-holdem-clock
:feat/casino-holdem-rake
:fix/casino-holdem-stadium-ring
:fix/casino-holdem-phone-felt-shape
:fix/casino-holdem-audit-runs-everything
:feat/casino-holdem-straddle
:fix/casino-holdem-landscape-ring
:feat/casino-holdem-table-file
:fix/casino-holdem-touch-targets
:fix/casino-holdem-audit-modal-blindspot
:fix/casino-holdem-quicksplit-chop
:fix/casino-holdem-buildable-bet-sizes
:fix/casino-holdem-pot-sized-raise
:fix/casino-holdem-chips-to-count-out
:fix/casino-holdem-first-buy-in
:fix/casino-holdem-seating-a-table
:fix/casino-holdem-showdown-order
:fix/casino-holdem-hand-log-filter
:fix/casino-holdem-posting-in
:fix/casino-holdem-dead-button
:fix/casino-holdem-discarded-pot
:fix/casino-holdem-honest-tank-clock
:fix/casino-holdem-export-the-notes
:fix/casino-holdem-stacks-in-chips
:fix/casino-holdem-close-audit-blind-spots
:fix/casino-holdem-readable-dim-states
:fix/casino-holdem-drop-broken-watermark
:fix/casino-holdem-two-tabs
:fix/casino-holdem-unreadable-save
:fix/casino-holdem-say-when-not-saving
:fix/casino-holdem-shortcut-discovery
:fix/casino-holdem-rulings-index-compact
:fix/casino-holdem-rulings-index
:fix/casino-holdem-payout-in-chips
:fix/casino-holdem-move-seat-on-touch
:fix/casino-holdem-amount-fields-select
:fix/casino-holdem-touch-targets-by-pointer
:fix/casino-holdem-button-box-model
:fix/casino-holdem-blind-badge-placement
:fix/casino-holdem-buyin-deals-in
:fix/casino-holdem-bet-vs-raise
:fix/casino-holdem-deal-around-broke
:fix/casino-holdem-settle-up
:fix/casino-holdem-allin-and-bar
:fix/casino-holdem-one-dealer-button
:fix/casino-holdem-manual-deal
:fix/casino-holdem-less-guessing
:feature/casino-holdem-seat-editor
:fix/casino-holdem-landscape-table
:feature/casino-holdem-acting-seat
:feature/casino-holdem-raise-guard
:feature/casino-holdem-first-run
:feature/casino-holdem-contrast-audit
:feature/casino-holdem-layout-audit
:feature/casino-holdem-blind-fairness
:feature/casino-holdem-rulings-depth
:feature/casino-holdem-bank-audit
:feature/casino-holdem-fewer-taps
:feature/casino-holdem-render-perf
:feature/casino-holdem-keyboard-focus
:feature/casino-holdem-resilience
:feature/casino-holdem-messy-tables
:feature/casino-holdem-touch-mobile
:chore/casino-holdem-tech-debt
:feature/casino-holdem-dealer-batch
:feature/casino-holdem-seat-count-safety
:feature/casino-holdem-odd-chip
:feature/casino-holdem-button-moves
:feature/casino-holdem-allin-runout
:feature/casino-holdem-heads-up
:feature/casino-holdem-contrast
:feature/casino-holdem-touch-audit
:feature/casino-holdem-wizard-polish
:feature/casino-quicksplit-side-pots
:feature/casino-holdem-rebuys
:feature/casino-holdem-rulings
:feature/casino-holdem-sidebar-polish
:feature/casino-holdem-keyboard
:feature/casino-holdem-action-undo
:feature/casino-holdem-pace
:feature/casino-holdem-side-pot-breakdown
:feature/casino-holdem-gestures
:feature/casino-holdem-card-picker
:feature/casino-holdem-live-betting
:feature/casino-holdem-bet-chips
:feature/casino-holdem-seat-legibility
:feature/casino-holdem-undo-toasts
:feature/casino-holdem-quick-split
:feature/casino-holdem-mobile-table
:feature/casino-holdem-hand-history
:feature/casino-texas-holdem
:feature/casino-holdem-dealer-mode-polish
:feature/fractional-learned-weights
:fix/stockfish-dispose-hang
:fix/blog-cache-staleness
:fix/workflows
:gitea/workflows
:echo-acoustic-ranging
:chess-ui-overhaul
:feature/customChessEngine
:feature/blog
:AddProject
:feature/generalUpdate
:tech-debt/chess-cleanup
:tests/CreatePlaywrightTests
:UpdateParticleSimulatorButton
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Every showdown that isn't a fold needs somebody to turn over first, and it is the one call at the table nobody volunteers for — everyone would rather see a hand than show one. The tool held both facts the rule needs, who last raised and who sits left of the button, and said neither. The dealer worked it out from memory while five people waited, every hand.
What changed
The action bar names the seat and the reason, above the resolve button:
The reason is there so the call can be repeated to whoever argues with it, which is half of what makes it stick.
Three cases, in the order the rule asks them:
Aggression is tracked per street and per hand, because those two answers differ exactly when it matters — leading the flop and checking the river obliges nobody. A short all-in counts: not reopening the betting is a rule about who may raise and says nothing about who shows. Posting a blind doesn't — a hand limped and checked all the way down has no aggressor at all, which is the case that goes to the button.
A matching section goes in Common rulings, since the dealer will be asked.
Verification
13 new tests in
tests/holdem/showdownOrder.test.js: river bet, re-raise (last one, not first), short all-in, checked-through, an earlier street's raiser not carrying over, a folded seat being skipped, both all-in variants, one player left, a stale or out-of-range aggressor index, and that the tracking resets between hands. Suite at 350 tests, 0 failures.Two of those tests failed first time and both were my setup, not the rule: shoving $15 into a $40 bet is a short call, not a short raise, so the bettor really was still the aggressor; and $2 stacks against a $2 blind aren't all-in. Fixed the scenarios rather than the rule.
Playwright MCP, all four shapes played through the real UI: river checked round → "Ben shows first — checked round, first left of the button"; river bet → "Ben shows first — last to bet or raise"; four players all-in pre-flop, board run out street by street → "Dee shows first — last to put money in; nobody could bet the river"; everyone folds to one → no call at all, just Award pot to Ann. Checked at 390/768/1280 — two lines on a phone, no overflow, no sideways scroll, contrast and layout audit clean, no console errors.
Stacked on
fix/casino-holdem-hand-log-filter.🤖 Generated with Claude Code
https://claude.ai/code/session_015bnp7xKUPFFSpwkYNFaPgb
Every showdown that isn't a fold needs somebody to turn over first, and it is the one call at the table nobody volunteers for — everyone would rather see a hand than show one. The tool held both facts the rule needs, who last raised and who sits left of the button, and said neither. The dealer worked it out from memory while five people waited, every hand. The action bar now names the seat and the reason above the resolve button: Dee shows first — last to bet or raise. Ben shows first — checked round, first left of the button. Dee shows first — last to put money in; nobody could bet the river. The reason is there so the call can be repeated to whoever argues with it, which is half of what makes it stick. Three cases, in the order the rule asks them. Somebody bet or raised on the final round: they show. Nobody did: first live player left of the button. Nobody *could*, because the chips were already in: it falls to whoever last put money in, on whichever street that was — "no bet on the final round" isn't a choice anybody made when there was no round to bet in, so the seat left of the button hasn't earned it. Aggression is tracked per street and per hand, because those two answers differ exactly when it matters. A short all-in counts: not reopening the betting is a rule about who may raise, and says nothing about who shows. Posting a blind doesn't — a hand limped and checked all the way down has no aggressor at all, which is the case that goes to the button. A matching ruling goes in Common rulings, since the dealer will be asked. Co-Authored-By: Claude Opus 5 <[email protected]> Claude-Session: https://claude.ai/code/session_015bnp7xKUPFFSpwkYNFaPgbPull request closed