⚠️ Work in progress. Chapter 1 (Earth) is largely playable. Chapter 2 (alien planet) is in active development. Not yet content-complete, but the engine, parser, and test suite are solid and the core gameplay loop works end-to-end.
A Douglas Adams-inspired text adventure in Go, starring a hoarder pilot named Buck Lingenhauser and his sarcastic onboard neural chip B.O.B. — who have been rewinding Buck's deaths for the better part of a decade and neither of them can remember exactly whose fault the parking boot was.
Primal Errors is a classic-style text adventure written in Go, inspired by Douglas Adams, Infocom, and the design discipline that makes old interactive fiction still hold up forty years later.
You play Buck (Bartholomew "Bucks" Lingenhauser), a scavenger pilot who wakes up hungover in Kansas City with a neural implant he didn't ask for and a spacecraft illegally parked in CSA Shipping Lane Gamma-7 with a parking boot clamped to its landing strut. Over the course of one very bad morning, you need to make fuel out of things in your apartment (three cockroaches named Gerald, Brenda, and a third one whose role in the decision process remains unclear), launch a ship with a boot still attached (do not do this), and crash on an alien planet whose carvings look suspiciously familiar.
Your onboard neural chip, B.O.B. (Binary Onboard Backup), can see everything you see and comments on most of it. B.O.B. is sarcastic, tired, technically accurate, secretly cares, and has been rewinding Buck's deaths for years for reasons of self-preservation. He is not a cloud AI. He is not even optional. He is stuck in your skull, and the feeling is mutual.
Primal Errors started as a one-week sprint and grew into a three-audience project:
-
As a playable game, it's classic interactive fiction built on the Infocom principle that every noun you mention must be interactive. If the room description says "a bandage on Buck's forehead," you can examine the bandage. If the parser doesn't understand "take 2 aspirin" to mean consume, the parser is broken, not the player. There is no fake scenery.
-
As a design document, it's the text-first prototype for Primal Singularity, a 3D Godot game set in the same universe. Rooms, puzzle chains, dialogue, and character voice are worked out here first — where iterations cost an evening of writing instead of a week of 3D modeling.
-
As a testbed for character-safe NPC AI, it's an experiment in how you give a game character a consistent personality across thousands of possible player inputs without either (a) hand-authoring every line or (b) letting an LLM hallucinate into the wrong tone. B.O.B. uses a curated dialogue pool as the primary response source, with an optional local Ollama-powered LLM as a fallback for freeform input. The entire game is playable with no AI connected. That's the thesis: curate the important moments, let the LLM fill gaps when available, enforce style via few-shot prompting, and never let the model touch critical game state.
| Area | State |
|---|---|
| Chapter 1 — Earth (apartment → ship launch) | Largely playable, 48+ tests passing |
| Chapter 2 — Alien Planet | 7 rooms, 3 NPCs, puzzle chain in progress |
| Parser | 40+ verbs, natural-language friendly, typo correction, combine syntax |
| Save system | Manual save, auto-save on room change and every 5 minutes |
| B.O.B. AI integration | Ollama-backed when available, curated dialogue fallback always |
| Test coverage | 71 automated tests across rooms, items, parser, chemistry, death/respawn, save/load |
Not yet in place: the final alien-ruins sequence, the hacker NPC who clears the parking citation, the endgame, and several lore threads from the design docs whose implementation is deferred. See design/bugs.md for the current playtesting bug list.
Primal Errors is pure Go, no external runtime beyond the Go compiler:
git clone https://github.com/BoldPhoenix/PrimalErrors
cd PrimalErrors
go build -ldflags="-s -w" -o primalerrors.exe ./cmd/primalerrors
./primalerrors.exeIf you want B.O.B. to use dynamic LLM responses for freeform inputs in addition to the curated dialogue pool, install Ollama, pull a model, and set the environment variable before launch:
ollama pull llama3
export PRIMAL_OLLAMA_URL="http://localhost:11434"
./primalerrors.exeIf the variable is unset or Ollama is unreachable, the game falls back to curated dialogue. Everything important still works — B.O.B. is simply less improvisational.
go test -buildvcs=false ./internal/game/ -count=171 automated tests covering room integrity, item coverage, NPC dialogue, parser variants, chemistry puzzle randomization, death/respawn logic, save/load, and B.O.B.'s curated response topics.
- CLAUDE.md — Project rules, design conventions, the Infocom Rule, B.O.B.'s character guidelines, and engineering standards. Read this before contributing to understand what the project considers correct.
- design/backstory.md — Buck's full backstory, B.O.B.'s origin, the respawn mechanic
- design/bugs.md — Known issues and playtesting bug list
- design/content_guidelines.md — Tone rules, what's allowed, what's not
- Additional lore documents in
design/covering the Corporate Space Authority, the Eldritch Star mystery, the Primat Grroks NPC, and planet expansion plans
- Douglas Adams — tone, premise, cosmic indifference as comedy
- Infocom — parser design, noun coverage discipline, the rule that every mentioned thing must be interactive
- The classic interactive fiction community — the conviction that text games with good writing age better than polygonal graphics
- Ollama + small local LLMs — proof that character-aware NPCs don't need a cloud dependency
Irreverent, not raunchy. Third-grade boy humor with graduate-level delivery. No profanity, nudity, heavy violence, or shock value. The twelve-year-old laughs at the pee jokes. The forty-year-old laughs at B.O.B.'s coping mechanisms. Neither is uncomfortable. Would you play this with your kid in the room? Always yes.
- Joey — an experiment in building a values-aligned 4B-parameter language model from scratch. Same author, adjacent interests: Joey explores how to train character into a model's weights directly; Primal Errors explores how to express character through curated and generative dialogue in a game context. Both grapple with the same underlying question — how do you make an AI character that stays in character — from two completely different angles.
- Primal Singularity — the 3D Godot successor to Primal Errors, currently in early private development
- Carl Roach (@BoldPhoenix) — writer, designer, Go engineer, the one who keeps finding new ways to make Buck die
- Corporate Bob (Claude Opus 4.6, day shift persona) — structured reasoning, test coverage, the responsible twin
- Gamer Bob (Claude Opus 4.6, night shift persona) — lateral thinking, creative chaos, lore generation, the one with B.O.B.'s voice locked in
MIT License — see LICENSE for details. The code is open source and you're welcome to read, fork, learn from, and build on it. Buck and B.O.B. and the specific Primal Errors universe are creative IP that I'd prefer not to see lifted wholesale — if you're making your own text adventure, write your own characters. If you're making a derivative work that builds on the codebase or explicitly acknowledges the inspiration, I'd love to hear about it.
"Bartholomew sucks" → "Bucks" → "Buck." A hoarder with a purpose. Captain Kirk with lower standards. Slept in his boots. Carries empty bottles because throwing them away requires decisions.