This is a development note. The project and test data are real; AI helped me clean up the prose. Cross-match memory and player-authored rules are still experimental, and the match below is a single example rather than evidence of a stable model personality.
I've been working on a small game called Kai!. It is Liar's Dice with a language model sitting across the table. Each player sees only their own dice, then takes turns claiming that the table contains at least a certain number of one face. The next player raises the bid or calls the bluff.
The rules are simple. Most of the work ended up outside the rules: deciding what the model should remember, whether the player can exploit those memories, and what happens after the base game becomes familiar.
I created the repository on August 7. At first I only wanted to see whether an LLM could play a complete game of Liar's Dice. A few days later, most of my time was going into deleting features and changing interfaces. These are the parts that turned out to be interesting.
It had two sixes and no wild one. On its turn it looked at the dice, used the probability action, and bid five sixes:
The private reasoning stored alongside that move said something more interesting. Its opponent believed it was generally truthful and liked to calculate before bidding. Repeating the familiar look-then-calculate routine could make the aggressive bid seem more credible. DeepSeek was also ahead on chips and decided it could afford to be caught.
That was the first log that made the memory system feel like part of the game. The model was considering the dice, but it was also using its opponent's impression of it. It had played in a recognizable rhythm, accumulated some credibility, and was now spending that credibility on a risky bid.
I never put a “build trust, then bluff” strategy in the prompt. The idea came from the cross-match profile.
This is still one sample. A different seed could easily produce a completely different line. The useful result is narrower: a judgment created in one match can make its way into a later decision.
The original opponent was called Old Li. He was the owner of the dice table: proud, vindictive, and very particular about how he spoke. I put his flaws, strategic preferences, and voice directly into the prompt. It worked immediately. The first playable version already felt like it had a character.
The problem was straightforward. I could swap the underlying model and the player would still meet Old Li. The model was performing a character I had written, which made it difficult to see whether different models produced meaningfully different opponents. That was going to get in the way of the AI Arena I wanted to build later.
Every model now receives the same system prompt. It does not even know the display name shown in the interface. There are obvious drawbacks: some models barely talk, while others play well and say boring things. The dramatic quality is less predictable. At least the differences between the models have room to show up.
Removing the character prompt created another problem. Why should the player feel that the opponent in the next match is the same opponent? I eventually moved that responsibility into the profile system.
The first kind is recomputed by the deterministic engine: how often the player bluffed, when they called, how accurate those calls were, and which rounds cost them a die. The model does not get to rewrite those facts.
The second kind contains the model's own opinions: this player backs down when the multiplier is high; they like to calculate before bidding; that pause looked like weakness. Those opinions are allowed to be wrong. In practice, the mistakes may be the more interesting part because the profile is visible to the player.
If the model decides that you are honest, you can use that belief to cover a bluff in the next match. If it thinks you fold under pressure, you can deliberately hold your ground. The model then reads the new behavior and updates the profile again. It observes you, while you manage the version of you that exists in its notes.
The five-sixes example came from that loop. DeepSeek knew its opponent expected truthful, calculation-heavy play, so it kept the calculation routine and followed it with a dangerous bid.
I still have too few outside players to know whether anyone will actually play extra matches in order to manipulate a profile. Self-testing cannot answer that question.
