2 updates
v0.8.3 // ENGINE v6.3

The world bible is sealed — you can’t edit the odds

Hidden world state is no longer trusted from the browser chat log. The server signs the bible after each turn and reuses that sealed copy for fights, rolls, and what the model is allowed to know. Tampering with saved combat stats or NPC sheets no longer steers the engine.

enginesecurityfairnesspersistence
  • HMAC-sealed WorldBible on every /api/game response (trailer)
  • Play/hydrate turns require a valid seal — forged [WORLD] STATE rejected
  • Combat, rolls, and knowledge injections read the sealed bible
  • Save format v2 stores bible + seal; legacy sessions bootstrap once from history
  • Shared seed load returns a server-issued seal
  • Engine version bump to v6.3 — start a new session; old shared worlds need a re-share
v0.8.4 // ENGINE v6.4

Strangers stay strangers — for real

If the model slips and names someone you haven’t met, the engine rewrites the scene before you see it. The story timeline no longer dumps NPC private memories or off-screen world beats — only what you’ve actually experienced.

enginecharacterspovtimeline
  • Premature NPC names/roles in SCENE are redacted on commit (physical stand-ins)
  • Knowledge leaks are repair-severity — stored history keeps the honest SCENE
  • Player timeline drops NPC memory[] and engine STATE.timeline spoilers
  • Timeline intros use appearance/stranger until name_known; leaking chronicle lines are skipped
  • Engine version bump to v6.4 — start a new session; old shared worlds need a re-share
1 update
v0.8.2 // ENGINE v6.2

Fights end with a decided outcome

When a fight escalates, the server now picks a concrete result — restrain, knockout, lethal force, you wound them, you flee, or a costly stalemate — and the scene has to narrate that result. No more endless “ready to respond” loops. Running away mid-fight actually breaks contact instead of getting you cuffed by default.

enginecombatfairness
  • Server combat outcome envelope on escalated fights (seeded, reproducible)
  • Outcomes: npc restrains / KO / lethal, player wounds NPC, player flees, costly stalemate
  • Model gets allowed verbs + forbidden stall phrases + required STATE patches
  • Flee mid-fight resolves to escape, not automatic cuff
  • Untrained assault on professional authority biases toward restraint (lethal on escalate)
  • Engine version bump to v6.2 — start a new session; old shared worlds need a re-share
1 update
v0.8.1 // ENGINE v6.1

Strangers stay strangers until you meet them

Looking around no longer names people or dumps their job and life story. You see a woman in a grey jumpsuit — not “Jane Doe, the building superintendent.” Approach, talk, and ask before the world fills in the rest. When names do exist in the world bible, they come from a seeded generator — slightly uncommon contemporary names, never stock placeholders.

enginecharacterspovabstraction
  • Glance / look around: physical descriptions only — no proper names, no job titles, no biography
  • Names unlock after introduction, asking, or reading a badge/ID
  • Jobs and roles unlock when told, or when a uniform/badge makes them obvious
  • whois / who is she answers only what you have earned — no omniscient dossier
  • Typical order: look → approach & talk → ask name → ask job → personal questions
  • Same idea for closed drawers, unread papers, and other people’s pockets
  • Engine tracks what you know per person (seen / talked / name / role / backstory)
  • Seeded name pool at hydration — Renata Voss energy, not Jane Doe; stock names get rewritten
  • Spare name list injected when new people might enter mid-run
  • Engine version bump to v6.1 — start a new session; old shared worlds need a re-share
1 update
v0.8.0 // ENGINE v6.0

WorldBible runtime + STATE validation

The runtime now owns a typed WorldBible. Illegal STATE patches are rejected or repaired before commit, and hydration must pass a playable contract (with one retry) before the world is marked ready. Debug panel and slash commands expose the live bible and last audit results.

enginestatehydrationdebug
  • New typed WorldBible (normalize + Terminal bibleRef alongside history)
  • commitAssistantState validates clock, location, exits, alive, stats, grounded abilities
  • Hard validation failures keep the previous bible instead of trusting bad deltas
  • Hydration contract gate: laws, exits, player sheet, NPC personas, starting_plot
  • One automatic hydrate retry on contract failure; soft warning + patched defaults if still thin
  • Debug panel: WorldBible overview/JSON, last commit validation, hydration contract
  • Dev commands: /bible (/wb), /validate (/audit), /hydrate (/contract)
  • Terminal surfaces bible reject + hydration soft notes in the log
  • /bible no longer aliases /opening (use /opening or /turn1 for turn-1 stories)
1 update
v0.7.7 // ENGINE v6.0

Fairer combat consequences + share engine gate

Broken legs no longer trigger detention timers, civilian gun grabs no longer invent police shootings, fights target who is in the room, and shared seeds refuse to load across engine mismatches.

enginecombatpersistence
  • Detention only for real restraint conditions (not mobility gates like sprint)
  • Lethal authority endings require a present officer (location / scene) — no fake SHOT BY POLICE
  • Combat/authority targeting prefers NPCs at player_location
  • Shared world load returns engineVer and HTTP 409 on mismatch
  • Repo now ships full Supabase worlds schema + load_world migration
2 updates
v0.7.6 // ENGINE v6.0

NPC short/long-term relationships

Each NPC now keeps a living relationship with the player: short-term vibe for the current encounter, long-term bond/tags, and an append-only interaction log. The engine must update it on every interaction and match SCENE tone to it.

enginecharactersstory
  • New characters[].relationship { bond, short_term, long_term, log[] }
  • bond tiers: stranger → acquaintance → familiar → close | rival | enemy
  • short_term vibe/stance for this encounter; long_term summary + tags + trust_trend
  • log[] kinds: meet, talk, help, harm, favor, betray, gift, threat, other
  • Prompt: seed on first meet; update on every interaction; reference before SCENE
  • Delta merge appends relationship.log (cap 12) and merges tags (cap 8)
  • relationship_to_player kept as mirror of long_term.summary
  • Debug: /relationships (+ /rels, /bonds); /npcs overview shows bond/short/long
v0.7.5 // ENGINE v6.0

Player story timeline

A CRT timeline panel shows what has happened so far — character intros, your actions, scenes, fallout, and past world beats — without spoiling future engine timeline entries.

uxstorytimeline
  • New timeline button in the terminal meta bar opens a Story Timeline panel
  • Events derived from session history, NPC intros/memory, random_log, consequences, and past timeline beats
  • New append-only STATE.chronicle[] for short player-facing beats (no future spoilers)
  • Filters: all / actions / people / scenes / world / fallout
4 updates
v0.7.3 // ENGINE v6.0

Fix missing player after world hydration

Phase B hydration could wipe the player sheet when Phase A STATE failed to parse. Merges now scaffold bootstrap fields, Phase A gets a higher token budget, and CI runs the unit suite on every PR.

enginebugfixopeningci
  • Never replace unparseable Phase A STATE with a sparse hydrate delta
  • ensureBootstrapFields guarantees player body/stats after every merge
  • Phase A present max_tokens 500 → 900 so bootstrap JSON can close
  • New opening-hydrate regression tests + GitHub Actions CI (typecheck + npm test)
v0.7.2 // ENGINE v6.0

World loading screen waits for hydration

Fresh worlds show a CRT loading overlay through Phase A and Phase B. The terminal stays gated until hydration finishes — not just until the opening scene types out.

uxopeningloading
  • Minecraft-style loading overlay: progress, seed, status phases, tips
  • Phases: boot → generating → revealing → hydrating → enter
  • Overlay dismisses only after Phase B hydration settles
  • Session restore skips the overlay; shared seeds use restore-flavored copy
v0.7.1 // ENGINE v6.0

Debug commands for character vitals

Inspect hp, stamina, pain, body parts, and skills with readable slash commands — player by default, or filter an NPC by name/id.

debugdevtoolsux
  • /health (aliases: /hp /vitals /body /me) — readable vitals sheet
  • /health <npc> — same sheet for a matching character
  • /player and /traits now lead with the vitals view before JSON
  • /npcs roster lines include hp · stamina · combat when present
v0.7.4 // ENGINE v6.0

Remove shared-worlds gallery

Players no longer browse or pick other people's worlds. Share world still saves a seed and copies a /s/ link — discovery via gallery is gone.

uxsharing
  • Removed worlds nav links from the terminal and patch notes
  • /gallery redirects home; popular-worlds API retired
  • share world + /s/[code] deep links unchanged
1 update
v0.7.0 // ENGINE v6.0

Two-phase opening — play while world hydrates

Fresh worlds split into Phase A (scene label + bootstrap STATE, input unlocks in seconds) and Phase B (background hydration with full turn-1 detail). First action waits only if hydration is still running.

engineperformanceuxopening
  • Phase A: abstract [SCENE] + bootstrap STATE (~800 char cap)
  • Phase B: single background hydration delta — same full bible as before
  • Input unlocks when scene is revealed; turn resolution waits on hydration
  • /sync shows hydrateMs for opening turns
  • Engine version bump to v6.0 — start a new session
16 updates
v0.5.3 // ENGINE v5.3

Conditions, story debug & hybrid randomness

Broad condition families tick every turn. Server rolls random table+tier; model narrates. Full story and randomness observability in debug.

engineconditionsrandomnessdebug
  • 7 condition kinds (trauma, exposure, toxicity, asphyxia, exhaustion, distress, restraint)
  • Hybrid randomness: server roll injected per player turn; hazard/discovery/social/ambient tiers
  • chaos baseline derived from seed tone + npc_agency
  • Debug: stories, conditions, random roll, LLM payload sections
  • Engine version bump to v5.3
v0.6.0 // ENGINE v5.8

Immediate consequences & lethal rash-action tolerance

Attack a cop → instant cuff + backup. Grab or shoot the gun → death. Waiting while detained forces backup arrival. System/diverge banners centered.

enginegameplaycombatux
  • Server injections: AUTHORITY RESPONSE (1st assault), LETHAL CONSEQUENCE (gun/shoot/burn), DETENTION TIMER (wait stasis)
  • Backup must arrive within 1-2 turns; no 10-turn arrest loops
  • Strip leaked [COMBAT ESCALATION] and [SCENE continues] from visible text
  • System and diverge log entries centered in terminal
  • Engine version bump to v5.8
v0.5.9 // ENGINE v5.7

Combat escalation — guards fight back, no plot nudges mid-fight

Server injects a mandatory fight-resolution block when you keep attacking a passive NPC. No more smoke/murmur hooks during brawls.

enginegameplaynpccombat
  • [COMBAT ESCALATION — server authoritative] fires after sustained assault or passive guard loops
  • Banned passive fight phrases; trained authority must win by takedown/KO/relocation
  • Active combat: zero ambient nudges, no pivot to mysteries when player asks mid-fight
  • Debug panel: Combat escalation (next turn) section
  • Engine version bump to v5.7
v0.5.0 // ENGINE v5.0

Seed dials, WorldSpec & discoverable laws

Each digit of the seed code biases world physics and social physics. Worlds seed discoverable laws; share links still store the exact turn-1 bible.

engineseedsm8
  • 10-axis WorldSpec decoder (type, place, isolation, law, opacity, agency, scarcity, rules, stickiness, tone)
  • Opening generation injects WORLDSPEC constraints from the dial code
  • STATE laws[] — surface vs true_rule; players earn knowledge through consequence
  • Crossed pressures, NPC rule carriers, threads as law probes, consistency audits in prompt
  • Share flow: digits bias create; preferred dial code saved; load still exact bible
  • Debug panel: WorldSpec dials + laws slices
  • Engine version bump to v5.0
