# The Playful Sieve
## Motivation
In a full score 2p Hanabi game, we play 25 cards and discard at most 17 cards. Despite this fact that plays are more common than discards, the default action of (nearly?) every 2p convention system is to discard a card rather than play one.
The Playful Sieve challenges this standard. We will play our chop as often as possible.
We draw heavily from [Referential Sieve](https://hackmd.io/Ui6LXAK3TdC7AKSDcN20PQ) and recommend readers familiarize themselves with at least the basic system.
In hypos, PS tends to keep a more stable clue count than RS, since discard clues refund themselves and plays are often free. As such, low clue states tend to be a little less scary.
On the other hand, unknown plays sometimes want to occur through each other, but that cannot safely happen. With 10%-30% fewer playable draws when one player has a known playable of unknown identity, this system will occasionally:
- waste a clue to save a playable
- bomb a card that has just been played.
## Conventions
### Fundamentals
- Good Touch Principle is on.
- Safe Action Principle is on.
### The Player States
There are a number of states a player can be in:
- *Chop*
- *Stall*
- *Call to Discard*
- *Call to Play*
A player has a chop if and only if no card is called to play, no card is called to discard, and they are not stalling.
### Chop
When you have no known playables and no known discards, your *chop* is the leftmost unclued card in your hand.
### Call to Play
When Bob plays or discards a card not globally known to play into Alice's hand while Alice has a chop, her chop is *called to play* (ctp), and she no longer has a chop.
### Playable Chop Princple
When Alice gives any clue in a non-stalling (non-loaded) situation she indicates that Bob's chop is not immediately unplayable.
### Fill-in Plays and Discards
When Bob gives a clue that fills in a card as immediately playable (or known trash), it is a call for Alice to play (or discard) that card, not a referential play or discard clue.
### Fill-ins
When Alice gives a fill-in clue touching no new cards, not revealing any plays or discards, it is a signal to Bob to discard chop, if it exists. One might think of this as an "anti-finesse."
(This should mean something else if loaded.)
### Referential Discard Clues
A number clue newly touching a card is a *call to discard* the first untouched card to its right, with wraparound, biased on the leftmost card when this could refer to multiple cards.
### Referential Play Clues
A color clue newly touching a touching a card is a *call to play* the first previously untouched card to its right, with wraparound, biased on the rightmost card when this could refer to multiple cards.
### Loaded Play Clues
When a player has a known safe action and recieves a rank clue, it is a call to play the leftmost newly-touched card. [likely target for adjustment]
### Lock signal
A clue that looks like a referential play clue of chop is a instead a locked hand signal. Additionally, playing (bombing) a card that was called to discard is a locked hand signal.
### Locked Hand Stalls
We use color stalls as per [Referential Sieve](https://hackmd.io/Ui6LXAK3TdC7AKSDcN20PQ?view#Locked-hand-stalls-2p) in accordance with the [Unlock Promise](https://hackmd.io/Ui6LXAK3TdC7AKSDcN20PQ?view#Unlock-Promise).
### Starting Hand Stalls
Analagous to [starting hand stalls](https://hackmd.io/Ui6LXAK3TdC7AKSDcN20PQ?view#Starting-hand-stalls) in RS, a color clue touching slot 5 on a player's first turn is a *starting hand stall*. Upon recieving a starting hand stall, a player is required to stall for one turn. If they do not recieve a clue the next turn, they will then be called to play (discard?) their leftmost untouched card.
### Other Stalls
General stalling situations are pretty rare. For now, interpret clues as normal, except: loaded rank clues do not promise any additional safe action.
### Sarcastic/Gentleman's Discard
Discarding a known playable promises it: first, the *call to play* if one exists; second, in touched cards from the right if possible; third, on chop; finally, in untouched cards from right.
Discarding a someday playable promises it somewhere touched in your teammate's hand (except, contextually, to unlock yourself).
### Trash Push
A number clue only newly-touching known trash is to be treated as if it were a referential color clue newly touching the same cards, providing (at least) two safe actions: a play and a discard. Note that any 1s clue touching chop indicates that the chop 1 is trash.
## Sample Hypotheticals by Seed
Somewhat reasonable ways no variant games could go. To view, open a seed and copy the text, and paste it as JSON data into the hanab.live "Watch Replay" feature. I would love to actually play games, and then list link replays instead of JSON hypos.
[No Variant](https://hanab.live/replay/820356)
<details>
<summary>
1
</summary>
{"players":["Alice","Bob"],"deck":[{"suitIndex":3,"rank":5},{"suitIndex":4,"rank":4},{"suitIndex":3,"rank":3},{"suitIndex":0,"rank":4},{"suitIndex":2,"rank":1},{"suitIndex":3,"rank":3},{"suitIndex":3,"rank":1},{"suitIndex":0,"rank":1},{"suitIndex":2,"rank":2},{"suitIndex":2,"rank":4},{"suitIndex":0,"rank":2},{"suitIndex":3,"rank":2},{"suitIndex":2,"rank":2},{"suitIndex":4,"rank":1},{"suitIndex":0,"rank":2},{"suitIndex":0,"rank":1},{"suitIndex":3,"rank":1},{"suitIndex":1,"rank":3},{"suitIndex":1,"rank":4},{"suitIndex":0,"rank":1},{"suitIndex":1,"rank":4},{"suitIndex":2,"rank":4},{"suitIndex":4,"rank":2},{"suitIndex":4,"rank":3},{"suitIndex":4,"rank":1},{"suitIndex":0,"rank":4},{"suitIndex":2,"rank":5},{"suitIndex":1,"rank":2},{"suitIndex":4,"rank":1},{"suitIndex":1,"rank":1},{"suitIndex":1,"rank":5},{"suitIndex":1,"rank":1},{"suitIndex":2,"rank":3},{"suitIndex":0,"rank":5},{"suitIndex":4,"rank":3},{"suitIndex":1,"rank":2},{"suitIndex":3,"rank":1},{"suitIndex":2,"rank":3},{"suitIndex":1,"rank":3},{"suitIndex":3,"rank":4},{"suitIndex":1,"rank":1},{"suitIndex":0,"rank":3},{"suitIndex":3,"rank":4},{"suitIndex":0,"rank":3},{"suitIndex":2,"rank":1},{"suitIndex":3,"rank":2},{"suitIndex":2,"rank":1},{"suitIndex":4,"rank":4},{"suitIndex":4,"rank":5},{"suitIndex":4,"rank":2}],"actions":[{"type":3,"target":1,"value":1},{"type":0,"target":7},{"type":0,"target":4},{"type":3,"target":0,"value":3},{"type":1,"target":1},{"type":0,"target":6},{"type":0,"target":12},{"type":0,"target":13},{"type":3,"target":1,"value":1},{"type":0,"target":10},{"type":0,"target":14},{"type":2,"target":0,"value":1},{"type":0,"target":11},{"type":2,"target":0,"value":3},{"type":1,"target":2},{"type":3,"target":0,"value":4},{"type":1,"target":19},{"type":3,"target":0,"value":3},{"type":1,"target":20},{"type":2,"target":0,"value":0},{"type":1,"target":21},{"type":0,"target":5},{"type":0,"target":22},{"type":2,"target":0,"value":1},{"type":1,"target":24},{"type":3,"target":0,"value":5},{"type":1,"target":25},{"type":3,"target":0,"value":5},{"type":2,"target":1,"value":4},{"type":1,"target":15},{"type":3,"target":1,"value":2},{"type":1,"target":8},{"type":3,"target":1,"value":4},{"type":1,"target":28},{"type":2,"target":1,"value":1},{"type":0,"target":29},{"type":2,"target":1,"value":1},{"type":0,"target":27},{"type":0,"target":17},{"type":0,"target":23},{"type":0,"target":18},{"type":2,"target":0,"value":4},{"type":0,"target":32},{"type":3,"target":0,"value":3},{"type":1,"target":34},{"type":0,"target":9},{"type":0,"target":26},{"type":3,"target":0,"value":4},{"type":1,"target":38},{"type":0,"target":30},{"type":3,"target":1,"value":5},{"type":1,"target":31},{"type":0,"target":39},{"type":0,"target":41},{"type":3,"target":1,"value":5},{"type":1,"target":43},{"type":2,"target":1,"value":0},{"type":1,"target":44},{"type":0,"target":3},{"type":0,"target":33},{"type":0,"target":0},{"type":0,"target":47},{"type":0,"target":48}],"options":{"variant":"No Variant"},"notes":[],"characters":[],"id":0,"seed":""}
</details>
<details>
<summary>
2
</summary>
{"players":["Alice","Bob"],"deck":[{"suitIndex":1,"rank":4},{"suitIndex":4,"rank":2},{"suitIndex":0,"rank":4},{"suitIndex":0,"rank":3},{"suitIndex":3,"rank":2},{"suitIndex":3,"rank":3},{"suitIndex":4,"rank":5},{"suitIndex":0,"rank":4},{"suitIndex":1,"rank":3},{"suitIndex":4,"rank":3},{"suitIndex":0,"rank":2},{"suitIndex":1,"rank":1},{"suitIndex":1,"rank":2},{"suitIndex":2,"rank":4},{"suitIndex":0,"rank":2},{"suitIndex":3,"rank":5},{"suitIndex":3,"rank":4},{"suitIndex":3,"rank":1},{"suitIndex":0,"rank":5},{"suitIndex":4,"rank":1},{"suitIndex":1,"rank":1},{"suitIndex":3,"rank":2},{"suitIndex":2,"rank":2},{"suitIndex":2,"rank":1},{"suitIndex":4,"rank":2},{"suitIndex":2,"rank":3},{"suitIndex":1,"rank":5},{"suitIndex":1,"rank":2},{"suitIndex":2,"rank":1},{"suitIndex":3,"rank":1},{"suitIndex":2,"rank":3},{"suitIndex":2,"rank":1},{"suitIndex":0,"rank":1},{"suitIndex":3,"rank":4},{"suitIndex":4,"rank":4},{"suitIndex":0,"rank":1},{"suitIndex":1,"rank":1},{"suitIndex":4,"rank":1},{"suitIndex":1,"rank":3},{"suitIndex":2,"rank":2},{"suitIndex":3,"rank":1},{"suitIndex":0,"rank":3},{"suitIndex":0,"rank":1},{"suitIndex":3,"rank":3},{"suitIndex":4,"rank":4},{"suitIndex":2,"rank":4},{"suitIndex":1,"rank":4},{"suitIndex":4,"rank":1},{"suitIndex":4,"rank":3},{"suitIndex":2,"rank":5}],"actions":[{"type":3,"target":1,"value":3},{"type":3,"target":0,"value":3},{"type":1,"target":2},{"type":3,"target":0,"value":2},{"type":2,"target":1,"value":4},{"type":1,"target":9},{"type":1,"target":0},{"type":2,"target":0,"value":1},{"type":2,"target":1,"value":1},{"type":0,"target":11},{"type":2,"target":1,"value":3},{"type":3,"target":0,"value":2},{"type":0,"target":12},{"type":2,"target":0,"value":3},{"type":1,"target":14},{"type":3,"target":0,"value":5},{"type":1,"target":3},{"type":2,"target":0,"value":4},{"type":1,"target":16},{"type":0,"target":8},{"type":3,"target":1,"value":5},{"type":1,"target":13},{"type":0,"target":17},{"type":0,"target":19},{"type":0,"target":1},{"type":0,"target":21},{"type":1,"target":4},{"type":2,"target":0,"value":0},{"type":1,"target":24},{"type":3,"target":0,"value":2},{"type":3,"target":1,"value":1},{"type":0,"target":5},{"type":1,"target":20},{"type":0,"target":23},{"type":3,"target":1,"value":4},{"type":1,"target":28},{"type":3,"target":1,"value":5},{"type":1,"target":29},{"type":0,"target":22},{"type":2,"target":0,"value":3},{"type":1,"target":31},{"type":0,"target":30},{"type":0,"target":32},{"type":0,"target":33},{"type":2,"target":1,"value":0},{"type":1,"target":35},{"type":2,"target":1,"value":1},{"type":1,"target":36},{"type":3,"target":1,"value":5},{"type":1,"target":37},{"type":3,"target":1,"value":4},{"type":1,"target":38},{"type":0,"target":10},{"type":3,"target":0,"value":4},{"type":0,"target":15},{"type":2,"target":0,"value":4},{"type":0,"target":41},{"type":0,"target":7},{"type":3,"target":1,"value":5},{"type":0,"target":18},{"type":0,"target":42},{"type":3,"target":0,"value":4},{"type":0,"target":45},{"type":3,"target":0,"value":4},{"type":0,"target":46},{"type":0,"target":26},{"type":2,"target":1,"value":4},{"type":0,"target":48},{"type":0,"target":34},{"type":0,"target":6}],"options":{"variant":"No Variant"},"notes":[],"characters":[],"id":0,"seed":""}
</details>
<details>
<summary>
3
</summary>
{"players":["Alice","Bob"],"deck":[{"suitIndex":4,"rank":5},{"suitIndex":1,"rank":3},{"suitIndex":0,"rank":1},{"suitIndex":4,"rank":2},{"suitIndex":4,"rank":1},{"suitIndex":3,"rank":4},{"suitIndex":3,"rank":1},{"suitIndex":0,"rank":5},{"suitIndex":4,"rank":4},{"suitIndex":1,"rank":3},{"suitIndex":4,"rank":4},{"suitIndex":1,"rank":2},{"suitIndex":4,"rank":1},{"suitIndex":3,"rank":2},{"suitIndex":1,"rank":4},{"suitIndex":0,"rank":2},{"suitIndex":2,"rank":3},{"suitIndex":2,"rank":1},{"suitIndex":2,"rank":2},{"suitIndex":2,"rank":1},{"suitIndex":0,"rank":1},{"suitIndex":3,"rank":5},{"suitIndex":1,"rank":4},{"suitIndex":2,"rank":2},{"suitIndex":4,"rank":3},{"suitIndex":1,"rank":5},{"suitIndex":0,"rank":4},{"suitIndex":2,"rank":1},{"suitIndex":1,"rank":1},{"suitIndex":4,"rank":2},{"suitIndex":3,"rank":1},{"suitIndex":1,"rank":1},{"suitIndex":0,"rank":3},{"suitIndex":2,"rank":4},{"suitIndex":2,"rank":3},{"suitIndex":0,"rank":4},{"suitIndex":3,"rank":1},{"suitIndex":2,"rank":4},{"suitIndex":0,"rank":3},{"suitIndex":3,"rank":3},{"suitIndex":3,"rank":4},{"suitIndex":4,"rank":3},{"suitIndex":1,"rank":2},{"suitIndex":2,"rank":5},{"suitIndex":0,"rank":1},{"suitIndex":0,"rank":2},{"suitIndex":3,"rank":3},{"suitIndex":4,"rank":1},{"suitIndex":1,"rank":1},{"suitIndex":3,"rank":2}],"actions":[{"type":2,"target":1,"value":0},{"type":0,"target":6},{"type":3,"target":1,"value":3},{"type":2,"target":0,"value":4},{"type":0,"target":2},{"type":1,"target":8},{"type":1,"target":4},{"type":0,"target":12},{"type":3,"target":1,"value":5},{"type":1,"target":14},{"type":0,"target":13},{"type":3,"target":0,"value":2},{"type":0,"target":3},{"type":0,"target":15},{"type":2,"target":1,"value":3},{"type":1,"target":5},{"type":0,"target":17},{"type":3,"target":0,"value":3},{"type":2,"target":1,"value":2},{"type":1,"target":19},{"type":3,"target":1,"value":2},{"type":0,"target":18},{"type":2,"target":1,"value":4},{"type":1,"target":9},{"type":3,"target":1,"value":5},{"type":1,"target":23},{"type":1,"target":20},{"type":2,"target":0,"value":1},{"type":0,"target":16},{"type":3,"target":0,"value":5},{"type":1,"target":26},{"type":3,"target":0,"value":1},{"type":1,"target":27},{"type":0,"target":24},{"type":0,"target":28},{"type":0,"target":10},{"type":3,"target":1,"value":4},{"type":1,"target":31},{"type":0,"target":11},{"type":0,"target":32},{"type":2,"target":1,"value":1},{"type":1,"target":34},{"type":0,"target":0},{"type":0,"target":35},{"type":0,"target":1},{"type":0,"target":22},{"type":0,"target":25},{"type":2,"target":0,"value":3},{"type":0,"target":33},{"type":3,"target":0,"value":1},{"type":1,"target":36},{"type":0,"target":7},{"type":1,"target":30},{"type":3,"target":0,"value":4},{"type":3,"target":1,"value":3},{"type":0,"target":39},{"type":0,"target":40},{"type":0,"target":21},{"type":1,"target":46},{"type":0,"target":43}],"options":{"variant":"No Variant"},"notes":[],"characters":[],"id":0,"seed":""}
</details>
<details>
<summary>
4
</summary>
{"players":["Alice","Bob"],"deck":[{"suitIndex":4,"rank":1},{"suitIndex":2,"rank":3},{"suitIndex":0,"rank":1},{"suitIndex":1,"rank":2},{"suitIndex":0,"rank":4},{"suitIndex":3,"rank":3},{"suitIndex":1,"rank":4},{"suitIndex":3,"rank":5},{"suitIndex":0,"rank":5},{"suitIndex":2,"rank":4},{"suitIndex":2,"rank":1},{"suitIndex":2,"rank":4},{"suitIndex":4,"rank":4},{"suitIndex":0,"rank":2},{"suitIndex":1,"rank":1},{"suitIndex":2,"rank":1},{"suitIndex":4,"rank":5},{"suitIndex":4,"rank":1},{"suitIndex":3,"rank":4},{"suitIndex":0,"rank":4},{"suitIndex":2,"rank":2},{"suitIndex":4,"rank":3},{"suitIndex":3,"rank":2},{"suitIndex":4,"rank":4},{"suitIndex":1,"rank":4},{"suitIndex":4,"rank":3},{"suitIndex":2,"rank":5},{"suitIndex":3,"rank":1},{"suitIndex":4,"rank":1},{"suitIndex":2,"rank":1},{"suitIndex":1,"rank":1},{"suitIndex":3,"rank":1},{"suitIndex":2,"rank":3},{"suitIndex":0,"rank":3},{"suitIndex":1,"rank":2},{"suitIndex":4,"rank":2},{"suitIndex":0,"rank":3},{"suitIndex":4,"rank":2},{"suitIndex":1,"rank":1},{"suitIndex":3,"rank":4},{"suitIndex":3,"rank":3},{"suitIndex":1,"rank":3},{"suitIndex":3,"rank":2},{"suitIndex":0,"rank":1},{"suitIndex":0,"rank":2},{"suitIndex":1,"rank":5},{"suitIndex":0,"rank":1},{"suitIndex":1,"rank":3},{"suitIndex":3,"rank":1},{"suitIndex":2,"rank":2}],"actions":[{"type":3,"target":1,"value":5},{"type":3,"target":0,"value":1},{"type":0,"target":2},{"type":1,"target":6},{"type":3,"target":1,"value":3},{"type":1,"target":11},{"type":2,"target":1,"value":3},{"type":1,"target":12},{"type":0,"target":0},{"type":0,"target":13},{"type":0,"target":14},{"type":2,"target":0,"value":4},{"type":0,"target":10},{"type":2,"target":0,"value":0},{"type":2,"target":1,"value":2},{"type":1,"target":15},{"type":2,"target":1,"value":0},{"type":1,"target":18},{"type":2,"target":1,"value":2},{"type":1,"target":19},{"type":0,"target":3},{"type":3,"target":0,"value":3},{"type":1,"target":17},{"type":2,"target":0,"value":3},{"type":2,"target":1,"value":2},{"type":0,"target":20},{"type":3,"target":1,"value":4},{"type":2,"target":0,"value":2},{"type":0,"target":1},{"type":2,"target":0,"value":1},{"type":1,"target":21},{"type":2,"target":0,"value":4},{"type":1,"target":22},{"type":0,"target":9},{"type":0,"target":26},{"type":3,"target":0,"value":4},{"type":1,"target":28},{"type":3,"target":0,"value":3},{"type":1,"target":29},{"type":3,"target":0,"value":5},{"type":1,"target":30},{"type":0,"target":27},{"type":2,"target":1,"value":4},{"type":2,"target":0,"value":3},{"type":1,"target":31},{"type":1,"target":32},{"type":3,"target":1,"value":4},{"type":1,"target":34},{"type":0,"target":33},{"type":0,"target":35},{"type":0,"target":25},{"type":0,"target":23},{"type":0,"target":4},{"type":0,"target":8},{"type":0,"target":16},{"type":0,"target":41},{"type":3,"target":1,"value":4},{"type":1,"target":37},{"type":2,"target":1,"value":3},{"type":3,"target":0,"value":2},{"type":0,"target":42},{"type":0,"target":5},{"type":0,"target":24},{"type":3,"target":0,"value":5},{"type":0,"target":45},{"type":0,"target":39},{"type":3,"target":1,"value":5},{"type":0,"target":7}],"options":{"variant":"No Variant"},"notes":[],"characters":[],"id":0,"seed":""}
</details>
## Erratically Discussed Conventions..?
### No-Info Trash Dump
A no-info clue promises everything untouched in hand is trash, to be discarded in specific-order (left-to-right? right-to-left?).
(Seems promising but unused in the hypos)
### Scream Discard
Alice discarding a card over playing a known playable promises
- Bob's chop is not playable
- The discard is at least as good as Bob's best discard.
Sometimes these two are enough to lock Bob (when discarded card is known someday-useful and Bob only has one untouched card) but we need more for other circumstances.
### Finesse Positions
Finesses and prompts only make sense as rightmost. But do they even exist?
## Alterations and Extensions
### The Balanced Sieve
As per the intro, one downside of this sieve is that the team may unintentionally bomb by each player trying to play the same card in succession. One way around this is to use a *balanced sieve*, where Alice playing calls Bob to discard chop, and Alice discarding calls Bob to play chop. This requires some changes to the meaning of referential play/discard/lock clues based on whether Alice has a known playable and/or known discardable, making for a more intricate system. I do think it could be viable and have a document draft for it.
### The Call to Bomb System Toggler
Sometimes endgames can be awkward, with one player having almost all the playable cards remaining and the other having nothing. The player with all the good cards can then not play until they have the chance to give their teammate multiple safe actions in one clue, or until pace forces their teammate to stall.
One solution: a *call to bomb* convention: if at some point a player tells their teammate to bomb, it is
- a signal to start using referential sieve
and/or
- a signal that the untouched cards in their teammate's hand are all trash.
### Work Hard, Play Hard
The reason we bias our play clues rightward is based on the notion that if every card is sieved, cards allowed to stay in hand for longer are more likely playable than cards that just passed through the sieve. This logic doesn't work if not every card is sieved, so loaded play clues causing playables to enter the hand without passing through the sieve can be an issue - we may struggle to make them play.
One solution: we use the moving chop of Turbo, not letting anything enter the hand without passing through the sieve. This would likely require rethinking play and save clues. I have also never played Turbo, despite some familiarity with it.
## Acknowledgements
This system is motived by the prior efforts of others in the Hanabi Central / H-Group discords, but I'm not well-versed in the community enough to know exactly whom to reference. At the very least: those behind referential sieve (timotree et al), sieve (?). Also Hallmark for playing lots of 2p, theorycrafting our personalized 2p RS, and listening to my crackpot convention ideas. But having an acknowledgements section feels kinda pretentious, as if I'm claiming to have done something serious and special as opposed to stupid and funny.
## OK, But Is It Good?
Well, maybe.
When I first played referential sieve from a mild H-Group background, it was so funny to discard from the left. The playful sieve reignited that joy for me.
As to whether it is strong? I think it is viable to build on, but probably not as strong as referential sieve. I do think there is a lot of potential for 2-player systems to incorporate gamestates where the default action is to play a card, but having a play-default convention on all the time is (probably) not ideal.
Update, after playing a small number of games with hallmark: PS x Turbo seems to have some potential.