The fidelity bar — what a game must LOOK and FEEL like
The [game design bar](game-design-bar.md) says what the studio is allowed to build. The [completeness bar](completeness-bar.md) says what a game must have. The [content bar](content-bar.md) says how much game there is.
None of them says whether it is any good to look at or to hold. That was the gap, and this policy closes it.
Every rule below is written from a real defect that shipped, nearly all of them from one night — Vibe Shift, 2026-09-09/10, where the owner played the build and sent back a list. Nothing here is taste for its own sake. Each rule names the failure that produced it, because a rule without its failure is a rule the next lane will argue with.
The bar is not a look. Games in this catalog are pixel art, ink-brush, flat 2D, low-poly neon and photoreal-ish, and they should stay that way. It is a floor of craft that applies whatever the style is.
1. Light it like a room, not like a screensaver
Key, fill, and a rim. A scene lit only from above and in front reads as coloured boxes. The rim — a light from behind that casts no shadows, whose only job is to draw an edge on everything facing away from the key — is most of the distance between "boxes" and "objects". Vibe Shift had no rim at all until it was added; that single light did more than any other change that night.
An environment map is AMBIENT LIGHT, not just a reflection. scene.environment lifts every PBR surface in the scene. Set it high and a night interior becomes a pale daylit one and every shadow goes with it (measured: 0.42 flattened the room; 0.14 was right). Add one so metal and glass have something to catch, then turn it down until the lamps are doing the lighting again.
Contrast is the point. Dark room, bright pools. An evenly lit scene has nowhere for the eye to go. If a surface near a lamp is blowing out to white, the lamp is too strong or the material is too pale — fix that, do not lower the exposure and dim the whole frame.
Soft shadows. A hard PCF edge under every desk is the most "student project" thing in a frame. PCFSoftShadowMap costs nothing.
2. Ground everything that touches the floor
Objects with no contact darkening read as decals floating on the ground. Put a soft radial contact-shadow decal under every desk, chair, plant, bin, rack and cabinet.
Do not reach for SSAO/GTAO to do this. It was tried through the post-FX kit's composer hatch and it carved black wedges out of the collectibles — they are unlit MeshBasicMaterial by design, and an AO pass cannot tell a glowing pickup from a desk leg. Art-directed decals are cheaper, controllable, and have no artifacts.
3. Bloom is a MATERIALS problem
If something is flaring, find the material. Emissives live in linear space and the bloom threshold is measured against them, so anything authored at 1.3× or brighter will glow no matter how far down the pass is turned. Turning the effect down instead just dims a scene full of things that were too bright.
Vibe Shift shipped a paper aeroplane as white with an emissive grey, so a memo crossed the room as a flare. Its LEDs, strips, signage and pickup halos were all authored at 1.3–1.8×. They belong at 1.02–1.15×, with the pass low behind them (0.16 at threshold 0.97 there). Bloom should pick out the two or three things that genuinely emit light, and nothing else.
A Sprite with no map is a solid square. Every glow, halo, spark and dust mote needs a radial-gradient texture. Vibe Shift shipped coloured squares behind every collectible for a day; it was invisible only because the room was too washed out to show it, and became obvious the moment the scene got contrast.
4. Put something in the air
An empty volume is what makes a lit room read as a diorama: everything is a surface and nothing is a space. A few hundred slow additive motes, drifting and twinkling on their own clocks, is the cheapest depth cue there is.
5. Orient everything, and assume the camera will move
A prop against a wall faces INTO the room. Vibe Shift had an arcade cabinet standing a metre from a glass wall with its screen pointed at the glass, and a fridge against the west wall facing along it — a lit box aimed at nothing, which is why the owner read it as "an ATM shoved in sideways".
A screen faces its user. Not the camera. Three versions of this shipped before it was right: pointed at the camera, every developer in the building sat staring at a black slab; double-sided, the same panel was lit from both faces. Give the camera side a real back — shell, vents, a mount plate, a status LED — and put any state the player needs to read (a colour, a light bar) on an edge that is visible from every angle.
The moment a camera can orbit, every view-dependent cheat is dead. Anything that only works from one fixed angle — a billboard sprite, a one-sided prop, a screen turned to face the lens — has to be either genuinely correct or removed. Decide early whether the camera moves; it changes what you are allowed to fake.
6. Make the geometry fit
Check what a new structure passes through. A mezzanine went in above the whiteboards and cut straight through both of them, because the boards' height and the slab's height were decided in different files months apart. When you add anything large, walk the walls it crosses.
A label must measure its own text. Hard-code a font size and a long string runs off its own canvas: Vibe Shift signposted its server room "UILD SERVE" for a day. Measure, shrink to fit a real margin, and keep the plane's aspect equal to the canvas's or the type stretches.
7. Controls are relative to the CAMERA
If the player can rotate the camera, movement input must be transformed into the camera's basis — "up" means up the screen, and after a 90° swing that is a different world axis. Derive the basis from where the camera actually is, not from a stored yaw: a boom that is not directly behind the player leaves "forward" a constant few degrees off screen-up at every angle.
Screen-right is forward × up. Getting the cross product the other way mirrors the strafe axis and swaps left and right. This shipped, because the check only pressed forward — and forward is identical under both. Any test of a movement basis must exercise all four directions at several camera angles.
Do the transform in the renderer, never in the sim: a headless autopilot feeds the sim world-space directions, and rotating inside it silently corrupts every calibration run.
8. Feel: the frames that sell a hit
Hit-stop — a few frames of slowed time on a big moment — is the oldest trick in action games and the reason a hit connects instead of just resolving. Scale the sim and never the renderer: slowing the render loop turns a punchy beat into a stutter.
A screen impact layer in plain DOM — a tint flash on a good moment, a coloured vignette closing in on a bad one, speed lines and an FOV kick on a dash — costs the render loop nothing and needs no extra shader pass.
9. UI: a game, not a landing page
A hot gradient fill is a marketing call-to-action. Game UI is machined: a dark face, a light top lip and a dark bottom edge, a defined shape, an accent used as an edge and a glow rather than the whole surface, and a real pressed state. The owner's word for the gradient version was "vibe coded".
No emoji in menus. They land at whatever size and style the player's font stack decides and they read as a placeholder. Generate a real icon set — one tight style clause reused for every prompt so the set is consistent — and keep an emoji only as an onerror fallback.
Do not loading="lazy" inside a scrolling panel. The browser defers what it thinks is off-screen, which included the fourth column of every grid row. An icon set is kilobytes; load it.
10. Anybody on screen needs somewhere to be
An NPC that lerps to a random point and stops facing a wall reads as broken — the owner's words were "standing around doing nothing or look stuck". Give them:
- a nav grid baked from the same colliders the game collides against, so they can never path through something the player would bump into; - A\* with string pulling, so routes are short and look intentional; - a goal — a destination that means something, weighted so the crowd spreads out rather than queueing; - a facing on arrival: someone who walks to a window and then stares at the room has not really gone to the window; - something to do when they get there, and separation so they do not merge.
Test that every destination is reachable, for every combination of things the player can build. A goal behind a collider is an NPC that paths nowhere and stands still forever, and it is invisible in review because the goal list and the collider list live in different files and are each individually fine.
11. Audio: silence beats a loop
A looped room tone under a short repeated session stops reading as atmosphere and starts reading as a fault. The owner's note was "constant humming noise should be gone". Ambience earns its place by being intermittent, quiet, or attached to something on screen. Keep the bus and the build step; drop the content.
12. Design rules that outrank a counter
Never punish the core verb. A management game where hiring makes the game harder is broken however good every individual system is. Vibe Shift measured 314 collectibles emitted a night against 22 caught with a full team, while the review target rose with team size — hiring was strictly bad. Whatever the player's main growth action is, verify it is never a net loss.
A short event must never cost the rest of the session. Anything that takes something away either resolves on its own or is cheap to reach. A ten-second event with a ninety-second punishment is not a decision, it is a tax.
A bet must be able to lose. An advance you keep when you miss the terms is not a gamble, it is free money, and the terms printed on the card mean nothing.
Teach the calibration harness every new mechanic. An autopilot that does not know about an event it should react to makes every later measurement quietly understate itself.
13. Verify by PLAYING it, not by reading it
This is the one that matters most.
On the night this policy came from, two defects survived a green build, a green test suite and a careful read — and both fell out of a single scripted 90-second play-through: hiring made the game unwinnable, and the debug hotkeys collided with WASD so walking east printed money and walking south shipped the game. Later the same night the owner found a reversed strafe axis in under a minute that a passing automated check could never have caught.
So: drive the game headlessly through its real loop, on the GPU, and read the numbers it produces. Screenshot it and look at the screenshot. Orbit the camera and look from the other side. Then say plainly which parts you confirmed by play and which by reading the wiring.
And know your instrument's limits: a screenshot harness reported a quarter of an icon set as missing when it was only measuring before the images had decoded. Do not report a defect from one tool reading — confirm it a second way.
14. A load-bearing note can be wrong
Notes recorded as "load-bearing facts a future lane must not break" are read and obeyed. During this night one was written that said "monitors face the camera, not the bot — do not fix it". It was wrong within the hour, and left alone it would have instructed the next lane to reintroduce the bug on purpose.
When a decision is reversed, correct the note in the same change. A stale load-bearing fact is worse than none, because it carries authority.
Enforced at
- game-creator — builds to this bar on day one. A new 3D game arrives lit, grounded, oriented and playable with a camera the player can move. - game-improver — a fidelity pass is valid content-lane work; §3, §5 and §10 are where most existing games will fail first. - game-medic — §7, §12 and §13 are the shapes most of these defects take. - game-QA — verifies by playing (§13), and treats a scene that fails §5 (props or screens facing walls) or §10 (NPCs stuck or pathing through furniture) as a real finding, not a nitpick.