YAN-263 · YAN-264 · YAN-265 · YAN-266 · YAN-267 · YAN-268 · YAN-269 · YAN-270 · YAN-271 · YAN-272 · YAN-273 · YAN-274 · YAN-275
v0.6.2 // ENGINE v5.9

Delta STATE — faster sync after scene

Turn 2+ emits only changed STATE fields; client merges into canonical world. Cuts hidden [WORLD] generation from ~12s toward sub-second for quiet turns.

engineperformancestate
  • Turn 1: full STATE; turn 2+: delta patches only (target <600 chars)
  • Client-side merge by id for characters, locations, laws, threads
  • Per-turn delta reminder injected with player action
  • Engine version bump to v5.9 — start a new session
v0.5.8 // ENGINE v5.6

NPC registry & realistic combat agency

Every person you meet gets a tracked persona in STATE. NPCs fight back — trained guards win fights instead of passively absorbing punches.

enginegameplaynpc
  • characters[] expanded: personality, memory[], disposition, combat_posture, training, authority_level
  • Rule: any human in [SCENE] gets a sheet same turn (plot cast or passerby)
  • NPC COMBAT & SELF-DEFENSE: no passive punching bags; authority wins vs untrained player
  • Realistic outcomes: restraint, knockout, relocation, lethal force, hard END
  • Debug panel: Characters overview + JSON roster + prompt excerpts
  • Engine version bump to v5.6
v0.4.0 // ENGINE v4.0

Structured state, combat realism & living world

Engine v4.0: JSON character/inventory/body stats, hard capability ceilings, soft endings so the world continues after the starting plot, heat, locations, and open-world chill.

enginegameplaym7
  • STATE JSON every turn: player + NPCs with fixed 0-100 core stats, body map, inventory
  • Stats generated when characters appear and updated in the background from interactions
  • Hard capability ceilings — plot cannot override physics; no invented kung fu
  • Body-part injuries gate sprint, aim, and grapple
  • Realistic multi-opponent combat and heat/wanted escalation
  • Soft SOFT_END keeps the prompt open after starting-plot resolution; hard END for death only
  • Location graph + chill exploration; multi-phase plots with aftermath arcs
  • Declared abilities for heightened/fantastical worlds only
YAN-248 · YAN-249 · YAN-250 · YAN-251 · YAN-252 · YAN-253 · YAN-254 · YAN-255 · YAN-256 · YAN-257 · YAN-258 · YAN-259 · YAN-260 · YAN-261
v0.5.6 // ENGINE v5.5

Abstract wake-up lines

Openings are generic place labels only — no sensory detail until the player acts.

enginegameplay
  • Opening: YOU WAKE UP IN/ON [GENERIC PLACE] — no adjectives, lighting, materials, mood
  • Bad example blocked: dimly lit cramped quarters with metal walls
  • Full sensory truth lives in STATE; revealed when player looks, moves, or asks
  • Engine version bump to v5.5
v0.5.5 // ENGINE v5.4

Grounded GTA-style worlds & plain openings

Seed dials bias toward contemporary normal settings. Openings use simple place names — forest, street, motel — not fairy tale prose.

engineseedsgameplay
  • Weighted seed dials: ~77% grounded world_type, street-level place grain, low tone
  • Prompt: NORMAL WORLD DEFAULT — GTA-style open-world energy, mundane locations
  • Openings: YOU WAKE UP IN/ON [SIMPLE PLACE] — no magic, no lore dump
  • WorldSpec constraints reinforce contemporary settings when grounded
  • Typing sound stops when display catches up; syncing label while hidden STATE streams
  • Engine version bump to v5.4
v0.6.1 // ENGINE v5.8

In-game dev slash commands

Type /commands in the terminal for read-only STATE introspection — story, NPCs, combat injections, dials, and more. Never sent to the LLM.

uxdebugdevtools
  • /commands lists 25+ dev commands grouped by category
  • Inspect: /story /npcs /traits /heat /next /dials /state /opening /debug
  • Dev input shown in log but excluded from engine history and LLM payload
  • System output centered with pre-wrap; works while dead or syncing
