Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
LLM 에이전트를 플레이어로 하는 사회적 추리 게임으로, 계약서를 기반으로 AI 코딩 에이전트를 대결시켜 만들었습니다
Social-deduction sim (Similar to Among Us) with LLM agents as players. Built by directing AI coding agents against written contracts.
게임Python · TypeScriptGitHub @dkdan10온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
AiLibi — can agents reason from what they actually saw?
by Daniel Keinan · implemented by Claude Code and Codex agents · AI-reviewed · MIT ·
Watch the recorded demo · Inspect results and three decisions · Read an ownership decisionREADME 전문 보기 ↗An Among Us-style game where every player is an LLM agent.
by Daniel Keinan · code written by Claude Code and Codex agents under my direction · MIT ·
100 recorded games, replayed in the browser. No install, no account, no model calls. Best on a laptop.
Nine AI players share a small space station. Seven crewmates do tasks. Two impostors kill, lie, sabotage and hide in vents. When someone finds a body, everyone meets, talks and votes to eject a player or skip. Simple rules move the players around; the game runs in ticks, and in one tick a player walks at most one room. An open model, Qwen3.6-27B, does the talking and voting, in one of 14 personalities, using only what that player actually saw and heard.
At tick 9 two players lie dead, one impostor stands in MedBay and the other is inside a vent, while p-5 can see only p-4, whom p-5 accuses at the meeting that follows. This is game 19 of the nine-player set, the game the demo's guided tour opens on.
p-5 accuses p-4 on something it really saw, yet p-4 is a crewmate.
The group did not follow p-5. Another player had seen p-6 use a vent, the meeting ejected p-6, an impostor, and the crew went on to win. That gap between evidence and truth is what the recorded games measure.
Game 19, at tick 12. Player 8 has just been found dead in MedBay.
p-1 (crewmate): "I might be mistaken, but I distinctly saw p-6 vent in Engineering at tick 12, which is... well, it's hard to explain away, isn't it? …"
p-6 (impostor): "Actually, p-1's claim is a desperate fabrication to save themselves. I was standing right there in Engineering at tick 12, and I certainly didn't vent; …"
p-7 (crewmate): "Vent seen. Case closed. Vote p-6."
Five votes to eject p-6, two skips. The game had checked p-1's claim against what p-1 actually saw and marked it as matching. In the demo you can watch as one player with the unseen rooms fogged out, click a vote to open the line behind it, and read the exact prompt each model received.
I wanted an Among Us-like game where AI agents are the players and a language model is called only during meetings. I also wanted to try an AI-forward workflow: directing coding agents instead of typing the code myself.
Then one question took over: when an agent votes to eject someone, does that vote rest on something it actually saw or heard? An accusation can be honest and still wrong; the picture above shows one. The recorded games are how I checked.
engine/). One function takes the world and everyone's actions and returns the next world. Every tick's full state is hashed (SHA-256) and every model reply is recorded, so a game replays exactly without calling a model.observation/). Agents see only what their player can see. Import rules checked in CI forbid agent code from importing the engine, and a test plants a forbidden import to prove the check fails.meetings/, llm/). Movement, tasks and kills are rule-based. The model is called once per speaking turn and once per ballot, about 30 calls in a nine-player game, under token, cost and time limits. It reads a log of what its player saw and heard and the other players' words; at the ballot it also sees a suspicion score the rules compute for every player. A vote to eject must cite the line it rests on.scripts/check.sh). Lint, strict typing, import rules, the Python and frontend unit tests, and a check that the figures in this page's findings and on the results page still match the recordings and reports.The engine is about 2,500 lines; most of the code is tests and evaluation or experiment tooling, and most of the bytes are recorded games. Start reading at engine/tick.py, observation/service.py, meetings/voting.py and tests/test_firewall.py. Python 3.11 (asyncio, FastAPI, Pydantic) · TypeScript, React, PixiJS · pytest, Hypothesis, Playwright · strict mypy. Architecture · Game rules
Two sets of 50 games were recorded, nine players with two impostors and four with one. Figures here are from the nine-player set; the rest are on the results page. They describe this system, not the model in general.
I directed this project without hand-writing the production code. Claude Code and Codex agents wrote it. I chose the starting three rules: a pure engine, player agents that cannot see the full game state, and meetings run through an LLM fed with a memory of that player's own observations. I then designed a first MVP: 4 players (1 impostor), one static map, and the ability to replay and view the simulated games. The project was split into phases, and each phase into task cards for coding agents to implement, with the goal of a pull request per card that met the task's definition-of-done items. Codex reviewed most pull requests before I merged them. I decided what was accepted and what the demo shows, and the targets each measurement had to meet were written down before it ran.
After the MVP was complete the process iterated, and each phase became a new feature, with planning and audits to build the tasks and the definition-of-done items for each. Those phases included changing the meeting LLM from Anthropic to a local Qwen model through Ollama (7B, later 9B) as a cost trade-off, making 9 players (2 impostors) the main game, a complete frontend redesign whose screens I designed in Claude Design, and then moving to Featherless for a larger model.
My biggest lesson was the power and nuance of agentic coding workflows. I found the process rewarding but challenging. I built a project I find interesting, and I could not have built it at the same speed without an LLM, but there were real trade-offs. When I started with a clear vision for each phase, the LLM assistance was very effective and I could iterate well. In the later stages I wanted to push what I could do and spent many phases trying to build an ML model for the gameplay itself (how the players decide on tasks, movement, kills and other actions). That work got away from me because it was not well planned. The learned players won more games than the scripted ones but missed the targets written down before measuring, so none of them plays in the demo. The evidence is still in the repo: the training/ folder and what was tried and why it stayed off.
Understanding what is being implemented, and what the limitations of a build are, is crucial for building anything sustainable. This project was a testing ground as much as it is a final product.
You need uv, Python 3.11 (uv python install 3.11), Node.js 22 or newer, and lsof. Setup downloads the dependencies once. After that, nothing below needs an API key or the network.
git clone --filter=blob:none https://github.com/dkdan10/AiLibi.git # about 320 MB of files, mostly recorded games the tests replay
cd AiLibi
bash scripts/setup_env.sh
# The viewer on the recorded games: http://localhost:5173
bash scripts/run_spectator.sh
# Check that the 100 sample games and the 100 games from two earlier rounds of the nine-player game replay byte for byte (about 20 s, offline)
UV_OFFLINE=1 bash scripts/verify_samples.sh
# Everything CI checks except the browser tests, about 20 min
bash scripts/check.sh
The local server shows hidden roles, so keep it on localhost. New games need a model provider (a local Ollama model works) and spending limits (setup).
More: results in full · five-minute reading guide · glossary · the raw, agent-written working record · contributing