Call a bet a bet and a raise a raise #66

Closed
jheaps wants to merge 1 commits from fix/casino-holdem-bet-vs-raise into fix/casino-holdem-deal-around-broke
Owner

The bar decided which word to use from what the acting player still owes. That gets the big blind's option backwards — they owe nothing, so it offered "Bet", but their own blind is a live bet and putting more in is a raise. And it gets the other half wrong too: open the pad to make a first bet on the flop and the confirm button said "Raise to", then wrote "Ann's raise to $10" into the undo control for it. Stacked on #65.

Buttons Pad confirm Undo reads
BB's option, was Fold · Check · Bet Raise to —
BB's option, now Fold · Check · Raise Raise to —
Flop, first in, was Fold · Check · Bet Raise to Ann's raise to $10
Flop, first in, now Fold · Check · Bet Bet Ann's bet of $10

The arithmetic was always right — minRaiseTo returns two big blinds for the big blind's option and one for an opening bet, and I checked both before touching anything. This is only what it's called. For a tool a dealer announces the action from, that isn't a small thing: a dealer who says "bet" when the big blind puts more in gets corrected by the table.

The test is whether there's a live bet to raise, not whether this player owes anything, and it's one helper rather than a condition written out five times.

The warnings follow the same word

Under-minimum with a bet in front of you leaves you calling it; with an empty pot there's nothing to call.

$3 is under the $4 minimum. A legal raise is $4 or more — otherwise it's a call, or all-in.

$1 is under the $2 minimum. A legal bet is $2 or more — otherwise it's a check, or all-in.

Same for the all-in-for-less note, and for the amount field's screen-reader label, which announced "Raise to amount" for a bet.

Validation

8 tests (206 total), including a table playing without blinds — which opens with a bet, and is the one preflop case where the old condition happened to be right.

