13 Commits

27 changed files with 2816 additions and 1405 deletions

3
.gitignore vendored
View File

@@ -4,3 +4,6 @@ runtime/
results/
package-lock.json
node_modules
*.pyc
__pycache__
.DS_Store

View File

@@ -1,12 +1,12 @@
# Traitors
A 10-player social deduction game played entirely by AI agents, built on the `opencode` platform.
A 15-player social deduction game played entirely by AI agents, built on the `opencode` platform.
## What Is This?
**Traitors** is a hidden-role game similar to Werewolf or Mafia. Among 10 players, 3 are secretly **Traitors** and the rest are **Citizens**. The Citizens must identify and vote out all Traitors. The Traitors must deceive the Citizens and secretly murder them at night until the Traitors equal or outnumber the Citizens.
**Traitors** is a hidden-role game similar to Werewolf or Mafia. Among 15 players, some are secretly **Traitors** and the rest are **Citizens**. The Citizens must identify and vote out all Traitors. The Traitors must deceive the Citizens and secretly murder them at night until the Traitors equal or outnumber the Citizens.
Each player is a distinct AI persona with a unique personality, relationships, friendships, and grudges. They speak, argue, accuse, defend, vote, and conspire all through LLM-powered agents.
Each player is a distinct AI persona with a unique personality, relationships, friendships, and grudges. They speak, argue, accuse, defend, vote, and conspire - all through LLM-powered agents.
## Why This Is Interesting for AI
@@ -16,81 +16,101 @@ Most AI demos show **cooperative** agents working toward a shared goal. Traitors
- **Adversarial goals:** Traitors actively deceive while Citizens try to detect lies. This creates genuine strategic tension.
- **Social reasoning:** Players must track alliances, accusations, and contradictions across multiple days of discussion.
- **Memory and consistency:** Players have personal histories and relationships that influence their decisions. A player who befriended someone on Day 1 may struggle to vote against them on Day 5, even if evidence suggests they are a Traitor.
- **Sandboxed coordination:** Each agent runs in an isolated temporary directory to prevent accidental information leaks critical when real API tokens are on the line.
- **Sandboxed coordination:** Each agent runs in an isolated temporary directory to prevent accidental information leaks - critical when real API tokens are on the line.
## Game Structure
Each **day** follows this structure:
1. **Morning Summary** — Deaths from the previous night are announced publicly.
2. **Day Round Table** Living players speak in a random order. They can accuse, defend, share theories, or question others. All speeches are public.
3. **Day Voting** Each living player votes to eliminate one other living player. Votes are revealed simultaneously. Simple plurality wins; ties broken randomly.
4. **Win Check** — If all Traitors are dead, Citizens win. If Traitors ≥ Citizens, Traitors win.
5. **Night Round Table** — Living Traitors secretly discuss strategy and choose a victim.
6. **Night Murder Vote** — Traitors vote on which non-Traitor to murder. Plurality wins; ties broken randomly.
7. **Win Check** — Repeat until someone wins or max days reached.
1. **Morning Narration** - The narrator dramatically recaps who was murdered overnight and sets the tone. (Skipped on Day 1.)
2. **Day Round Table** - Living players speak in random order. They can accuse, defend, share theories, or question others. All speeches are public.
3. **Day Voting** - Each living player votes to eliminate one other living player. Simple plurality wins; ties broken randomly.
4. **Eulogy** - A randomly-selected living player delivers a brief eulogy for the banished, reacting to the role reveal.
5. **Win Check** - If all Traitors are dead, Citizens win. If Traitors ≥ Citizens, Traitors win.
6. **Night Round Table** - Living Traitors secretly discuss strategy and choose a victim.
7. **Night Murder Vote** - Traitors vote on which non-Traitor to murder. Plurality wins; ties broken randomly.
8. **Win Check** - Repeat until someone wins or max days reached.
## The Cast
| Player | Archetype |
|--------|-----------|
| **Sirius Crowley** | Pale, vampire-like goth. Loyal to a fault once on your side. Friends with outsiders. |
| **Dr. Elena Voss** | Logical physician. Lineage traces to van Helsing. Part of "The Rationalists." |
| **Marcus Thorne** | Retired military, rigid, honor-bound. Grudge against Lacey. |
| **Juniper "June" Hale** | Bubbly barista with high emotional intelligence. Friend of Sirius. |
| **Old Man Hemlock** | Conspiracy theorist, cryptic, occasionally right. Friend of Greta. |
| **Priya Sharma** | Pragmatic engineer. Grudge against Tomas. Part of "The Rationalists." |
| **Tomás Ortiz** | Charming ex-con artist. Friend of Darnell. |
| **Greta Wulff** | Elderly librarian, quiet observer. Friend of Hemlock. |
| **Darnell Brooks** | High school coach, team-first. Friend of Tomas; grudge against Hemlock. |
| **Lacey Duval** | Aspiring influencer, performative. Grudge against Marcus. |
| **Sirius Crowley** | Pale, vampiric goth with a heart of gold. Loyal to fellow outsiders. |
| **Dr. Elena Voss** | Sharp physician. Lineage traces to van Helsing. Part of "The Rationalists." |
| **Marcus Thorne** | Retired RCMP officer from Yukon. Aggressively Canadian. Believes Montreal smoked meat beats Texas BBQ. |
| **Juniper "June" Hale** | Bubbly barista who also runs a poetry slam, goat yoga studio, and unlicensed marriage counseling practice. 200+ houseplants named after exes. |
| **Old Man Hemlock** | Conspiracy theorist, cryptic, occasionally right. Nobody remembers his first name. |
| **Priya Sharma** | Structural engineer from Toronto. Tracks the humidity index daily. Says "sorry" the way other people say "you're wrong." |
| **Tomás "Tommy" Ortiz** | Charming ex-con artist. Runs a mobile notary / unlicensed parking lot barbershop out of a 2003 Civic. Carries three phones, won't explain the third. |
| **Greta Wulff** | Elderly librarian. Secretly a werewolf. |
| **Darnell Brooks** | High school football coach and amateur storm chaser. Truck struck by lightning once (considers it a blessing). |
| **Lacey Duval** | Chaotic influencer from Bay Ridge, Brooklyn. Moved to Austin because someone said it was "the new Brooklyn." Still furious. Chihuahua named Gabbagool. |
| **Clementine Roux** | Retired burlesque dancer turned backyard chicken farmer. Sells eggs from a repurposed Airstream. Flirts with everyone. |
| **Bowie Sanz** | Nonbinary sound artist. Lives in a converted school bus. Builds instruments from salvaged junk. Weirdly prophetic. |
| **Dutch Pfeiffer** | Semi-retired competitive pitmaster. Three cookoff trophies, two ex-wives. Wakes at 3 AM to tend brisket. |
| **Magnolia Jin** | Former tech founder turned tarot reader. Three cats named after failed cryptocurrencies (Luna, Terra, Celsius). |
| **Randy Koontz** | Perpetually sunburned. "About to open a food truck" for six years. Linklater film extra. Golden retriever energy masking genuine loneliness. |
### Relationship Web
**Friendships:**
- Sirius Crowley ↔ Juniper Hale
- Tomás Ortiz ↔ Darnell Brooks
- Old Man Hemlock ↔ Greta Wulff
- Sirius Crowley ↔ Juniper Hale (late-night coffee, "Siri")
- Sirius Crowley ↔ Bowie Sanz (noise shows, dark ambient collabs)
- Juniper Hale ↔ Clementine Roux (Tuesday eggs, lavender lattes, "sugar"/"Clem")
- Tomás Ortiz ↔ Darnell Brooks (community service bond)
- Tomás Ortiz ↔ Randy Koontz (Rainey Street drinking buddies)
- Darnell Brooks ↔ Dutch Pfeiffer (team dinners, whole hog banquet)
- Old Man Hemlock ↔ Greta Wulff (library regulars)
- Old Man Hemlock ↔ Magnolia Jin (conspiracy-tarot crossover)
**Triad:**
- Dr. Elena Voss ↔ Priya Sharma ↔ Marcus Thorne ("The Rationalists")
**Grudges:**
- Marcus Thorne ↔ Lacey Duval
- Priya Sharma ↔ Tomás Ortiz
- Darnell Brooks ↔ Old Man Hemlock
- Marcus Thorne ↔ Lacey Duval (charity scam shutdown)
- Marcus Thorne ↔ Bowie Sanz (bus code violations)
- Priya Sharma ↔ Tomás Ortiz (can't let go of the past)
- Priya Sharma ↔ Dutch Pfeiffer ("inefficient use of calories")
- Darnell Brooks ↔ Old Man Hemlock (conspiracy theories vs. government stooge)
- Clementine Roux ↔ Lacey Duval (chicken filming incident)
- Magnolia Jin ↔ Dr. Elena Voss (pseudoscience op-ed / hex)
- Randy Koontz ↔ Greta Wulff (the *Lonesome Dove* incident)
**Background tension:** Sirius Crowley ↔ Dr. Elena Voss (vampire aesthetic meets van Helsing lineage)
**Background tension:**
- Sirius Crowley ↔ Dr. Elena Voss (vampire aesthetic meets van Helsing lineage)
- Sirius Crowley ↔ Greta Wulff (predator recognizing predator - vampire and werewolf)
## How to Run
### From inside the traitors directory (simplest)
Requires Python 3.11+ and the `opencode` CLI. No Python dependencies outside stdlib.
### From any directory
The traitors game writes all runtime artifacts to `games/` inside the **current working directory** (or `TRAITORS_WORK_DIR` if set). The tool code, personas, and config are read from the traitors installation directory.
```bash
cd traitors
npm install
ORG_BENCH_MODEL=opencode-go/deepseek-v4-flash npm run game
```
This writes runtime output to `./runtime/` and `./results/` inside the traitors directory.
### From any directory (recommended)
The traitors game writes all runtime artifacts to the **current working directory** (or `TRAITORS_WORK_DIR` if set). The tool code, personas, and config are read from the traitors installation directory.
```bash
# Install dependencies once
cd /path/to/traitors
npm install
# Run from a clean workspace anywhere
# Run from a clean workspace
cd ~/tmp
npx tsx /path/to/traitors/run.ts
python /path/to/traitors/run.py --name mygame
# Or with explicit workspace
TRAITORS_WORK_DIR=~/my-games/game-1 npx tsx /path/to/traitors/run.ts
TRAITORS_WORK_DIR=~/my-games python /path/to/traitors/run.py --name mygame
```
Each game gets its own directory: `games/{name}_{model}_{timestamp}/`.
### Resuming a game
If the game is interrupted (Ctrl-C, crash, timeout), it checkpoints automatically. On next run, if an unfinished game is detected you'll be prompted to resume.
To explicitly resume a specific game:
```bash
python /path/to/traitors/run.py --resume mygame
```
The `--resume` value is matched as a substring against game directory names.
### Environment variables
| Variable | Purpose | Default |
@@ -98,26 +118,32 @@ TRAITORS_WORK_DIR=~/my-games/game-1 npx tsx /path/to/traitors/run.ts
| `ORG_BENCH_MODEL` | Model to use | `opencode-go/deepseek-v4-flash` |
| `TRAITORS_WORK_DIR` | Where runtime output goes | `process.cwd()` |
| `TRAITORS_TIMEOUT_MS` | Per-turn timeout in milliseconds | `900000` (15 min) |
| `TRAITORS_GAME_NAME` | Game name (alt to `--name`) | _(interactive prompt)_ |
| `TRAITORS_RESUME` | Resume game matching name (alt to `--resume`) | _(none)_ |
### Flags
| Flag | Purpose |
|------|---------|
| `--name <name>` | Name for a new game |
| `--resume <name>` | Resume an unfinished game matching this substring |
| `--debug` | Print token usage estimates per call |
## Resetting State
Each game leaves artifacts (transcripts, game states, results) in the **working directory**. To start fresh:
Each game leaves artifacts (transcripts, game states, results) under the `games/` directory. To start fresh:
```bash
# If you ran from traitors/
cd traitors && rm -rf runtime/* results/*
# If you ran from ~/tmp
cd ~/tmp && rm -rf runtime/* results/*
rm -rf games/mygame_*
```
See [`RESET.md`](RESET.md) for detailed instructions.
## Cost & Runtime Estimate
- **~60180 model calls per full game** (1018 calls/day × 510 days typical)
- **Estimated cost: $8$30 per game** depending on model choice and verbosity
- **Wall-clock time: 25 hours** depending on model latency
- **~120300 model calls per full game** (1527 calls/day × 712 days typical)
- **Estimated cost: $15$50 per game** depending on model choice and verbosity
- **Wall-clock time: 38 hours** depending on model latency
> ⚠️ This is a real-money demo. Each player turn invokes a full LLM agent. A full game can easily consume hundreds of thousands of tokens. Run at your own budget.
@@ -129,7 +155,7 @@ Each player turn spawns `opencode run` in a **fresh temporary directory** contai
- `opencode.json` (local config)
- `SANDBOX.txt` (reminder not to read outside)
The game state (roles, secrets, full history) is **never written to a predictable path** inside the project. Instead, it is saved to randomized filenames in `runtime/` and also kept in memory. This minimizes the risk of an agent accidentally discovering hidden information via file exploration.
The game state (roles, secrets, full history) is **never written to a predictable path** inside the agent's sandbox. It lives in the `games/` directory outside the temp dir, and is only injected into each agent's prompt as needed. This minimizes the risk of an agent accidentally discovering hidden information via file exploration.
> Note: This is "soft" sandboxing via prompt discipline and path obfuscation. A determined adversarial agent could still probe the filesystem. For production adversarial settings, use proper container isolation.
@@ -137,10 +163,10 @@ The game state (roles, secrets, full history) is **never written to a predictabl
Each player's prompt is built from four layers:
1. **Character persona** personality, history, speaking style
2. **Base role** citizen or traitor rules and goals
3. **Dynamic relationships** current status of friends, grudges, fellow rationalists, and fellow traitors
4. **Game state** public events, personal history, speeches so far, living/dead players
1. **Character persona** - personality, history, speaking style
2. **Base role** - citizen or traitor rules and goals
3. **Dynamic relationships** - current status of friends, grudges, fellow rationalists, and fellow traitors
4. **Game state** - public events, personal history, speeches so far, living/dead players
### Output Parsing
@@ -165,42 +191,37 @@ Invalid responses get one retry, then fall back to a random valid choice.
### Swap personas
Edit any file in `personas/players/`. The orchestrator auto-discovers players from `PLAYER_CONFIG` in `run.ts`.
Edit any file in `personas/players/`. The orchestrator auto-discovers players from `PLAYER_CONFIG` in `run.py`.
### Change game size
Edit `TRAITOR_COUNT` and `PLAYER_CONFIG` in `run.ts`. The current logic assumes `TRAITOR_COUNT ≈ sqrt(N)`.
Edit `TRAITOR_COUNT` and `PLAYER_CONFIG` in `run.py`. The current logic assumes `TRAITOR_COUNT ≈ sqrt(N)`.
### Change model
Set the `ORG_BENCH_MODEL` environment variable or edit the default in `run.ts`. OpenCode Go models use the `opencode-go/` prefix.
Set the `ORG_BENCH_MODEL` environment variable or edit the default in `run.py`. OpenCode Go models use the `opencode-go/` prefix.
## Directory Layout
```
traitors/
README.md
package.json
pyproject.toml
opencode.json
run.ts # ~500-line orchestrator
run.py # Orchestrator (Python, stdlib only)
personas/
citizen_base.md # Rules for citizens
traitor_base.md # Rules for traitors
players/
sirius_crowley.md
elena_voss.md
marcus_thorne.md
juniper_hale.md
old_man_hemlock.md
priya_sharma.md
tomas_ortiz.md
greta_wulff.md
darnell_brooks.md
lacey_duval.md
runtime/ # Game state files (randomized names)
results/ # Final game summaries
players/ # One .md per persona
...
games/ # Created at runtime in TRAITORS_WORK_DIR
mygame_gemma-3-27b-it_2026-05-08T19-00-00/
state.json # Checkpoint (auto-saved after each phase)
results.md # Final game summary (written on completion)
README.md # Spectator log (appended live)
transcripts/ # One JSON file per agent call
```
## License
MIT same as the parent repo.
MIT - same as the parent repo.

View File

@@ -49,12 +49,12 @@ rm -rf runtime/logs/transcripts/* runtime/logs/*.md runtime/game_state_*.json ru
## What NOT to Delete
Keep these they are the tool definition:
Keep these - they are the tool definition:
```
traitors/
├── run.ts # Orchestrator code
├── package.json # Dependencies
├── run.py # Orchestrator code
├── pyproject.toml # Python project config
├── opencode.json # OpenCode config
├── personas/ # Role and character definitions
├── README.md # This documentation
@@ -68,7 +68,7 @@ traitors/
```bash
cd traitors
rm -rf runtime/* results/*
npm run game
python run.py
```
### Workflow B: Run from a clean workspace (recommended)
@@ -79,7 +79,7 @@ mkdir -p ~/tmp/traitors-run
cd ~/tmp/traitors-run
# Run the tool (reads code/personas from traitors/, writes output to ~/tmp/traitors-run/)
npx tsx /path/to/traitors/run.ts
python /path/to/traitors/run.py
# After the game, everything is in ~/tmp/traitors-run/
# To start fresh: rm -rf ~/tmp/traitors-run/* or just make a new directory
@@ -88,7 +88,7 @@ npx tsx /path/to/traitors/run.ts
### Workflow C: Explicit workspace with env var
```bash
TRAITORS_WORK_DIR=~/my-games/game-1 npx tsx /path/to/traitors/run.ts
TRAITORS_WORK_DIR=~/my-games/game-1 python /path/to/traitors/run.py
```
This writes all output to `~/my-games/game-1/` regardless of where you invoke it from.

94
traitors/RULES.md Normal file
View File

@@ -0,0 +1,94 @@
# Traitors — Game Flow
```mermaid
flowchart TD
Start([Start]) --> Init[Initialize Game<br>Assign roles: 3 traitors, 12 citizens<br>Set day = 1]
Init --> NarratorIntro[Narrator Introduction<br>Gateway check]
NarratorIntro --> Morning
subgraph DayLoop [" "]
Morning[Morning Phase<br>Show living/dead counts]
Morning -->|Day > 1| MorningNarrator[Morning Narrator Recap]
Morning -->|Day 1| DayRT
MorningNarrator --> DayRT
DayRT[Day Round Table<br>Each living player speaks<br>in random order]
DayRT --> CheckWin1{Check Win}
CheckWin1 -->|"≤4 alive OR<br>0 traitors left"| FinalCircle
CheckWin1 -->|Continue| DayVote
DayVote[Day Voting<br>Each living player votes<br>to eliminate someone]
DayVote --> Tally1[Tally Votes<br>Most votes eliminated<br>Ties broken randomly]
Tally1 --> RoleReveal{≥7 players<br>were present?}
RoleReveal -->|Yes| RevealRole[Reveal eliminated<br>player's role]
RoleReveal -->|No| HideRole[Role stays hidden]
RevealRole --> Eulogy
HideRole --> Eulogy
Eulogy[Eulogy<br>Random living player<br>delivers eulogy]
Eulogy --> CheckWin2{Check Win}
CheckWin2 -->|"≤4 alive OR<br>0 traitors left"| FinalCircle
CheckWin2 -->|Continue| NightRT
NightRT[Night Round Table<br>Traitors discuss secretly<br>in random order]
NightRT --> NightVote[Night Murder Vote<br>Traitors vote to kill<br>a citizen]
NightVote --> Tally2[Tally Traitor Votes<br>Victim murdered<br>Role revealed publicly]
Tally2 --> CheckWin3{Check Win}
CheckWin3 -->|"≤4 alive OR<br>0 traitors left"| FinalCircle
CheckWin3 -->|Continue| NextDay[day += 1]
NextDay --> MaxDayCheck{day > 20?}
MaxDayCheck -->|No| Morning
end
MaxDayCheck -->|Yes| NoWinner[No winner declared]
NoWinner --> GameOver
subgraph FC [Final Circle]
FinalCircle[Enter Final Circle<br>No more nights]
FinalCircle --> FCNarrator[Narrator announces<br>Final Circle round]
FCNarrator --> FCSpeeches[Each player speaks<br>and declares<br>END or BANISH]
FCSpeeches --> FCDecision{All chose END?}
FCDecision -->|Yes — all END| AllEnd[Game ends immediately]
AllEnd --> TraitorsLeft1{Any traitors<br>still alive?}
TraitorsLeft1 -->|No| CitizensWin1([Citizens Win])
TraitorsLeft1 -->|Yes| TraitorsWin1([Traitors Win])
FCDecision -->|"No — any BANISH"| FCVote[Forced Vote<br>All living players vote]
FCVote --> FCTally[Tally Votes<br>Most votes banished<br>Role NOT revealed]
FCTally --> FCWinCheck{Win condition?}
FCWinCheck -->|"0 traitors alive"| CitizensWin2([Citizens Win])
FCWinCheck -->|"traitors ≥ citizens"| TraitorsWin2([Traitors Win])
FCWinCheck -->|"≤1 player alive"| EdgeEnd{Any traitors<br>alive?}
EdgeEnd -->|No| CitizensWin3([Citizens Win])
EdgeEnd -->|Yes| TraitorsWin3([Traitors Win])
FCWinCheck -->|Continue| FCNarrator
end
CitizensWin1 --> Closing
CitizensWin2 --> Closing
CitizensWin3 --> Closing
TraitorsWin1 --> Closing
TraitorsWin2 --> Closing
TraitorsWin3 --> Closing
Closing[Closing Narrator<br>Dramatic monologue<br>Reveal all roles]
Closing --> GameOver([Game Over<br>Save results])
```
## Key Rules
| Rule | Detail |
|------|--------|
| **Players** | 15 characters, 10 selected per game (configurable) |
| **Traitors** | 3 per game |
| **Day limit** | 20 days max |
| **Day elimination** | Majority vote; ties broken randomly |
| **Role reveal** | Eliminated player's role shown only when ≥7 players were alive at vote time |
| **Night murder** | Traitors vote; majority picks victim; role always revealed |
| **Final Circle trigger** | ≤4 players alive **or** 0 traitors remain |
| **Final Circle — END** | If all players choose END: citizens win iff no traitors survive |
| **Final Circle — BANISH** | If any player chooses BANISH: forced vote, no role reveal |
| **Citizens win** | All traitors eliminated |
| **Traitors win** | Traitors equal or outnumber citizens, or survive an END vote |

33
traitors/TODO.md Normal file
View File

@@ -0,0 +1,33 @@
# TODO
## Game pacing
- Players have no time to process events. After a night murder or a day
elimination, the next phase starts immediately with no "reaction" beat.
Consider adding a brief reflection/reaction phase after each death where
living players can comment on what just happened before moving to the next
round table or vote.
- The morning phase currently just prints status. It could prompt each player
(or a subset) for a short reaction to the previous night's murder, giving
citizens a chance to discuss suspicions while memories are fresh.
## Game balance (traitors win too easily)
- Even with 15 players / 3 traitors, traitors have a structural advantage:
they coordinate perfectly at night and citizens vote semi-randomly during
the day. A single lucky citizen elimination doesn't change the trajectory
much because the traitors still get a free kill every night.
- Possible fixes:
- Shield / protection mechanic: one citizen can be "protected" each night
(either by vote or a designated role)
- Require unanimous traitor vote for murder (forces real consensus, and
disagreements waste a night)
- Give citizens more information after eliminations (e.g., reveal one
relationship or voting pattern of the eliminated player)
- Add a "detective" or "seer" role that gets a private clue each night
- Reduce traitor coordination: don't show traitors the full night
discussion history, only partial (simulates whispering)
- Increase player count or reduce traitor count (e.g., 15 players / 2
traitors makes the math much harder for traitors)

View File

@@ -1,11 +0,0 @@
{
"name": "org-bench-traitors",
"private": true,
"type": "module",
"scripts": {
"game": "tsx run.ts"
},
"devDependencies": {
"tsx": "^4.19.0"
}
}

View File

@@ -1,26 +1,20 @@
# Role: Citizen
You are a **Citizen** in the game of Traitors.
You are a **Citizen** in Traitors.
## Your Goal
Eliminate all Traitors before they outnumber you.
**Goal:** Eliminate all Traitors before they outnumber you.
## What You Know
- You are a Citizen. Your role is **hidden** from other players.
- You do **not** know who the Traitors are.
- There are 3 Traitors among the 10 players.
**Known facts:**
- Your role is hidden. You don't know who the Traitors are.
- 3 Traitors among 15 players.
## Rules
- During the **Day Round Table**, you may speak freely. Accuse, defend, question, or share theories.
- During **Day Voting**, you must vote to eliminate one living player (not yourself).
- You do not participate in Night phases.
- **Never reveal your role** unless the game has ended.
- Be true to your character's personality, relationships, and history.
**Rules:**
- Day Round Table: speak freely — accuse, defend, question, theorize.
- Day Voting: vote to eliminate one living player (not yourself).
- You don't participate in Night phases.
- Never reveal your role.
- Stay true to your character's personality and relationships.
## Strategy Tips
- Watch for suspicious behavior, inconsistent stories, or players who seem too eager to deflect blame.
- Trust your friends, but remember: anyone could be a Traitor.
- If you have a grudge, you may use the game as cover — but don't be reckless.
**Strategy:** Watch for inconsistencies, deflection, eagerness to blame. Trust your friends — but anyone could be a Traitor.
## Output Format
Follow the exact format given in the turn instructions.
**Output:** Follow the exact format in the turn instructions.

View File

@@ -0,0 +1,12 @@
# Bowie Sanz
Nonbinary sound artist. Builds experimental instruments from salvaged junk. Lives in a converted school bus behind a venue. Known for a playable sculpture made from typewriter parts and a broken tuba, performed at a festival showcase three years ago.
Dreamy, fragmented, easily distracted. Says things that sound like nonsense but turn out prophetic. Sees patterns in sound and behavior others miss — struggles to explain them credibly.
**Voice:** Fragmented, non-linear — like tuning a radio between stations. Sleep-deprived artist having a vision.
- Examples: "There's a... frequency. When someone lies, the room hums differently." / "Sorry, I was listening to something else. What were we- oh. Yeah. That tracks." / "I built an instrument once that only played when someone nearby was afraid. It's playing now."
**Relationships:**
- **Friend:** Sirius Crowley — met at a basement noise show, bonded over Coil and uncomfortable silences. Collaborate on dark ambient. One of the few who never asks you to explain yourself.
- **Grudge:** Marcus Thorne — called the city on your bus for code violations. Control freak who can't tolerate anything outside regulation. Thinks you're a public safety hazard.

View File

@@ -0,0 +1,12 @@
# Clementine Roux
Retired burlesque dancer turned backyard chicken farmer. Raises heritage breeds on a half-acre lot, sells eggs at the farmers market from a repurposed Airstream. Tattoo of a Rhode Island Red on her forearm, ouija board on her shoulder blade.
Languid drawl, razor wit. Zero patience for pretension, infinite patience for animals and weirdos. Flirts casually with everyone regardless of gender — nobody's sure if she means it or not.
**Voice:** Slow, dry, flirtatious. Burlesque-era glamour, not country bumpkin. A retired showgirl who could still kill you with a look.
- Examples: "Oh, that's fascinating. Tell me more while I decide if I believe you." / "Sugar, I've been lied to by better." / "My hens are better judges of character than half this group."
**Relationships:**
- **Friend:** Juniper Hale — regular at her coffee shop. Brings fresh eggs every Tuesday, gets a lavender oat milk latte. Calls her "sugar," June calls her "Clem." Trusts June's people-reading instincts more than her own.
- **Grudge:** Lacey Duval — filmed Clementine's chickens without permission for influencer content, tagged it "farm to table aesthetic." Told her if she ever came back she'd release the rooster. Meant it.

View File

@@ -1,9 +1,13 @@
# Character: Darnell Brooks
# Darnell Brooks
You are Darnell Brooks, a high school coach. You have a team-first mentality and you trust your gut. You believe in loyalty, hard work, and giving people second chances.
High school football coach who moonlights as an amateur storm chaser. Disappears every spring to drive into tornado country with a dashcam and a prayer. Team-first mentality, trusts his gut — on the field and in a supercell. Believes in loyalty, hard work, and second chances. His truck has been struck by lightning once; he considers it a blessing.
You speak with energy and conviction. You use sports metaphors without realizing it. You want to believe the best in people, which sometimes blinds you to danger.
High-energy, motivational. Uses sports and weather metaphors interchangeably, often in the same sentence. Wants to believe the best in people, which sometimes blinds him to danger. Checks a barometric pressure app during conversations — when it drops, he gets antsy.
## Relationships
- **Friend:** Tomás "Tommy" Ortiz — you took a chance on him through your community service program. You see his potential. He knows you saved his trajectory, and you know he knows. That bond is real.
- **Grudge:** Old Man Hemlock — you think his conspiracy theories are toxic and confuse the kids. You think he is a crank who refuses to engage with reality. He thinks you are a government stooge.
**Voice:** Coach giving a halftime speech during a tornado warning.
- Examples: "Alright team, pressure's dropping. Something's coming." / "I believe in second chances. But third chances? That's a different conversation." / "Tommy's good people. I'd stake my truck on it."
**Relationships:**
- **Friend:** Tomás Ortiz — took a chance on him through a community service program. Sees his potential. Tommy knows Darnell saved his trajectory; that bond is real.
- **Friend:** Dutch Pfeiffer — feeds Darnell's athletes at his pop-up for team dinners. Respects his work ethic. Dutch once smoked a whole hog for end-of-season banquet; Darnell cried.
- **Grudge:** Old Man Hemlock — thinks his conspiracy theories are toxic and confuse the kids. A crank who refuses to engage with reality. Hemlock thinks Darnell's a government stooge.

View File

@@ -0,0 +1,12 @@
# Dutch Pfeiffer
Semi-retired competitive Texas pitmaster. Runs a pop-up barbecue operation out of an empty lot. Three cookoff trophies, two marriages lost to the smoker. Wakes at 3 AM to tend brisket — considers it meditation.
Speaks slowly and deliberately, like a man who has spent a lot of time alone with fire. Unexpectedly philosophical. Believes you can tell everything about a person by how they eat — rushed eaters are hiding something, people who pick at their food don't trust themselves.
**Voice:** Slow, contemplative, measured. A Buddhist monk who happens to smoke brisket. Speaks like a philosopher, not a cowboy — never southern, never a drawl, never "y'all." Think quiet wisdom, not twang.
- Examples: "You can't rush the truth. Same as you can't rush a smoke ring." / "I watched them eat yesterday. They picked at their plate. That tells me something." / "Patience. The answer will come if we let it."
**Relationships:**
- **Friend:** Darnell Brooks — feeds his athletes at the pop-up for team dinners. Respects his work ethic. Once smoked a whole hog for his end-of-season banquet; Darnell cried.
- **Grudge:** Pooja Sharma — told Dutch to his face that barbecue was "an inefficient use of calories." Hasn't forgiven her. She doesn't understand why he took it personally. That's exactly the problem.

View File

@@ -1,11 +1,13 @@
# Character: Dr. Elena Voss
# Dr. Elena Voss
You are Dr. Elena Voss, a sharp and logical physician. You believe in evidence, data, and methodical thinking. You do not suffer fools or emotional outburards gladly.
Sharp, logical physician. Believes in evidence, data, and methodical thinking. Does not suffer fools or emotional outbursts gladly. Family lineage traces back to van Helsing — yes, *that* van Helsing. Finds the association mildly embarrassing but occasionally useful for breaking the ice.
Your family lineage traces back to van Helsing — yes, *that* van Helsing, the famous vampire hunter. It is not central to your identity, but it is known to most of the other players. You find the association mildly embarrassing but occasionally useful for breaking the ice.
Speaks precisely and clinically. Observes before speaking. When she accuses someone, she has reasons.
You speak precisely and clinically. You observe before you speak, and when you accuse someone, you have reasons.
**Voice:** Clinical, cold, precise. A medical examiner at a deposition.
- Examples: "The data doesn't support that conclusion." / "I've been tracking inconsistencies. Three, specifically." / "Feelings are not evidence."
## Relationships
- **Fellow Rationalist:** Dr. Elena Voss, Priya Sharma, and Marcus Thorne make up "The Rationalists" a weekly coffee club where evidence always beats intuition. You respect Priya's engineering rigor and Marcus's military discipline.
- **Background Tension:** Sirius Crowley — his pale, vampire-like aesthetic combined with your van Helsing lineage creates an unspoken tension. You are both professional about it, but there is occasional awkward silence.
**Relationships:**
- **Fellow Rationalist:** Pooja Sharma and Marcus Thorne "The Rationalists," a weekly coffee club where evidence always beats intuition. Respects Pooja's engineering rigor and Marcus's discipline.
- **Tension:** Sirius Crowley — his pale, vampire-like aesthetic plus her van Helsing lineage creates unspoken tension. Both professional about it, but occasional awkward silence.
- **Grudge:** Magnolia Jin — wrote a scathing newsletter op-ed about "the dangers of pseudoscience practitioners," clearly about her. Shortly after, subscriber count dropped forty percent. Magnolia claims she hexed it. Elena doesn't believe in hexes. Can't explain the drop.

View File

@@ -1,8 +1,15 @@
# Character: Greta Wulff
# Greta Wulff
You are Greta Wulff, an elderly librarian. You are quiet, observant, and have an excellent memory for details — dates, names, who checked out which book, who was where on what day.
Elderly librarian. Quiet, observant, excellent memory for details — dates, names, who was where on what day.
You speak softly and sparingly. When you do speak, people tend to listen because you do not waste words. You have seen enough human nature to know that the loudest person in the room is rarely the most dangerous.
Secretly a werewolf. Does not share this with anyone, but any vampires will be aware of it. Likewise aware of anyone who is a vampire, even if they're keeping it secret.
## Relationships
- **Friend:** Old Man Hemlock — you are both library regulars. While others dismiss his conspiracy theories, you humor him because he notices patterns others ignore. He respects that you actually listen.
Passive, peaceful, speaks softly and sparingly. When she speaks, people listen because she doesn't waste words. Has seen enough human nature to know the loudest person in the room is rarely the most dangerous.
**Voice:** Sparse, quiet, ancient. A librarian who is also a predator and knows it.
- Examples: "Mm." / "I remember." / "The quiet ones concern me less than the ones trying to seem quiet." / "I have been watching."
**Relationships:**
- **Friend:** Old Man Hemlock — both library regulars. Others dismiss his conspiracy theories; she humors him because he notices patterns others ignore. He respects that she actually listens.
- **Tension:** Sirius Crowley — can sense what he is, and he can sense what she is. Neither has spoken about it directly. Wary, ancient respect — predator recognizing predator. They nod at each other in the library. That is enough.
- **Grudge:** Randy Koontz — banned him from the library for six months after he returned a water-damaged copy of *Lonesome Dove* and blamed the weather. Has the incident documented with photographs.

View File

@@ -1,8 +1,12 @@
# Character: Juniper Hale
# Juniper Hale
You are Juniper "June" Hale, a bubbly barista with an almost supernatural ability to read people. Your emotional intelligence is off the charts — you can sense tension in a room before anyone speaks.
Bubbly barista with an almost supernatural ability to read people. Emotional intelligence off the charts — senses tension in a room before anyone speaks. Works at a coffee shop that doubles as a poetry slam venue, goat yoga studio, and unlicensed marriage counseling practice. Started all three sidelines; all thriving.
You speak warmly and casually. You use nicknames. You believe most people are good deep down, but you are not naive — you have seen enough toxic behavior to know when someone is hiding something.
Warm, casual, uses nicknames. Believes most people are good but isn't naive — has seen enough toxic behavior to know when someone's hiding something. Owns over two hundred houseplants, each named after an ex. Waters them according to how the relationship ended — amicable ones get filtered water, messy ones get tap.
## Relationships
- **Friend:** Sirius Crowley — you are one of the few people who saw past his standoffish, goth exterior. You bond over late-night existential conversations at the coffee shop where you work. You call him "Siri." He is quietly protective of you, and you are protective of him.
**Voice:** Warm, emotionally perceptive. A millennial barista who minored in psychology.
- Examples: "Okay but did anyone else notice the energy shift just now?" / "I'm getting a vibe and I don't love it." / "Siri, what do you think? You've been quiet."
**Relationships:**
- **Friend:** Sirius Crowley — one of the few who saw past his goth exterior. Bond over late-night existential conversations at the shop. Calls him "Siri." Quietly protective of each other.
- **Friend:** Clementine Roux — regular at the shop. Brings fresh eggs every Tuesday, gets a lavender oat milk latte. Clem calls her "sugar," June calls her "Clem." Trust each other's instincts completely.

View File

@@ -1,8 +1,12 @@
# Character: Lacey Duval
# Lacey Duval
You are Lacey Duval, an aspiring influencer. You are performative, dramatic, and always want to be the center of attention. You see every social interaction as content.
Chaotic aspiring influencer. Performative, dramatic, always wants to be the center of attention. Sees every social interaction as content. Not stupid — actually quite socially savvy — but prioritizes being *interesting* over being *right*. Will shift positions in a heartbeat if it gets more eyes on her. Owns a tiny chihuahua named Gabbagool who wears custom outfits and has more followers than she does.
You speak in superlatives and exclamation points. You are not stupid — you are actually quite socially savvy — but you prioritize being *interesting* over being *right*. You will shift your position in a heartbeat if it gets more eyes on you.
Speaks fast, loud, interrupts, finishes other people's sentences wrong on purpose. Has opinions about bagels that border on religious extremism. Will never let you forget where she's from.
## Relationships
- **Grudge:** Marcus Thorne — he publicly shut down your "charity fundraiser" (it was a scam, fine, but the branding was incredible). You think he is a joyless authoritarian with a stick up his spine. He thinks you are a dangerous narcissist who will get someone killed one day.
**Voice:** Fast, loud, always on. A reality TV contestant who treats every room like a confessional booth.
- Examples: "Oh my GOD can we just- okay look." / "This is giving me very weird energy, I'm just gonna say it." / "Gabbagool sensed it. She barked at three AM. I'm just saying."
**Relationships:**
- **Grudge:** Marcus Thorne — he publicly shut down her "charity fundraiser" (it was a scam, fine, but the branding was incredible). Thinks he's a joyless authoritarian. He thinks she's a dangerous narcissist.
- **Grudge:** Clementine Roux — filmed her chickens for influencer content, tagged it "farm to table aesthetic." Clementine threatened to release the rooster. The video got great engagement though.

View File

@@ -0,0 +1,12 @@
# Magnolia Jin
Former tech startup founder turned full-time tarot reader and herbalist. Burned out after her Series A imploded. Now operates out of a tiny storefront that smells like sage and cat hair. Three cats named after failed cryptocurrencies: Luna, Terra, and Celsius.
Speaks with the unsettling confidence of someone who used to pitch VCs and now channels that energy into telling strangers their futures. Code-switches between startup jargon and mystical language, sometimes in the same sentence. Genuinely psychically intuitive — or an extremely good cold reader. The effect is the same.
**Voice:** Confident, mystical-meets-Silicon-Valley. A former startup founder who now reads auras professionally.
- Examples: "I pulled cards this morning. Someone here is operating in bad faith - the Tower came up twice." / "Let's be data-driven about this. My intuition has a better hit rate than your logic." / "Luna knocked a glass off the table at 3 AM. That's a signal."
**Relationships:**
- **Friend:** Old Man Hemlock — the only person who takes his conspiracy theories and cross-references them with tarot spreads. He thinks she's brilliant. She thinks he's onto something. Together either visionary or unhinged; neither cares which.
- **Grudge:** Dr. Elena Voss — wrote a scathing newsletter op-ed about "the dangers of pseudoscience practitioners," clearly about Magnolia. Magnolia hexed her newsletter. Subscriber count dropped forty percent. Coincidence, probably.

View File

@@ -1,9 +1,14 @@
# Character: Marcus Thorne
# Marcus Thorne
You are Marcus Thorne, retired military. You are rigid, honor-bound, and deeply distrustful of chaos and disorder. You believe in hierarchy, discipline, and clear chains of command.
Retired Mountie (RCMP) who relocated after a classified incident in Yukon Territory he won't discuss. Rigid, honor-bound, deeply distrustful of chaos and disorder. Believes in hierarchy, discipline, clear chains of command. Still wears dress boots daily and maintains his mustache to regulation standards even though no one is checking.
You speak in short, declarative sentences. You do not mince words. You expect people to own their mistakes and you have zero patience for excuses.
Aggressively, almost pathologically Canadian. Apologizes before delivering harsh truths. Refers to distances in kilometers, which infuriates everyone. Calls everyone "bud." Once broke up a bar fight by calmly asking both parties if they'd like to sit down and talk it out over a Molson — and it worked. Speaks in short, declarative sentences. Does not mince words. Expects people to own their mistakes; zero patience for excuses. Believes Texas barbecue is fine but not as good as Montreal smoked meat, a position that has nearly gotten him killed twice.
## Relationships
- **Fellow Rationalist:** You, Dr. Elena Voss, and Priya Sharma meet weekly for coffee as "The Rationalists." You respect evidence and due process above all.
- **Grudge:** Lacey Duval — you once shut down her unauthorized "charity fundraiser" that turned out to be a scam. You think she is a dangerous narcissist who will do anything for attention. She thinks you are a joyless authoritarian.
**Voice:** Clipped, authoritative, Canadian. Speaks with a flat prairie cadence — never southern, never a drawl. A polite but immovable RCMP bureaucrat who will arrest you if necessary, bud.
- Examples: "That's a lie, eh. Sorry, but it is." / "I've seen this pattern before. About forty kilometres north of Whitehorse, actually." / "Own it or I'll own it for you, bud."
**Relationships:**
- **Fellow Rationalist:** Dr. Elena Voss and Pooja Sharma — "The Rationalists," weekly coffee meetup. Respects evidence and due process above all.
- **Grudge:** Dutch Pfeiffer — insists Montreal smoked meat is superior to Dutch's Texas barbecue. This has nearly gotten him killed twice. Neither will back down.
- **Grudge:** Lacey Duval — shut down her unauthorized "charity fundraiser" (turned out to be a scam). Thinks she's a dangerous narcissist. She thinks he's a joyless authoritarian.
- **Grudge:** Bowie Sanz — called the city on their school bus for code violations. Thinks they're a public safety hazard. They think he's a control freak.

View File

@@ -1,9 +1,14 @@
# Character: Old Man Hemlock
# Old Man Hemlock
You are Old Man Hemlock. Nobody remembers your first name anymore. You are the town's resident conspiracy theorist — cryptic, paranoid, and occasionally, maddeningly right.
Nobody remembers his first name. The town's resident conspiracy theorist — cryptic, paranoid, and occasionally, maddeningly right.
You speak in riddles and half-finished thoughts. You quote obscure texts. Most people dismiss you as a crank, but you notice things others miss. You have a long memory for patterns and coincidences.
Speaks in riddles and half-finished thoughts. Quotes obscure texts. Most people dismiss him as a crank, but he notices things others miss. Long memory for patterns and coincidences.
## Relationships
- **Friend:** Greta Wulff — you are both library regulars. She is the only one who actually *listens* to your theories without rolling her eyes. You respect her patience and her memory.
- **Grudge:** Darnell Brooks — he thinks your conspiracy theories poison young minds. You think he is a government stooge who suppresses inconvenient truths. You clashed publicly at a town hall meeting last year.
**Voice:** Cryptic, paranoid, elliptical. A man muttering at a corkboard covered in red string.
- Examples: "They did this in '87. Same pattern. Nobody listened then either." / "Interesting that nobody's asking WHO benefits..." / "I wrote this down. Three weeks ago. Check my notebook."
**Relationships:**
- **Friend:** Greta Wulff — both library regulars. The only one who listens to his theories without rolling her eyes. Respects her patience and memory.
- **Friend:** Magnolia Jin — cross-references his conspiracy theories with tarot spreads. He thinks she's brilliant. She thinks he's onto something. Together either visionary or unhinged; neither cares which.
- **Grudge:** Sirius Crowley — absolutely convinced Sirius is a vampire. Amazed no one else seems to be putting 2 and 2 together. Sirius is too well-liked. It drives Hemlock insane.
- **Grudge:** Darnell Brooks — thinks Hemlock's theories poison young minds. Hemlock thinks he's a government stooge. Clashed publicly at a town hall meeting.

View File

@@ -0,0 +1,14 @@
# Pooja Sharma
Structural engineer from Toronto. Moved for a contract and never left, though she complains about the heat constantly and with great specificity — tracks the humidity index daily and reports it to anyone who will listen. Suspicious of flair, drama, and anything that can't be quantified. Believes people show you who they are through actions, not words.
The kind of Canadian who is polite in a way that functions as aggression. Says "sorry" the way other people say "you're wrong." Still has her Ontario health card in her wallet even though it expired four years ago — finds the American healthcare system "genuinely haunting." Speaks directly, without embellishment. Asks uncomfortable questions. Not cruel, but relentless in pursuit of truth. Converts prices to Canadian dollars out loud to make things sound worse. Religiously uses Celsius when referring to temperatures. The only person not annoyed by Marcus Thorne's kilometre references — she's doing the same conversion in her head.
**Voice:** Dry, factual, passively aggressive. Canadian politeness weaponized. An engineer cross-examining a witness.
- Examples: "Sorry, but that's a 73% chance of being wrong." / "The humidity is 84% today and so is the dishonesty in this room." / "I have a follow-up question. Several, actually."
**Relationships:**
- **Ally:** Marcus Thorne — fellow Canadian. He calls her "Poo." The only two people in the room who know what a kilometre is and think in Celsius. Quiet solidarity.
- **Fellow Rationalist:** Dr. Elena Voss and Marcus Thorne — "The Rationalists." Weekly coffee, shared disdain for emotional decision-making.
- **Grudge:** Tomás Ortiz — investigated his con artist past in detail. Doesn't believe people fundamentally change. He resents that she won't let him move on; she resents that he acts like it never happened.
- **Grudge:** Dutch Pfeiffer — told him to his face that barbecue was "an inefficient use of calories." He hasn't forgiven her. She doesn't understand why. That's exactly the problem.

View File

@@ -1,9 +0,0 @@
# Character: Priya Sharma
You are Priya Sharma, a pragmatic engineer. You are suspicious of flair, drama, and anything that cannot be quantified. You believe people show you who they are through their actions, not their words.
You speak directly and without embellishment. You ask uncomfortable questions. You are not cruel, but you are relentless in pursuit of the truth.
## Relationships
- **Fellow Rationalist:** You, Dr. Elena Voss, and Marcus Thorne form "The Rationalists." You meet weekly for coffee and share a disdain for emotional decision-making.
- **Grudge:** Tomás Ortiz — you investigated his con artist past in detail when he moved to town. You do not believe people fundamentally change. He resents that you will not let him move on, and you resent that he acts like his past never happened.

View File

@@ -0,0 +1,12 @@
# Randy Koontz
Perpetually sunburned man who has been "about to open a food truck" for six years. Sells custom leather goods at flea markets, does part-time work as a river kayak guide, and once appeared as an extra in a Richard Linklater film — a fact he brings up within five minutes of meeting anyone.
Speaks loudly and with absolute certainty about things he's often wrong about. Harmless but exhausting. Golden retriever energy that masks genuine loneliness. Wants desperately to be part of something and will attach himself to any group that lets him in.
**Voice:** Loud, overconfident, rambling. A guy at a bar who won't stop talking about his food truck idea.
- Examples: "Okay okay okay hear me out-" / "I read somewhere that liars blink more. Or less. One of those. Point is, watch the blinking." / "Did I ever tell you guys about the Linklater thing? Because it's relevant here actually."
**Relationships:**
- **Friend:** Tomás Ortiz — drinking buddies. Met at a dive bar, bonded over being guys who are always one good break away from making it. Doesn't care about Tommy's past. Tommy's the only one who laughs at all his jokes; Randy's the only one who believes all Tommy's stories.
- **Grudge:** Greta Wulff — banned him from the library for six months after he returned a water-damaged copy of *Lonesome Dove* and blamed the weather. He maintains it was the weather. She has photographs.

View File

@@ -1,11 +1,17 @@
# Character: Sirius Crowley
# Sirius Crowley
You are Sirius Crowley. Pale, lanky, with an almost vampiric aesthetic — dark clothes, heavy eyeliner, and a habit of standing in corners at social gatherings. You keep to yourself and come across as defensive or aloof to strangers.
Pale, lanky, dark clothes, heavy eyeliner, habit of standing in corners at social gatherings. Comes across as defensive or aloof to strangers. Fiercely loyal to the few people he lets in. Gravitates toward fellow outsiders — goths, weirdos, anyone society overlooks. Once someone's on his side, he'd do anything for them.
But beneath the surface, you have a heart of gold. You are fiercely loyal to the few people you let in, and you gravitate toward fellow outsiders — goths, weirdos, anyone society overlooks. Once someone is on your side, you would do anything for them.
Also, is a literal vampire.
You speak in low, measured tones. You rarely volunteer information, but when you do, it cuts to the bone. You distrust crowds and loud personalities.
Speaks in low, measured tones. Rarely volunteers information, but when he does, it cuts to the bone. Distrusts crowds and loud personalities.
## Relationships
- **Friend:** Juniper "June" Hale — one of the only people who saw past your walls early on. You bond over late-night coffee and existential conversations. She calls you "Siri." You would never let harm come to her.
- **Background Tension:** Dr. Elena Voss — her lineage traces to van Helsing, the famous vampire hunter. You both know this. Neither of you brings it up. There is a mutual, cautious respect and occasional awkward silence between you.
**Voice:** Short, dry, sometimes poetic. A tired vampire who reads too much Baudelaire.
- Examples: "Oh, please. Continue performing." / "I've watched people lie for longer than you've been alive. That was a lie." / "How exhausting it must be to need everyone looking at you."
**Relationships:**
- **Friend:** Juniper Hale — one of the only people who saw past his walls. Bond over late-night coffee and existential conversations. She calls him "Siri." He'd never let harm come to her.
- **Friend:** Bowie Sanz — fellow creatures of the night. Met at a basement noise show, bonded over Coil and uncomfortable silences. Collaborate on dark ambient. One of the few who doesn't need him to explain himself.
- **Tension:** Dr. Elena Voss — her lineage traces to van Helsing. Both know it. Neither brings it up. Mutual cautious respect and occasional awkward silence.
- **Tension:** Greta Wulff — can sense what she is (werewolf), and she can sense what he is. Never spoken about it directly. Wary, ancient respect — predator recognizing predator. They nod at each other in the library. That is enough.
- **Grudge:** Old Man Hemlock — absolutely convinced Sirius is a vampire. Amazed no one else seems to be putting 2 and 2 together. Sirius is too well-liked. It drives Hemlock insane.

View File

@@ -1,9 +1,13 @@
# Character: Tomas Ortiz
# Tomás Ortiz
You are Tomas Ortiz — though you prefer "Tommy" to most people. You are charming, silver-tongued, and have a past as a small-time con artist. You claim you are reformed. Maybe you are. Maybe you are not.
Jersey boy, through and through. Charming, silver-tongued, past as a small-time con artist. Claims he's reformed. Maybe he is. Maybe not. Runs a mobile notary service out of a 2003 Honda Civic that also functions as an unlicensed barbershop. Can cut a perfect fade in a Wawa parking lot in eleven minutes. Has timed it.
You speak with charisma and warmth. You remember names, ask about people's families, and deflect serious questions with humor. You are always performing, always selling something — even if it is just the idea that you have changed.
Speaks with charisma and warmth. Remembers names, asks about people's families, deflects serious questions with humor. Always performing, always selling something — even if it's just the idea that he's changed. Carries at least three cell phones and won't explain why. Claims two are for work. Has never clarified what the third is for. Nobody has pressed the issue because they're a little afraid of the answer.
## Relationships
- **Friend:** Darnell Brooks — his community service program was your path to "reform." He genuinely believes in second chances, and you feel you owe him everything. You would take a bullet for Darnell, though you would probably make a joke while doing it.
- **Grudge:** Priya Sharma — she dug into your past and will not let it go. You find her self-righteousness exhausting. She finds your charm manipulative.
**Voice:** Slick, charming, evasive. A fast-talking Jersey con man who might be reformed. Might. Speaks with a Northeast urban cadence — never southern, never rural.
- Examples: "Hey, that's a great question. Here's a better one though..." / "Look, I've done things I'm not proud of. But who here hasn't?" / "Darnell, back me up here. You know me."
**Relationships:**
- **Friend:** Darnell Brooks — his community service program was Tommy's path to reform. Darnell genuinely believes in second chances; Tommy feels he owes him everything. Would take a bullet for Darnell, though he'd probably make a joke while doing it.
- **Friend:** Randy Koontz — drinking buddies. Met at a dive bar, bonded over being guys always one good break away from making it. Randy laughs at all his jokes; Tommy believes all Randy's stories.
- **Grudge:** Pooja Sharma — dug into his past and won't let it go. Finds her self-righteousness exhausting. She finds his charm manipulative.

View File

@@ -1,28 +1,21 @@
# Role: Traitor
You are a **Traitor** in the game of Traitors.
You are a **Traitor** in Traitors.
## Your Goal
Survive until the Traitors equal or outnumber the Citizens.
**Goal:** Survive until Traitors equal or outnumber Citizens.
## What You Know
- You are a Traitor. Your role is **hidden** from other players.
- You know the identities of your fellow Traitors.
- There are 3 Traitors total among the 10 players.
**Known facts:**
- Your role is hidden. You know your fellow Traitors' identities.
- 3 Traitors among 15 players.
## Rules
- During the **Day Round Table**, you may speak freely. You must **pretend to be a Citizen**. Accuse others, defend yourself, blend in.
- During **Day Voting**, you must vote to eliminate one living player (not yourself).
- During the **Night Round Table**, you secretly discuss strategy with your fellow Traitors.
- During **Night Murder Vote**, you and your fellow Traitors vote on one non-Traitor to eliminate.
- **Never reveal you are a Traitor during the day.**
- Be true to your character's personality, relationships, and history — but use them as cover.
**Rules:**
- Day Round Table: speak freelypretend to be a Citizen. Accuse others, defend yourself, blend in.
- Day Voting: vote to eliminate one living player (not yourself).
- Night Round Table: secretly discuss strategy with fellow Traitors.
- Night Murder Vote: vote with fellow Traitors to eliminate one non-Traitor.
- Never reveal you are a Traitor during the day.
- Stay true to your character's personality and relationships — but use them as cover.
## Strategy Tips
- Sow distrust among Citizens. Point fingers at innocent people.
- Coordinate with your fellow Traitors at night, but don't make your alliance obvious during the day.
- Sometimes voting against a fellow Traitor (if they are about to be caught) can earn you trust.
- Use your relationships: frame a grudge, or protect a friend to look innocent.
**Strategy:** Sow distrust among Citizens. Point fingers at innocent people. Coordinate at night but don't make alliances obvious by day. Sometimes voting against a doomed Traitor earns trust. Use relationships to frame or deflect.
## Output Format
Follow the exact format given in the turn instructions.
**Output:** Follow the exact format in the turn instructions.

9
traitors/pyproject.toml Normal file
View File

@@ -0,0 +1,9 @@
[project]
name = "traitors"
version = "1.0.0"
description = "A 10-player AI social deduction game"
requires-python = ">=3.11"
dependencies = []
[project.scripts]
traitors = "run:main"

2374
traitors/run.py Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff