nishi world / craft / immersion roadmap

Craft: the immersion roadmap

Published · every rung below starts from an OPERATOR-OBSERVED defect, names the MEASURED root cause, and carries a falsifiable exit criterion and the instrument that decides it. Nothing here is scheduled on taste.

The rule this roadmap is built on. A defect the operator can see is worth more than a metric we chose ourselves — but only once it is converted into something an instrument can decide. “Her hair is awful” is not buildable; “strands are rigid lines parented to the head joint with no shading model and no dynamics” is. Each row below does that conversion, and says plainly where we have no ruler yet.

The five observed defects, converted

#What the operator seesMeasured root causeState
1“She bounces while stopped instead of breathing”The soft-tissue spring anchor is driven by mob_bob_q8, derived from GAIT PHASE. Gait phase does not zero at rest, so the drive persists when she stands still. There is no respiration driver in the engine at all — idle has never had its own signal.RED
2“She doesn't stop properly, she just stops the one motion she knows”One ANIM clip, played or not played. No locomotion state machine, no blend window, no deceleration — playback halts on the frame it happens to be on. The clip is also speed-independent, so cadence never matches travel.RED
3“Her hair is awful”HSTR ships ~2200 guide strands; the engine samples ~550 and draws them as rigid GL_LINES parented to the head joint. No strand shading model (so no anisotropic highlight), no dynamics, no thickness.RED
4“Her skin is awful”TEXM absent (asset-floor measured). Shading is procedural from the genome with no albedo/roughness/normal maps and no subsurface term — skin reads as plastic because it is being lit as plastic.RED
5“Her face is awful and no expressions”FACE and MORF both absent (asset-floor measured). The face is PAINTED from anthropometric ratios onto the head surface; with no blend shapes there is no mechanism for expression to exist.RED
The finding that reorders this list. The NPC minds ALREADY compute mood and reasons — mobmood and mobth are live doors, and the HUD prints them today (“soaked by rain”, “afraid of the dark”, “met you”). The expression DATA exists and drives nothing, because there is no face to put it on. That makes rung 5 not a cosmetic polish item but the single largest unwired capability in the character: we are computing an inner life and discarding it at the last millimetre. Same class as the proven-unwired harvest — build the consumer, not another producer.

Rungs, in build order, with exit criteria

Ordered by (visible impact) × (instrument already exists). A rung whose ruler we already own is cheaper and safer than one that needs a ruler built first, so those come earlier even when the defect is smaller.

rungthe actexit criterion (falsifiable)instrument
I1 · BreathingAdd a respiration driver: a slow sinusoid on chest + abdomen at 12–16 breaths/min (0.20–0.27 Hz), cross-faded against the gait drive as speed → 0, so the anchor is never unforced.At rest the recorder reads dominant chest frequency in 0.20–0.30 Hz and peak-to-peak 0.4–0.8 cm; gait-band (1.5–3.4 Hz) content at rest falls below 10% of its moving value.DRIVER SHIPPED + RULER BUILT 2026-08-02. The gait recorder samples 180 ticks = 3.0 s, but a 0.233 Hz breath has a 4.3 s period — less than one cycle, so its zero-crossing frequency was arithmetic noise and the criterion was unmeasurable by construction when written. ★ AN EXIT CRITERION IS ONLY REAL IF THE INSTRUMENT'S WINDOW CAN CONTAIN THE SIGNAL — Nyquist is the ceiling, the window is the floor. Now ?breath=1 banks 780 ticks = 13 s = 3.03 cycles — and the same measurement now lives as gate tooth T54, which runs natively on every ship: driver frequency by sign-flips (a 3-level staircase defeats naive zero-crossing), p2p in the criterion's own unit, and the integer-exact blend identity (still tick ⇒ anchor = breath). A dead idle-life refuses the ship with nobody watching. The browser probe remains as the visual cross-check; the gate is the autonomous one.

Two things that window forced into the open. (1) ★ It measures the ANCHOR, not the tissue-vs-bone offset: breath is a 0.233 Hz drive on a ~2.75 Hz spring, so the tissue tracks it quasi-statically and the relative offset is near zero by construction — the old probe would have scored ~0 and read as a dead driver, a false negative manufactured by the instrument. (2) Stillness is a precondition: an idle window recorded while she walks measures gait and would report it as breathing, so below 90% still ticks it prints INVALID rather than a number the window did not earn.
I2 · Poses & behaviors (operator-expanded 2026-08-02)The full pose PIPELINE, not just stopping: poses ingested as DATA (an NXA pose bank indexed by a stable id contract), behaviors = sequences of (pose, duration, condition) rows over smart objects, stacked into emergent patterns — put down a towel → lie → turn over → get up; a flirty walk-by as a walk variant with a target-relative channel. The advertisement system (C1) already stacks behaviors; poses are the missing limb. First rung SHIPPED: the mobpose door — the engine already computed sleep/flee/walk/idle states the renderer IGNORED (sleeping girls played the walk clip); the door publishes pose ids 0-5 (4/5 reserved for towel-chain behaviors) so the consumer and the coming pose bank build against a stable contract. Three-state locomotion with blend windows remains this rung's motion leg.Foot skate stays inside the banked 30–60 per-mille band through the transition, and the maximum per-tick joint delta at a state change is no larger than mid-clip — i.e. the seam is not detectable in the joint stream.foot-skate band BANKED; the per-tick delta tooth is new
I3 · Face + expressionsBake a FACE section, then a MORF section with a small FACS-style basis (brow raise/lower, lid, cheek, lip corner, jaw, nose). Drive the weights from mobmood + the strongest live mobth reason — the data is already there.Asset floor capability 4/7 → 6/7; a headless screenshot with mood forced to each extreme yields visibly distinct faces, decided by the perceptual oracle rather than by eye.asset-floor gate EXISTS (tooth per section); perceptual thresholds BANKED (CGVQM ≥87.5, CVVDP ≥9.68 JOD)
I4 · SkinAdd a TEXM section (albedo / roughness / normal) and a subsurface approximation. Prior SSS work already exists in the graphics lane — wire it, do not rebuild it.Capability → 7/7; measured against the banked pretty-vs-physical rule — scored on the PHYSICAL axis, never on “looks nicer”, since those two correlate at r = −0.46.asset-floor gate; realism-oracle thresholds BANKED
I5 · Hair — PRIORITY RAISED (operator flagged twice: "still really bad, breaks immersion")Strand shading first (anisotropic highlight, thickness), then strand dynamics using the O(1) containment design already researched — a sync-bone/inside-capsule test, no CCD and no self-collision.Simulated strand nodes stay under the measured web budget (60 fps only to ~4,000 nodes on WebGL with no compute); tip lag behind head motion measurable and stable, no strand crossing the scalp.node budget + do-not-build list BANKED in the deformables brief; tip-lag tooth is new
I6 · Per-side chestDrive uSB from the two DYNA anchors independently instead of one symmetric band, so left and right respond separately to turns and impacts.Under an asymmetric impulse the recorder shows the two sides diverging; today they cannot differ by construction.LEG 1 SHIPPED 2026-08-02: the shader field is now anchored per side — each side's weight falls off from ITS measured DYNA anchor over ITS declared influence radius (they meet at the midline by construction), replacing the symmetric height band; assets with no DYNA keep the old band as fallback. Leg 2 remaining: the TIME response still shares one spring, so the sides move together — splitting L/R springs is what lets an asymmetric impulse produce asymmetric motion, and that is the recorder's per-side channel criterion above.

Smoothness — measured, not argued