Driven through Playwright at seven viewports in both spots: every label correct, contrast clean, no console errors. (The 844x390 and 360x640 offenders are the known bar-over-seat cases from #63, unchanged — this PR only touches strings.)

Found and deliberately not touched

I fuzzed 40 hands of random actions with rebuys first, looking for something bigger. Chips stayed conserved to the cent throughout, no negative stacks, and the acting seat was always a seat that could act — the engine held up. It did turn up one disagreement: isStreetComplete returns false during an all-in run-out where one player still has chips and hasn't acted, while actingSeatIndex is correctly null. It has no symptom — the bar picks its layout from actingSeatIndex and shows "Deal Turn" as it should. Changing a betting-round predicate with no observable fault behind it is a worse trade than leaving it written down here.

The bar decided which word to use from **what the acting player still owes**. That gets the big blind's option backwards — they owe nothing, so it offered "Bet", but their own blind is a live bet and putting more in is a raise. And it gets the other half wrong too: open the pad to make a first bet on the flop and the confirm button said "Raise to", then wrote *"Ann's raise to $10"* into the undo control for it. Stacked on #65. | | Buttons | Pad confirm | Undo reads | | --- | --- | --- | --- | | **BB's option, was** | Fold · Check · **Bet** | Raise to | — | | **BB's option, now** | Fold · Check · **Raise** | Raise to | — | | **Flop, first in, was** | Fold · Check · Bet | **Raise to** | **Ann's raise to $10** | | **Flop, first in, now** | Fold · Check · Bet | **Bet** | **Ann's bet of $10** | The arithmetic was always right — `minRaiseTo` returns two big blinds for the big blind's option and one for an opening bet, and I checked both before touching anything. This is only what it's *called*. For a tool a dealer announces the action from, that isn't a small thing: a dealer who says "bet" when the big blind puts more in gets corrected by the table. The test is whether there's a live bet to raise, not whether this player owes anything, and it's one helper rather than a condition written out five times. ## The warnings follow the same word Under-minimum with a bet in front of you leaves you calling it; with an empty pot there's nothing to call. > $3 is under the $4 minimum. A legal **raise** is $4 or more — otherwise it's a **call**, or all-in. > > $1 is under the $2 minimum. A legal **bet** is $2 or more — otherwise it's a **check**, or all-in. Same for the all-in-for-less note, and for the amount field's screen-reader label, which announced "Raise to amount" for a bet. ## Validation **8 tests (206 total)**, including a table playing without blinds — which opens with a bet, and is the one preflop case where the old condition happened to be right. Driven through Playwright at seven viewports in both spots: every label correct, contrast clean, no console errors. (The 844x390 and 360x640 offenders are the known bar-over-seat cases from #63, unchanged — this PR only touches strings.) ## Found and deliberately not touched I fuzzed 40 hands of random actions with rebuys first, looking for something bigger. **Chips stayed conserved to the cent throughout, no negative stacks, and the acting seat was always a seat that could act** — the engine held up. It did turn up one disagreement: `isStreetComplete` returns false during an all-in run-out where one player still has chips and hasn't acted, while `actingSeatIndex` is correctly null. It has no symptom — the bar picks its layout from `actingSeatIndex` and shows "Deal Turn" as it should. Changing a betting-round predicate with no observable fault behind it is a worse trade than leaving it written down here.
jheaps added 1 commit 2026-09-01 13:23:28 -06:00
The bar decided which word to use from what the acting player still owes. That gets
the big blind's option backwards -- they owe nothing, so it offered "Bet", but their
own blind is a live bet and putting more in is a raise. And it gets the other half
wrong too: open the pad to make a first bet on the flop and the confirm button said
"Raise to", then wrote "Ann's raise to $10" into the undo control for it.

  preflop, action back to the big blind
    was:  Fold | Check | Bet        pad: "Raise to"
    now:  Fold | Check | Raise      pad: "Raise to"
  flop, nobody has bet
    was:  Fold | Check | Bet        pad: "Raise to"   undo: "Ann's raise to $10"
    now:  Fold | Check | Bet        pad: "Bet"        undo: "Ann's bet of $10"

The arithmetic was always right -- minRaiseTo returns two big blinds for the big
blind's option and one for an opening bet, and I checked both before touching
anything. This is only what it is called. For a tool a dealer announces the action
from, that is not a small thing: a dealer who says "bet" when the big blind puts more
in gets corrected by the table.

The test is whether there is a live bet to raise, not whether this player owes
anything, and it is one helper rather than a condition written out five times.

The warnings follow the same word. Under-minimum with a bet in front of you leaves
you calling it; with an empty pot there is nothing to call:

  "$3 is under the $4 minimum. A legal raise is $4 or more -- otherwise it's a
   call, or all-in."
  "$1 is under the $2 minimum. A legal bet is $2 or more -- otherwise it's a
   check, or all-in."

Also the field's screen-reader label, which announced "Raise to amount" for a bet.

8 tests (206 total), including a table playing without blinds -- which opens with a
bet, and is the one preflop case where the old condition happened to be right.

Driven through the UI at seven viewports in both spots: every label correct, contrast
clean, no console errors.

One thing found and deliberately not touched. Fuzzing 40 hands with random actions
and rebuys -- chips stayed conserved to the cent throughout, no negative stacks, and
the acting seat was always a seat that could act -- turned up one disagreement:
isStreetComplete returns false during an all-in run-out where one player still has
chips and hasn't acted, while actingSeatIndex is correctly null. It has no symptom,
because the bar picks its layout from actingSeatIndex and shows "Deal Turn" as it
should. Changing a betting-round predicate with no observable fault behind it is a
worse trade than leaving it written down.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_015bnp7xKUPFFSpwkYNFaPgb
jheaps closed this pull request 2026-09-02 09:57:19 -06:00

Pull request closed

Please reopen this pull request to perform a merge.
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: jheaps/JoshHeaps.Net#66