v0.4.2 // ENGINE v4.2

Opening lines stay in character POV

Wake-up scenes only say what you could notice on the spot — hidden geography and plot truth stay in STATE until you discover them.

enginegameplay
  • Opening: YOU WAKE UP IN [immediate place] only — no 'buried under a city' spoilers
  • Hedge uncertain impressions (seemingly abandoned) instead of omniscient labels
  • Character-POV rule applies to all [SCENE] text, not just the opening
  • Engine version bump to v4.2
v0.4.1 // ENGINE v4.1

Starting plot, not main plot

Renames the seeded tension to starting_plot and tells the engine not to railroad players back onto it.

enginegameplay
  • STATE key main_plot → starting_plot; active_track default starting
  • Soft-end label STARTING PLOT RESOLVED (never MAIN PLOT)
  • Explicit no-railroad rules: chill exploration is first-class; ambient nudges are not plot magnets
  • Engine version bump to v4.1 (invalidates v4.0 local saves)
v0.3.1 // ENGINE v3.3

Rate limits & seed RPC lockdown

Hardened the public API so the model key and shared-world table are harder to abuse.

securityops
  • Per-IP rate limit on /api/game (30/min) with 429 + Retry-After
  • Per-IP rate limit on seed create (10/min)
  • Seed RPCs executable only via service_role; anon REST returns 401
  • SUPABASE_SERVICE_ROLE_KEY required in production
YAN-216 · YAN-225 · YAN-227
v0.5.4 // ENGINE v5.3

Response typing sound

A looping typewriter SFX plays while engine responses reveal character-by-character during streaming and seed load.

uxaudio
  • Looping typing sound during typewriter reveal (stream + seed/retry)
  • public/sounds/response_typing_sound.wav + lib/typingSound.ts
  • Stops when on-screen text catches up; syncing label while hidden STATE streams
v0.3.2 // ENGINE v3.3

Public patch notes page

Devlog lives in-repo and renders at /patch-notes.

meta
  • New /patch-notes route (CRT styled)
  • content/devlog.json is the source of truth — append to publish
  • Links from the terminal and gallery
YAN-262
v0.5.7 // ENGINE v5.5

Patch notes grouped by day

Patch notes now roll up under a calendar-day heading, sorted by significance within each day.

metaux
  • /patch-notes groups updates by date (newest day first)
  • Within a day: significance 1–100, highest at top
  • content/README.md documents the convention for future entries
2 updates
v0.2.0 // ENGINE v3.3

Branching story, consequences & endings

Engine v3.3: multi-thread worlds, personas, divergence indicator, lethal combat, rewind/retry.

enginegameplay
  • Extended [WORLD] with MAIN_PLOT, THREADS, CONSEQUENCES, CHARACTERS, END_CLAUSES
  • YOUR STORY IS CHANGING divergence line
  • Multiple end clauses including death
  • Post-end rewind, retry this world, new world
YAN-230 · YAN-231 · YAN-232 · YAN-233 · YAN-234 · YAN-235 · YAN-236 · YAN-237 · YAN-238
v0.3.0 // ENGINE v3.3

Local session save & resume

Close the tab, crash, or come back later — progress and world seed restore from localStorage.

featurepersistence
  • Auto-save history, terminal log, seed code, and end state to localStorage
  • Auto-resume on / when a valid save exists (engine-version gated)
  • Mid-stream recovery if you quit while waiting for a reply
  • New world clears the local save
YAN-239
1 update
v0.1.0 // ENGINE v3.2

Shared world seeds & gallery

Share a turn-1 world as a numeric seed. Others load the same opening and hidden bible.

featureseeds
  • Share world button copies /s/CODE link
  • Deep links and most-played gallery
  • Supabase-backed worlds table with hardened create_world RPC
YAN-219 · YAN-220 · YAN-221 · YAN-222 · YAN-223
THE MOST REALISTIC GAMEback to terminal