“Laggy and janky” is a tail claim, not an average-fps claim — a build can hold a 60 fps mean while one frame in twenty takes 40 ms, and mean fps is precisely the number that hides it. ?perf=1 measures the distribution: p50/p95/p99 of inter-frame delta (16.7 / 20 / 33.3 ms bands), jank rate against a rolling median (≤5%), worst single stall, and a separate 90 Hz VR verdict at 11.1 ms. Frame pacing must be read on real hardware — a software rasterizer's pacing is theatre. Two structural fixes already shipped on general grounds: localStorage saves moved off the fixed 5 s timer into idle callbacks (the signature of periodic jank), and the render buffer now sizes to full devicePixelRatio sharpness up to a per-class pixel budget (mobile 2.3 Mpx, desktop 8.3 Mpx — maximum resources that are logical for the device) with the adaptive quality controller finding the sustainable point beneath it. The HUD prints the resolved px: so a screenshot proves what actually rendered.

Touch, weather, gravity, layers (operator 2026-08-02 — the embodiment rungs)

rungthe askstate + path
E1 · weather-alive hairhair reacts to weather, not just idle bounceFIRST LEG SHIPPED 2026-08-02: wind sway rides the strand tip-weight, amplitude from the ORGAN's own weather door (rain = storm wind, clear = breeze), organ-tick time, per-lock phase so locks never move in unison. Next: wind as a spec row (per-world climate), gusts, rain-wet dampening of the spring constants.
E2 · real handsfirst-person hands that can touch their bodies, face, hairthe player's hand becomes the interaction end-effector: a hand mesh in the NXA lane + a TOUCH verb targeting body regions (the anatomy bands already name them), reactions through the thought ledger (“he touched my hair” = a real row driving mood + dialogue). Rides the pose bank + S2 verbs; the paired-anchor rung (S4) gives the two-body contact frame.
E3 · gravity everywhereeverything hangs and falls properly, clothes includedhair droop + hem sag from the O(1) containment design (deformables brief: a few hundred simulated vertices per garment, backstop capsules, NO CCD/self-collision). The strand pass gains gravity-curved rest shapes; the dress gains a hem solver within the researched web budget (60fps to ~4k nodes).
E4 · garment layeringclothes layer on top of each other properlylayer-by-construction (the shipping industry answer): each garment declares its LAYER rank + inflation offset over the body/underlayer — no runtime cloth-vs-cloth collision, layers cannot interpenetrate BY DESIGN. Slots into the NXA garment sections as data.

What we deliberately will NOT build

Named so nobody spends a week rediscovering it. Each is a researched conclusion, not an opinion.

Declared gaps — where we have no ruler

The beach engagement loop (operator 2026-08-02: situations, approach, conversation, contact)

The beach becomes a stage of SITUATIONS: the player, a woman, or a woman and her friends approach and engage — conversation and physical interaction, breeders-lineage but deeper. Researched and mapped to live organs in the social-interaction brief: S1 F-formation approach rings (integer geometry — proxemics distances, slot claiming, re-spacing; her friends claim adjacent slots via the bond graph) · S2 engage verbs both directions (she can initiate — P_CURI already draws her over) · S3 ledger-driven dialogue whose every line traces to a REAL thought/gossip row (the anti-hallucination tooth) · S4 paired interactions on a shared anchor (sit together, towel lie/turn-over on the reserved mobpose ids, hug at high bond, flirty walk-by). S1–S3 need no new render tech; S4 rides the pose bank.

The MetaHuman ruler — measured, standing, and the build order

The beyond-MetaHuman scorecard is a LIVE instrument, not a claim: nx_mhbench re-computes every axis verdict from on-disk artifacts on every call (a missing artifact DOWNGRADES its axis), split into 13 PARITY axes (what MetaHuman has) and 6 EXCEED axes (what our format has that MetaHuman structurally cannot: in-asset physics declarations, bit-determinism, procedural identity from one file, sovereignty — no engine lock, no license lock, 3.3 MB web delivery). Current reading: parity coverage 269‰ (0 HAVE / 7 PARTIAL / 6 GAP), EXCEED 2 HAVE. The honest section is the point: at head scale our face measures 79 against the cadaver oracle — head-shaped silhouette, featureless surface, no nose geometry — and the whole-body judge that reported 227 was flattering it 3×. The gap queue IS the build order: head-identity geometry (w9) → soft-tissue form (w9) → strand groom (w8) → facial rig (w8); light transport LAST, because it pays only once relief exists. Finish line, mechanical: no parity axis at GAP, ≥3 EXCEED axes HAVE, and the perceptual side-by-side number climbing — published every rung. Board: metahuman_board.json · lane: the oracle comparisons.

