Range syntax cheat-sheet
Use these forms in any equity-calculator range box. Kairo flags unsupported combinations as you type and links back to the relevant topic here.
Every range expression either computes or tells you exactly why not — with a fix.
No-Limit Hold’em — basics
Use two ranks for Hold’em hands, add s or o for suitedness, and separate alternatives with commas. A trailing + extends upward through the matching hand family.
AA | Pocket aces: all 6 concrete combinations. |
22+ | Every pocket pair from 22 through AA. |
22-99 | Pocket pairs 22 through 99, inclusive. |
AKs / AKo / AK | Ace-king suited; use AKo for offsuit or AK for either. |
ATs+ | Suited aces from ATs through AKs. |
AhKs | Exactly the ace of hearts and king of spades. |
Hold’em wildcard families
Hold’em has two broad wildcard families. They are complete atoms, so adding a suited or offsuit suffix produces a typed family-suffix error.
A* | Any two-card Hold’em hand containing an ace. |
** | Every two-card Hold’em starting hand. |
A*s / **o | Typed error: wildcard families do not take s or o suffixes. |
Percentile bands
A % selects hands by the current seat’s ranking. Bounds accept at most two decimal places and always require the percent sign.
20% | The top 20% under the selected ranking. |
10-20% | The slice from 10% through 20%. |
2.5% | A valid decimal percentile. |
2.555% | Typed error: round to at most two decimal places. |
Percentile ranking modes
Equity versus Balanced is a per-seat toggle beside the range, not parenthesized grammar. Balanced composition is limited where structural predicates require the Equity ranking.
20% | The syntax stays the same; the seat toggle selects its ranking. |
Equity toggle | Default hot-and-cold equity ordering. |
Balanced toggle | Equity and structural playability blended into one ordering. |
Seat ranking toggle | Use this control to choose the ranking; mode names are never part of range syntax. |
Omaha patterns
Omaha patterns name the ranks held together; suits remain unrestricted unless cards or qualifiers pin them. Short broad patterns may auto-pad to the selected PLO hole size.
AAKK | Aces and kings together, with any suits. |
AKQJ | Ace-king-queen-jack together, with any suits. |
AsKsQsJs | Exactly these four spades. |
AA | On PLO4, a short pair pattern auto-pads to AA**. |
Wildcards
An asterisk occupies one unknown rank slot. The old x wildcard is retired because lowercase x, y, z, and w now bind per-card suits.
AA** | PLO4 aces plus two wildcard ranks. |
AA*** | PLO5 aces plus three wildcard ranks. |
AA**** | PLO6 aces plus four wildcard ranks. |
AAxx | Typed error: replace legacy x wildcards with *. |
Variant hand shapes
The selected variant fixes the hole size at 2, 4, 5, or 6 cards. Too-short guidance distinguishes Hold’em notation from explicit Omaha slots; too-long guidance tells you how many slots to remove.
NLHE | Exactly 2 hole-card slots. |
PLO4 | Exactly 4 slots; AK** is not the same meaning as Hold’em AKs. |
PLO5 | Exactly 5 hole-card slots. |
PLO6 | Exactly 6 hole-card slots. |
PLO suit qualifiers
Append a colon qualifier to an Omaha atom to constrain its sorted suit-count shape. These modifiers are PLO-only and must follow a hand atom.
:ds | Strict double-suited: an exact 2+2 top shape. |
:dts | Exactly two flush threats, including 3+2 and 3+3 shapes. |
:1s | Exactly one flush threat of at least two cards. |
:ts | Triple-suited 2+2+2; available only in PLO6. |
:m | Monotone: every hole card has the same suit. |
Suit classes and shape vectors
Numeric vectors state exact sorted suit counts. PPT-style letter predicates read the sorted counts below; each row says when trailing singleton suits are allowed.
:2-2-1-1 | PLO6 exact 2+2+1+1 suit shape. |
:xxyy | Exact 2+2 shape; equivalent to :ds at PLO4. |
:xxyz | The three largest suit counts are exactly 2, 1, and 1: PLO4 is 2+1+1; PLO5 permits a fourth singleton (2+1+1+1). |
:xxxy | The two largest suit counts are exactly 3 and 1: PLO4 is 3+1; PLO5 and PLO6 permit one or two trailing singletons. |
:xxxyy | The two largest suit counts are exactly 3 and 2: PLO5 is 3+2; PLO6 permits one trailing singleton (3+2+1). |
Rundowns and gap classes
Rundown + and span sugar preserve a gap structure while moving through ranks. Gap qualifiers constrain rank-variable skeletons; on fully named ranks they are redundant.
JT98+ | JT98 and every higher four-card zero-gap rundown. |
T987-6543 | The matching rundown windows from T987 down through 6543. |
RONP:0g | Any four distinct ranks with no internal gap. |
RRO9:1g | A pair, another rank, and 9 with one internal gap. |
RRON:2g | A pair plus two distinct ranks with two internal gaps. |
Rank variables
Uppercase R, O, N, and P stand for ranks; repeated letters share a value and different letters must differ. Rank variables are Omaha-only.
RR | Any pocket pair, padded to the PLO hole size. |
RROO | Any two distinct pocket pairs. |
RRON | A pair plus two different unpaired ranks. |
AARR | Aces plus any other pocket pair. |
RR:20% | Any pair intersected with the top 20%. |
Rank structure (hole-card pairs)
These describe the shape of your hole cards' RANKS — how many pairs you hold — the way suit classes describe their suits. PLO4/PLO5/PLO6 only; they compose with a pattern, a suit class or a percentile.
**:unpaired | Every hole card a different rank |
**:singlepaired | Exactly one pair among the hole cards |
**:doublepaired | Exactly two pairs among the hole cards |
**:triplepaired | Three pairs (PLO6 only) |
**:notrips | No rank appears three or more times |
AA**:doublepaired | Aces plus one other pair |
20%:unpaired | The top 20% of hands that hold no pair |
Pasting from PPT / Odds Oracle: $np, $op and $nt map to :unpaired, :singlepaired and :notrips. $tp is asked about first, because Kairo has historically read it as top pair — pick the two-pair hand shape and it becomes :doublepaired.
Per-card suit variables
Lowercase x, y, z, and w after a rank bind card suits. Reusing a letter requires the same suit; a different letter requires a different suit.
AxKx | Ace and king share suit x; PLO adds the remaining slots. |
AxAyKxKy | Aces and kings split across the same x/y suit pairing. |
AxKx** | Suited ace-king plus two unrestricted PLO4 slots. |
Board-conditioned categories
Categories filter a concrete range against the current board and work for both NLHE and PLO. They require a flop, turn, or river board before Kairo can plan them.
:tp / :2ndpair / :bottompair | Top, second, or bottom pair relative to the board. |
:set / :setb / :setm / :sett | Any set, or bottom, middle, and top set refinements. |
:2p / :trips / :straight / :flush | Two pair, trips, straight, or flush made classes. |
:boat / :quads / :sf | Full house, quads, or straight flush. |
:fd / :nfd / :gs / :oesd | Flush, nut-flush, gutshot, or open-ended draws. |
:wrap / :combodraw | Nine-plus straight outs, or a combined straight-and-flush draw; supported in NLHE too. |
:flush+ | The made class or any better class on the ladder. |
Bracket rank sets
A bracket supplies several choices for one Omaha rank slot and expands into a small group. Brackets are PLO-only; NLHE returns a typed unsupported-syntax error.
[AKQ]JT | One slot is A, K, or Q, followed by J and T. |
[A-T]QJ | One slot is any rank from ace through ten. |
[8+]765 | One slot is 8 or higher. |
[2c-6c]KQ | One club slot from 2c through 6c. |
Broad ranges and the combo cap
Exact concrete lists are capped at 50,000 combos. Supported over-cap forms stay compact and stream or sample inside the engine; an unexpected over-cap expansion is reported instead of silently truncating.
20% | A compact ranking-backed broad range. |
AA**** | A compact PLO6 structural predicate rather than a giant browser list. |
50,000 combos | Maximum exact ComboList size. |
Empty and residual range shapes
Valid but empty means the grammar was accepted but intersections, exclusions, or blockers left no playable hands. Kairo prefers a specific reason; materialization-empty is the residual prompt to broaden or remove a filter.
AAAA:KKKK | Four aces and four kings need eight hole cards, so this impossible intersection refuses loudly in every PLO variant. |
AA!AA | A valid exclusion can remove the whole starting population. |
Valid range, zero hands | Residual valid-zero case: broaden the range or remove a filter or blocker. |
Exclusions and weights
Use ! to subtract hands or cards from the term on its left, and @N for a 1–100 term weight. A weight changes composition only inside a weighted union.
22+!QQ | All pairs except queens. |
35%!Ad | Top 35% with every hand containing the ace of diamonds removed. |
AA@75, KK@25 | Canonical use: a weighted union, with aces at 75 and kings at 25. |
AA@50 | Anti-example: on one range the weight is inert, and the planner tells you. |
Unions
Commas combine alternatives. Every member must share a routing shape that Kairo can represent without silently mixing incompatible plans.
AA, KK, QQ | Pocket aces, kings, or queens. |
20%:AA****, 20%:KK**** | Top-20% PLO6 aces or top-20% PLO6 kings. |
AA**:fd:oesd | Two board-relative draw categories on the same atom. |
Intersections
A colon between two atoms means both sides must hold. Qualifier and category keywords still win when they appear after the colon.
20%:AA | Pocket aces that also fall inside the top 20%. |
AA****:KK**** | PLO6 hands containing both an ace pair and a king pair. |
AKs:flush+ | Suited ace-king that makes a flush or better on the board. |
Groups
Parentheses bind a union before a following qualifier, exclusion, or weight. Grouped members must remain compatible after the modifier distributes.
(AA**, KK**):ds | Double-suited aces or kings in one grouped expression. |
(AA, KK)!QQ | A grouped union with queens removed afterward. |
((AA**, KK**), QQ**) | Nested grouping is allowed when every group is balanced. |
Saved ranges and built-in aliases
Reference a saved range as $name; its variant and percentile mode travel with it, and compatible qualifiers distribute through it. Built-in aliases below are rendered from the parser registry.
$premium | The saved range named premium. |
$premium:ds | The saved range restricted to double-suited hands. |
| Alias | Kairo reading | Fresh input |
|---|---|---|
$ds | :ds | Active |
$ss | :ss | Active |
$r | :r | Active |
$M | :m | Asks on fresh input (PPT collision) |
$0G | :0g | Active |
$1G | :1g | Active |
$2G | :2g | Active |
$BP | :bottompair | Asks on fresh input (PPT collision) |
$MP | :2ndpair | Asks on fresh input (PPT collision) |
$TP | :tp | Asks on fresh input (PPT collision) |
$SETB | :setb | Active |
$SETM | :setm | Active |
$SETT | :sett | Active |
$FD | :fd | Active |
$NFD | :nfd | Active |
$GS | :gs | Active |
$WR | :wrap | Active |
$SD | :gs:oesd:wrap | Active |
$NP | :unpaired | Active |
$OP | :singlepaired | Active |
$NT | :notrips | Active |
What computes where
This matrix shows REVIEWED catalog coverage, not every range the live compiler can compute. Each cell is checked against the same compiler used by the calculator. A feature may compute for some forms and return a named, typed error for others.
| Feature | NLHE | PLO4 | PLO5 | PLO6 |
|---|---|---|---|---|
| Basics | ✓ Computes | ✓ Computes | ✓ Computes | ✓ Computes |
| Wildcard families | nlhe_family_too_many_slots✓ Computes | ✓ Computes | Not catalogued | ✓ Computes |
| Over-cap ranges | Not catalogued | Not catalogued | Not catalogued | ✓ Computes |
| Qualifiers | Not catalogued | ✓ Computesqualifier_requires_atom | Not catalogued | Not catalogued |
| Brackets | nlhe_brackets_unsupported | ✓ Computes | Not catalogued | Not catalogued |
| Rundowns | Not catalogued | ✓ Computes | Not catalogued | ✓ Computes |
| Percentiles | ⏳ Needs NLHE ranking tablepercentile_too_many_decimals | ✓ Computes | ✓ Computes | ✓ Computes |
| Intersections | ⏳ Needs NLHE ranking table | ✓ Computes | Not catalogued | ✓ Computesintersection_provably_empty |
| Rank variables | rank_vars_unsupported_for_nlherank_var_case_mismatch | ✓ Computesrank_var_case_mismatch | ✓ Computes | ✓ Computes |
| Suit variables | suit_vars_unsupported_for_nlhe | ✓ Computesrank_var_case_mismatch | Not catalogued | Not catalogued |
| Board categories | ✓ Computes | ✓ Computes | Not catalogued | Not catalogued |
| Hole size | hole_size_mismatch | hole_size_mismatch | hole_size_mismatch | hole_size_mismatchpattern_too_long |
| Saved-range macros | Not catalogued | macro_undefined | Not catalogued | Not catalogued |
| Built-in aliases | Not catalogued | alias_dialect_collision✓ Computes | Not catalogued | Not catalogued |
| Percentile modes | Not catalogued | ✓ Computesstructural_predicate_balanced_mode_unsupported | Not catalogued | Not catalogued |
| Gap classes | Not catalogued | ✓ Computes | Not catalogued | Not catalogued |
| Shape vectors | Not catalogued | Not catalogued | Not catalogued | ✓ Computes |
| Weights | ✓ Computes | Not catalogued | Not catalogued | Not catalogued |
| Excludes | ✓ Computes | Not catalogued | Not catalogued | Not catalogued |
| Unions | ✓ Computes | Not catalogued | Not catalogued | Not catalogued |
| Empty range shapes | materialization_empty | Not catalogued | Not catalogued | Not catalogued |
| Groups | Not catalogued | ✓ Computes | Not catalogued | Not catalogued |
| Rank structure | rank_structure_unsupported_for_nlhe | ✓ Computesqualifier_requires_atomrank_structure_conflicts_with_patternrank_structure_impossible_for_variantduplicate_qualifierrank_structure_unsupported_composition | ✓ Computes | ✓ Computes |