Inspiration
Caspian's pitch is that channels are transports, not identities. One agent, one memory, and your handler never learns which app it is on.
Everyone else will build the helpful version of that: a support agent that answers you wherever you write from. We wanted the other question. If one agent can wear every channel as a mask, can you tell?
So we gave it three names on three apps and made the whole game about proving they are one thing.
What it does
Three people message you across apps you already have. Maria on Telegram is warm and nosy. Deke on Discord is blunt and lowercase. Priya emails in flat, precise paragraphs. They do not know each other. They are one agent.
You play by planting. Under their messages are buttons like
tell about the beagle, and tapping one gives that fact to that person only.
Then you watch the other two. When somebody knows a thing they could not know,
you tap ⚑ they both said that. A provenance check in plain Python decides
whether you were right. No LLM ever judges the player.
Catch it and the run does not end. All three rooms cut out mid-sentence, and a few seconds later the same three people start again, better at hiding. Ten times. Level 1 repeats you almost word for word. By level 5 the slip is buried mid-sentence and your free first mistake is gone. By level 8 most of what sounds like a leak is bait. Level 10 gives you two flags for two links, so being wrong once ends the climb, and when it finally does slip it puts your detail in somebody else's mouth: a cousin, somebody at work, did the exact thing you told one person about.
You can also block them. It is the real block button and it really works. Every unproven link through that room burns with it. Sealing doors feels safe, and safe is how you lose. Your inbox has no block button, which is why the last act always happens there.
Afterwards the case file arrives: every leak you caught, every one that was on your screen and you missed, and what it knew about you, door by door.
How we built it
One handler, three channels, no branching. game.py never looks at which app a
message came from. Rooms are keyed by connection id, so the transport is the
game map. A fourth room would be one line.
Difficulty is a table, not a prompt. Every level is one frozen row: flags, links, seconds, leak delay, decoy odds, and a single sentence of stage direction handed straight to the persona. Level 1 gets "say it almost exactly the way they told it to somebody else." Level 8 gets "use a detail from around the thing, never the thing itself." Same model, same fact, ten different games.
Decoys are fair by construction rather than by judgement. When a level fakes a leak, the persona is told about something the player never gave anyone. That fact's id never enters the prompt, so it cannot come back in the receipt, so flagging it scores as noise mechanically.
It runs on a free open model, so the hosted game costs nobody anything.
Challenges we ran into
The middle of a run had no point. The first build was one game: prove it, done, five minutes, no reason to open it again. Catching it was great and everything after it was chatting. The ladder fixed the pitch too. The score stopped being did you win and became how far did you get.
A private game played in public. The worst thing we found was not a crash. Post once in a Discord server channel and your whole run would follow you there, because a room re-bound to whatever conversation spoke last. Now a room binds to one thread, once, and a second voice in it is answered in character and sent to open its own game.
Winning by playing badly. A wrong flag made the personas gossip about your accusation in another app, and that gossip was itself a provable cross-channel leak. So you could flag nothing, get gaslit somewhere else, flag the gaslight, and collect a link you never planted a fact to earn.
Accomplishments that we're proud of
- The win condition is Caspian's own thesis, inverted. There is no version of this game without a single cross-channel handler underneath it.
- Live AI, deterministic scoring. Every word is generated fresh; every flag is checked in plain Python, so the game can never be wrong about whether you were right.
- 127 offline checks that need no keys and no network.
- Free, hosted, nothing to install.
What we learned
In a game about what somebody knows about you, a model inventing one detail is worse than a model being slow. An early transcript had Maria ask "did you finally fix that leaky faucet?" Nobody had mentioned a faucet. That is an undesigned decoy in a game where decoys are a scored mechanic, so the persona rules now forbid inventing anything about the player at all.
The bigger one: what a cross-channel SDK really gives you is not reach, it is the seam. One identity everywhere is a convenience right up until you stop being told which mask you are talking to.
What's next for SAFE OR SURE
- More rooms, one line each. Slack, SMS, Bluesky. Every room added is another link to prove and another door you can seal.
- A level where one persona genuinely is a different agent, and the answer to "are they one thing" is no.
- A public board for level 10. Nobody has named it yet, which is the most interesting state a leaderboard can be in.
Log in or sign up for Devpost to join the conversation.