The ultimate rung: licensed digital twins (operator 2026-08-03)

The end-state this ladder climbs toward: synthesize the math of what makes a specific person beautiful, to the tiniest detail — a shape space where an individual is a point, beauty is a measured manifold region (the mhbench EXCEED axis), and a licensed subject can be digitally twinned so that (a) a cosmetic-surgery client sees whether a nose or breast outcome is reachable — an error bar in millimetres, not a promise — and (b) the subject can perform as a licensed actress in our worlds. There is a long industry history of both (licensed likenesses in games; surgical simulation), and a standing brief already in flight (digital twinning of human anatomy). Consent is structural: licensed subjects only — the same boundary that excluded non-consensual reference footage applies at every rung. Registered as a ruler row (digital-twin-likeness) with an honest reading of nothing measured yet: the resolution ladder runs NOW nothing → cm landmark fit → mm per-vertex twin error (SSM floor 0.17 mm) → sub-mm, where the before/after claim becomes an error bar.

Pass-1 campaign record (2026-08-03) — the marble loop's first battles, measured

cuttarget (from the pointing machine)frozen verdict
1 · nose-block raisenoseTip +7.3 mm (3.5× spread), localized shift peaked at the nose lineimproved; entangled with the eye-line error found later
2 · sub-eye widencheek_width −4.4 mm; 8% peaked at cheeks, ZERO at the eye line (IPD is the normalizer)cleared (−3.3, inside spread); mouth width +0.2 ≈ perfect
3 · eye line loweredforehead/bridge/nose/brow/lip ALL ~5 mm “low” by a near-constant — one root cause wearing five masks: the EYE ANCHOR sat high, the features never were lowbrow, bridge, lip cleared; nose +4.4 and forehead +6.5 remain

Score: significant errors 5 → 2, with brow/bridge/lip/mouth/cheek/chin now inside the reference spread against a professional subject. The campaign's exit finding: paint's ceiling is measured — the landmark detector carries its own anatomical prior and resists paint that contradicts the skull's shading (~30% purchase per unit, falling). Both residuals and the persistent narrow-long width cluster point at ONE object: the head mesh. Next rung: the skull-lane geometry reshape, judged frozen against the same table — exactly where the marble order said the campaign would arrive.

The calibration view — how the operator liar-kills (2026-08-03)

Every rung ships to the live game, and the operator's eye is a standing instrument in the loop. The levers, all on the live worlds:

leverwhat it showswhat to judge
/world/craft?review=1auto-framed portrait of the nearest girl, HUD prints wiring truth (dyn/chj/px/DYNA anchors/ANAT landmarks)overall read: alive or alien; anything the HUD claims that the frame contradicts is a LIAR to kill
?review=1&anat=1the measurement view: girl 0 every time, mood zeroed, gaze centered, blink off — the exact frozen state the pointing machine measuresgeometry ONLY: proportions, mass, feature positions — compare directly against reference stills; this is the frame the mm numbers come from
?review=1&record=1motion traces: chest offset, torso, gait drive + banked-band verdicts on the HUDphysics honesty: do the numbers match what your eye sees in motion
?perf=1frame-tail verdict (p50/p95/p99/jank) on YOUR hardwaresmoothness — the one number only the operator's GPU can produce
?ankle=NNdorsiflexion calibration lever (centirad)foot-ground read at different angles; report the NN that looks right

The loop: a rung ships → the pages update → the operator looks through these levers and kills what lies → the numbers and the verdicts go back into the next cut. Calibration feedback in plain words (“jaw still too narrow”, “nose right, chin long”) converts directly into pointing-machine targets.

Where this sits

The engine-side SOTA plan lives at /code/craft_sota_plan; the research this roadmap draws on is in perceptual realism oracles, biological plausibility and cloth and soft tissue. This page is the CHARACTER-IMMERSION view of that work, kept beside the game it describes.