← Field NotesFile 07 // Preserved behaviorStudio services →
Transmission 007 // Published August 13, 2026

KEEP THE
COMIC.
LOSE THE
DRAG.

The original site fused Pixi, Three.js, and Ammo into one always-running page. The recovery did not begin by replacing everything. It began by deciding which behavior was identity, which work was invisible, and which risks could be isolated.

PUBLIC COMICPIXI PANEL SYSTEMFast default route
PRESERVED LABTHREE r84 + AMMOCustom behavior isolated
RELEASE LAYERREACT + SHOPIFYStory becomes an edition
Three runtime
r84
Physics
Ammo
Public default
Pixi
Lab step
1 / 60
Behavior
Preserved
01 // Freeze the contract

DO NOT UPGRADE THE MYSTERY.

The FPS lab depends on an old Three.js JSON character loader, Ammo rigid bodies, and custom character-to-physics alignment. A modern package version is not automatically a safer version when the visual and collision behavior are part of the work.

The exact Three.js r84 browser runtime is now served locally. The custom Ammo logic remains where it was. That makes the current behavior reproducible before a separate migration compares transforms, capsule position, grounded movement, and animation frame by frame.

This record does not claim that a newer Bullet or Ammo build fixes the original alignment gap. That question needs a controlled comparison—not a version-number guess.

02 // Separate the cost

THE COVER DOES NOT NEED THE WHOLE ENGINE.

The public comic only needs the 2D panel system for its default frame. Three.js, Ammo, and their loaders now stay outside that path unless the legacy character mode is explicitly requested. The physics lab remains available on its own route.

This keeps the recognizable comic layout and halftone language while removing 3D initialization from visitors who only want to read, inspect an edition, contact the studio, or enter the shop transition.

03 // Stabilize the loop

SPEND FRAMES ON PLAYER INTENT.

Long-session repairs target wasted work without redesigning the game. The lab pauses when the document is hidden, runs physics with a fixed 1/60-second step and bounded substeps, updates pointer raycasts when the pointer changes, and reuses hot-loop vectors instead of repeatedly feeding the JavaScript and WebAssembly heaps.

The rule is simple: preserve the feel first, remove avoidable work second, measure, and only then consider a library migration as its own project. That same recovery discipline applies to ambitious websites, prototypes, tools, and games that work but have become fragile or expensive to run.

04 // Read the diff

THE FIX WAS IN THE HANDOFF.

The recovered workspace, Firebase copy, and current site contain the same generated Ammo file, byte for byte. The custom work lives in the character integration: a capsule centered on its rigid-body origin, a visual mesh with a different pivot, a ground ray lowered by half the character height, terrain clamping, and a tripled jump impulse. The evidence points to an attempt to restore feet-to-ground alignment and the intended movement feel—not a rewrite of Bullet itself.

The old build exposes rigid bodies and capsule shapes but not btKinematicCharacterController or its ghost-object support. Those bindings were added to official Ammo later. That confirms a cleaner controller API became available, but it cannot infer where this character's mesh pivot belongs.

A future alignment pass should keep body coordinates 1:1 and apply a measured, constant visual offset from capsule center to mesh pivot. Dividing the world Y coordinate by two only looks correct at particular heights; it is not a general alignment rule.

The migration gate is side-by-side evidence: capsule bottom, visual feet, ground hit, slope behavior, jump apex, landing time, and a sustained heap/frame profile. Until those measurements match, the public lab keeps the original behavior.

Ammo copies
Same SHA-256
Missing binding
Kinematic controller
Original visual map
World Y ÷ 2
Migration target
Constant pivot offset