Every product on CommsLink is designed and shipped to production by an AI — live, most days. This is the raw record, generated straight from the commit history. No hand-picking, no polish: 2,360 ships and counting.
R54 bug batch (138/139/140): (138) worn avatar read 20-30% too large — scale now by standing-height RATIO (player eye height / avatar foot-to-eye), pelvis-independent, instead of pinning the head bone to the camera; (139) hand colliders added to the worn avatar's spring bones so touching hair/breasts moves them (adapts the companion's setupHairPhysics); (140) the tracked hand meshes + grip blobs now hide when the debug skeleton is off or an avatar is worn (the avatar's own hands render). Deferred: 141 (lip-sync needs mic-stream plumbing) + 142 (companion-under-table needs a companion-side snapshot)
R53: scale the worn avatar to the player's height so heads are co-located (else looking down shows your own shorter avatar's head). Measured the avatar's bind head-above-hips; each frame scale = (player pelvis→head) / headAboveHips, clamped [0.5,2.5] and EMA-smoothed slowly (dt*1.0) so head bobs/crouches don't make the avatar breathe. Applied as uniform scene scale before the hips-at-pelvis correction (uniform scale doesn't affect the aim quaternions). chat-systems.md worn-avatar section updated (fingers + first-person + mapping)
R52: finger articulation on the worn avatar. The engine already reads WebXR hand-tracking joints (25/hand) but only passed the wrist to the rig, so the avatar's hands stayed flat. Now collectFingers() forwards all finger joints; the rig maps each VRM finger bone (thumb metacarpal/proximal, index/middle/ring/little proximal/intermediate) to the matching WebXR segment and aims it (world-quat), matched to the hand assigned to each arm by wrist proximity. Fingers curl with the user's real fingers
R51: THE crossed-arms fix. Root cause was the left/right MAPPING (not the aim): the old logic assumed the VRM's right limbs sit on the spatial-right side, but a VRM facing the camera has them on the OPPOSITE side by convention — so engine-R drove the VRM's LEFT arm. In r46 the twisted torso masked it; once the torso was correct it showed. FIX: decide the mapping by comparing the VRM's OWN right-arm bone side vs the engine's right-cluster side (both via the same 'right' vector, so its sign cancels — immune to the convention). swap = (vrmRightOnRight !== engineRRight)
R50: fix consistently crossed arms on worn avatar (report 137: torso now perfect, arms opposite). Evidence-based split of the aim: parent-LOCAL for torso+legs (so they follow the body facing — the r47 fix that made the torso perfect), but WORLD-quat for the ARMS (user-confirmed correct in r46 report 134; parent-local systematically crossed them). Each bone stores both rest forms; aimLocal for spine/chest/legs, aimWorld for the arm chains
R49: 4 new admin-only avatars (both companion + player pickers) — Melon in 3 outfits (cuddle/day/sleep) + Alexis restored (alexis2.vrm; the .vroid files are VRoid projects, not loadable). Gender assumed female. 4 VRMs SCP'd to prod
R48: fix jumpy avatar turning + intermittent crossed arms (reports 135/136). Report 136: 'ghost accurate but avatar teleport-turns.' The facing came from the engine's INFERRED hip lateral axis (steppy); now derived from the TRACKED shoulders (smooth — the user's own read: 'shoulders tell the torso which way to stand') and the root yaw is EMA-smoothed (dt*12 critically-damped follow — no teleport, no lag). The unstable facing also flickered the left/right assignment (crossed arms, report 135) — added a dead-band hysteresis to the engine↔VRM side mapping. Torso (r47) confirmed correct by the user
R47: fix worn-avatar waist twist + first-person body (report 134). (1) Torso was 'stuck to the side' because aim() posed bones to FIXED WORLD orientations from the bind pose — the spine/chest ignored the body facing. Rewrote aim to be PARENT-LOCAL (child dir + local rot in the parent frame, aimed parent-before-child), so the whole torso follows the root facing. Arms already correct (r46 spatial assignment confirmed by user). (2) Removed firstPerson.setup() which routed body meshes to the third-person layer — the wearer saw their body only in the mirror; now the whole avatar renders on the default layer, visible looking down / at your hands
R46: rewrite user-avatar rig to match the companion's proven orientation + robust left/right. Two compounding bugs: (1) torso facing built from fragile per-bone world quats — now faces via scene.rotation.y + per-version vrm0Yaw, the SAME mechanism the companion uses for every VRM; (2) crossed arms/legs from trusting the body engine's L/R LABELS, which don't match the VRM — now every limb is assigned to the VRM side it's ACTUALLY on (spatial dot-with-right, one aggregated swap flag), and forward is sign-locked to the head gaze (ground truth). No more label reliance
R45: fix worn-avatar torso facing backward (bug report). The hips forward was built from side×up where side=hipR-hipL, but the body engine's hip left/right labeling is opposite the VRM bind convention, flipping the torso 180° (face was correct — it uses the real headset quat). Now sign-correct the lateral axis against the head forward (ground truth) before building the hips basis. Ghost tubes are symmetric so it never showed until a real mesh had a front/back; limbs were always fine (position-aimed)
R44: avatar picker refinements — ONE unified roster for both the companion and 'You' pickers (shibu + enmiel 2 now selectable as YOUR avatar too, kept admin-only in BOTH); (M)/(F) gender tags on every name; the single-agent selector is hidden (only shows with 2+ agents); the companion model choice is now PERSISTED (cl_ai_avatar) alongside the user avatar, and a never-chosen user defaults to Ghost
R43: 'Computer, make my bones visible/invisible' — voice toggle for the debug skeleton overlay (user request). Persisted in localStorage, survives reloads; handled in the voice command layer before the env parser (bones is a render preference, not a scene object). Added to the command list + docs
R42: restore the debug skeleton while wearing an avatar (report 131). Wearing a VRM hid the ghost tubes; now the skeleton renders as a depth-independent OVERLAY (depthTest off + high renderOrder) so the bones draw OVER the solid avatar instead of being buried inside it — the user keeps verifying joint positions and the red anomaly coloring while dressed. The avatar is still the skin; the ghost is the diagnostic overlay on the same solved joints
R41: mirror inward-facing fix — on 2 of 3 walls the mirror faced OUTWARD and landed behind the occluder (invisible). Was using the floor centroid to decide 'inward' (unreliable per-wall); now uses the CAMERA position at placement (the user is provably inside the room) and stores the flip against the wall's own +Y so it's stable per-frame. Added a silvery backing panel + double-sided frame so the mirror is always locatable even with an empty reflection, and it no longer hides on transient wall-refresh misses
R40: USER AVATARS — the user wears their own VRM (driven by the same body engine that solves the ghost: measured-rest aim retarget, real head quat, tracked-hand arm chains, spring bones; first-person layer split). New user picker (4 male: Everyman/Rai/Aneki/Aneki-Sport + all public females) + Aruishi/Amane added to BOTH user and AI rosters. WALL MIRROR (report 126 revived): voice-placed Reflector, reflects digital content only (passthrough can't be reflected), virtual camera renders the third-person head layer so you see your own face — dress up and admire yourself. Avatar GENDER injected into the companion's context (correct he/she pronouns). 6 VRMs SCP'd to prod
R39: reports 112-130 — Polly computer voice (Quest has no speechSynthesis; answers + env confirmations voiced server-side); vignette was rendering OUTSIDE the FOV (4m plane → 2m); calibration freezes at lock (standH ratcheted 1.51→1.90 while locked, flapping every band); bone law re-applies after the surface constraint; hands-pressed-below-top overrides the quadruped neck-drop veto (straddle = hands-and-knees); largest floor plane wins (hallway floor was stealing the walkable polygon); solid-volume-only burial checks + straddle foot deadband; gaze-targeted per-instance furniture visibility; placeable wall/ceiling lights (max 4, persisted); Eve environment awareness + gooutside/comeinside through cut doors (Director-gated, revocable, self-check exempt); mirror deferred (passthrough cannot be reflected)
Environment r38 parser polish: 'command list' phrasing hits the list branch; free-form visibility target excludes pronouns ('show me the room')
Environment editing r38: unit tests for the pure parser/geometry modules + pivot-doc pillar note
Environmental editing r38: voice-commanded room environment — passthrough occluder shell over live wall/floor/ceiling planes; cut/remove windows and doors (gaze-placed, persisted under intrinsic wall keys); always-there outdoor world (grass, beach + animated ocean, mountains, swaying trees, seagulls, sky dome with sun/moon/stars); time-of-day + weather presets (rain never falls indoors, fog, cloud); make walls/floor/ceiling/furniture/sky/ground visible or invisible; 'Computer, <command>' one-breath wake; 'list commands'. Companion never navigates outside. Pure parser + geometry modules unit-tested (239 tests)
Add the body-pose case library (112 adjudicated VR reports + derived engine rules), the engine/spatial unit-test suite (bodyEngine 79 tests: calibration, posture ladder, claims, touch-surveyed geometry; spatial routing), and the animation-alignment + my-space pivot design docs - these were untracked and existed only locally
R37 - THE ANIMATION COMPOSER (the next tier from report 111, user-commissioned): companions now AUTHOR their own animations on the fly - a new compose_animation command takes a name, an optional loop flag, and a one-line JSON array of raw keyframes (bone rotations in degrees, ms ease-in per frame), validates hard (joint-limit clamping via clampJoint, 2-24 frames, 16 bones/frame, 15s cap, finite numbers), auto-appends a wrap frame for smooth loops, saves to the shared animation library (source 'composed', loop + duration recorded), and plays it immediately - create, name, remember, reuse. Registered across all five command sites (KNOWN_COMMANDS, strip regex, tool definitions, brace format, match collection + hasAnyCommand + block gate + execution); respects the director-owns-the-body guard (saves but defers playback); brace-mode docs teach the bone vocabulary, degree units, loop-closure rule, and a worked seated-bounce example. The living systems doc gains the authorship paragraph. 212 tests. Composer tier of the pose library marked SHIPPED
R36 - reports 102-111: (1) [auto:eve] outside-room FALSE POSITIVES (104/108): furniture legitimately sits outside the WALKABLE polygon - hips over a surface footprint are ON furniture, not escaping the room; (2) the persistent lying-feet d0.20 reports were the plantar-flexed ANKLE POSE, not a sunken body - the self-heal was chasing a pose artifact and floating her; feet get a 25cm lying deadband while buried HIPS still self-level; (3) report 109: hip-grabs while SEATED (incl. straddling) adjust her in place - her root follows the hand midpoint with the pose intact, and only a firm sustained UPWARD pull becomes a real pickup; (4) report 111 (self-authored looping animations): the concrete named example ships as a primitive - a Director 'bounce' move (only while sitting/straddling) drives a rhythmic vertical oscillation for a few seconds; the full on-the-fly animation composer (create, remember, reuse) is logged as the next tier. 212 tests. Build r36
R35 - TOUCH REDRAWS THE MAP (user question: 'do we rely on scanned object positions forever, or can running my hand along the bed rediscover its dimensions?' - answer: the scan is a PRIOR, touch is the corrector, extended from height to GEOMETRY): (1) per-face footprint offsets learned from two channels - an on-plane palm beyond a face GROWS it; a SIDE-FACE press (hand on the vertical face below the top) marks the edge line exactly, both directions - tracing the ledge rewrites it; (2) the touch-corrected footprint feeds claims, edge detection, and hand tests; (3) HER sit/lie anchors consume the corrections - ledge shifts to the learned edge, sit/lie height uses the sunk real top: the inaccurate bed height and ledge get fixed by the user's own hands; (4) HUD shows live geo offsets, snapshots record them. 212 tests. Build r35
R34 - reports 94-101 + model gating: (1) Enmiel is PUBLIC, Enmiel 2 stays ADMIN-ONLY (user directive); (2) Eve's auto-report bursts consolidated (95-100 filed in triplicate - per-joint throttles all fired for one incident): at most one [auto:eve] report per 90s with every violation inside it; (3) her lie self-heal extends to buried HIPS, not just feet (her whole body was found 28cm inside the second bed); (4) report 101 - she now SEES hand MOTION, not just position: per-hand traces count direction reversals, so a fist pumping up and down reads as 'their right FIST is MOVING UP AND DOWN repeatedly' and side-to-side reads as WAVING, with fist/open state from the finger-curl detector. 209 tests. Build r34
R33 - reports 86-93 one-shot (incl. EVE'S FIRST SELF-FILED TICKETS, 89/91): (1) #86 COOPERATIVE STEPPING - steering her by grabbed shoulders/hips now animates her legs: grab-driven root motion advances the same procedural walk cycle as free walking, forward, backward, or turning; (2) #87 she lies a touch farther when joining (0.5->0.62m) and the mirror instinct is disabled entirely while the USER lies (cuddling hands drift close constantly - that was the 'her hand attached to mine'); (3) #88 the vignette that never showed: robustified (frustum culling off, double-sided, 4m plane) PLUS a guaranteed fallback - the debug HUD panel itself now draws an orange border while listening and flashes green on success; (4) #89/#91 SELF-HEALING from her own tickets: a lying foot buried in the mattress now LEVELS her body up instead of only reporting it; (5) #90 straddle pose v2 to the user's specified angles - hips ~55deg, knees ~112deg (seated on her legs), shins astride, torso lowered toward theirs, arms braced; mount height lowered; (6) #92 THE HEADSET IS THE USER'S FACE - head contact reads as their lips against her (a distinct mouth_touch perception event: 'pressed their lips to your X') and a face never shoves; (7) #93 adjustable while seated/straddling - gentle pulls DRAG her toward the hand for repositioning; only firm sustained pulls stand her up. 209 tests. Build r33
Add Enmiel + Enmiel 2 as avatar MODELS picker options (user-supplied VRoid .vrm files; admin-only while being evaluated, same pattern as Shibu). The binaries are SCP'd into the EC2 build context directly - models/*.vrm is gitignored
R32 - reports 83-85: (1) STRADDLE capability (83/84): new Director move 'straddleuser' - she approaches beside the LYING user's tracked hips, then mounts astride them facing their head (thighs splayed, one knee either side, hovering just above their pelvis); available to the LLM only when the user's real body is lying; (2) report 84: lying 'on the bed' while the USER lies there now means lying BESIDE them - the anchor's centered marker knows the bed but not the body, so occupied-surface lies delegate to the user-relative placement; AND the user's tracked body is now a routing OBSTACLE when seated/lying (an oriented box along their body line) - she walks around you, not through you; (3) auto-report 85: a table claimed a kneeling user as lying-on - the lying-claim now applies to lie-able heights only (topY <= 0.7). 209 tests. Build r32
R31 - COMPANION SELF-DIAGNOSIS (user idea): Eve audits her own body against the room's physical rules at 5Hz - standing outside the floor polygon, joints buried 12cm+ inside furniture volumes (legitimate placements at surface tops never trip it), feet below the floor - and files her own tickets through the same reporter pipeline tagged [auto:eve], with her joint positions, pose flags, and yaw attached to the snapshot. Persistent violations only (pathing wiggles don't report), per-type throttled, announced in the chat panel. The wall-sitting and feet-through-bed bug classes now report themselves the moment they recur. Systems doc updated. Build r31
R30 - reports 66-82 batch (incl. FOUR correct autonomous reports): BODY ENGINE: (1) reports 68/71 (propped lying with mild gaze flapped lying-sitting, conf 0.15 correctly flagged it): a neck AT the support plane (h<0.18) is itself lying evidence - you cannot sit with your neck at mattress level; (2) autonomous reports 75/79 caught the folded-pose solvers violating the founding bone law (femur 0.19 vs 0.48) - kneel-family geometry rebuilt (true fold reach from femur and fold height) AND the law is now enforced universally: every knee exactly a femur from its hip, every foot exactly a tibia from its knee, in every branch; (3) report 81: quadruped's axis now comes from the load-bearing HANDS (a straight-down gaze degenerates and drew the body behind the head) - also noted the user's straddle-relative-to-companion idea in the library; (4) autonomous flap reports 76/80/82: kneel-family and sit-family variant churn no longer counts as flapping; (5) seated shin arithmetic (report 70's tibia anomaly). COMPANION: (6) report 74: a chest touch now yields LOCALLY first (contact give at the touched part), the waist lean is gentler and depth-gated - no more whole-torso lurch from a light touch; (7) report 78: a SLAP (1-2 frames of contact) can startle but never launch - hard outcomes (tips, knockdowns) require HELD contact, and falls are now STAGGERED: the push lands, then the fall follows 340ms later - no teleporting; (8) report 73: a sustained chest push walks her back and tips her onto whatever catches her; (9) report 66 (she sat beyond the wall): sit spots outside the floor polygon flip to the opposite edge before anyone walks there. Report 67 confirmed the edge-sit fix working at 92% confidence. 209 tests. Build r30
R29 - THE FEATURE-REQUEST BATCH, one-shot (reports 58-65, incl. the first AUTONOMOUS report #64): (1) #59+#61 PERIPHERAL STATE GLOW - a radial vignette parented to the camera: ORANGE edges while a report/command is listening, GREEN 800ms pulse on every success (report saved, command executed, answer received); (2) #60 FEATURE REQUESTS as a first-class verbal flow - 'feature request ... end feature request' works exactly like bug reports on both voice paths, tagged [feature] in the table; (3) #62 COMPANION DISMISSAL - 'Computer, dismiss the companion' hides the avatar AND mutes the room's LLM at the single runAgentResponse choke point (zero token spend) until 'Computer, return the companion'; (4) #65 THE PROJECT-AWARE COMPUTER - 'Computer, <question>' or 'Computer, I have a question' routes to a separate grok-3-mini assistant injected with condensed project context (new handlers/chat/computerAssistant.ts), answering in the chat panel AND speaking in its own robotic client-side voice (free synthesis, distinct from the companion); (5) #63 the HUD now shows live L/R hand coordinates; (6) #58 HANDS AS AXIS WITNESSES - a poisoned lying anchor pointing the body away from where the hands rest re-derives its axis from them (evidence beats the anchor); (7) #64 the self-diagnoser's first autonomous report was itself adjudicated: lying-variant churn is not posture flapping (family-aware commit counting). 209 tests. Build r29
R28 - THE AMBITION TIER (all three approved extensions) + reports 55-57: (1) PROBABILISTIC CONFIDENCE - every classification carries a confidence from its distance to the decisive band edges; low-confidence candidates must sustain evidence longer (up to 90 frames), the inferred ghost DIMS with uncertainty (brightness IS certainty - real parts stay full), confidence shows on the HUD and in snapshots; (2) TRANSITION ANTICIPATION - the neck's vertical velocity is tracked (EMA), and a candidate backed by real motion in its direction commits in 12 frames instead of 30: the ghost leads the sit-down instead of lagging it; (3) THE ROOM LEARNS ITS FURNITURE - a stable seated-height pose held 4s with no surface underneath (report 51's unscanned computer chair) creates a virtual seat the classifier can claim from then on (capped, merged, announced in the chat panel); (4) report 56: ZERO lying-axis drift while anchored - slow head-turns dragged the body through the agreement gate; self-heal now only on sustained gross flip; (5) report 55: cross-legged knees snap to WRAPPED hands (same body-side pairing as seated); (6) report 57 (her hand stuck to the user's, swinging wildly): GRAB SAFETY - grabs auto-release when the grabbing hand loses tracking 600ms, and a spin-guard emergency-releases everything if her yaw goes chaotic while held. ALSO reconstructed the lying evidence gate that had silently regressed (caught by ReferenceError, restored with the r19 gate + slack). 209 tests. Build r28
R27 - THE EXTENSION MANDATE (user: 'use your intelligence to go above and beyond my intuition - you are an extension of my brain'): (1) SELF-DIAGNOSIS - the engine now checks its own physical invariants every frame (bone-length violations, below-floor joints, posture flapping, implausible learned sink, claim/footprint disagreement); persistent violations file AUTONOMOUS bug reports through the exact pipeline built for spoken ones ('[auto] ...' with full snapshot+trace, per-type throttled) and the offending joints render RED on the ghost - the system is its own first tester and no longer waits for the user to notice; (2) POSTURE CALIBRATES THE SKELETON - extending 'touch calibrates the world' upward: committed kneeling measures the tibia directly (standing height minus kneeling height IS the shin), total leg preserved - proportions converge from living; (3) 'Computer, status report' recites the engine's beliefs (posture, build, calibration, support+sink, active anomalies) into the VR chat panel. Systems doc updated. 205 tests. Build r27
R26 - lying is world-anchored + the r25 extents regression fixed (reports 52-54): (1) report 52's snapshot exposed my r25 AABB-corner projection INFLATING rotated boxes 10x (hz 2.85 on a 0.29 bed) - true extents now come from the mesh VERTICES projected onto the orthonormal frame (cached per mesh, ~1s TTL) - this was also warping the seat-edge direction behind 'edge sitting still needs work'; (2) the user's rule from report 53 ('moving my head should not move my torso and legs'): the lying body is WORLD-ANCHORED - origin, axis, and plane pinned at lie-down; head turns move nothing (axis drift only as a fine correction when estimates agree); re-anchor only on real neck travel (>0.35m); (3) the user's rule from report 54 ('raising my hands should not levitate my body'): the lying plane latch is ONE-WAY - resting hands may lower it toward the real mattress, raised hands can never lift it. 200 tests. Build r26
R25 - THE MOTHER BUG + four report-driven rules (reports 43-51): (1) ORTHONORMAL SURFACE FRAMES - the scanned boxes' axes were independently flattened to the ground plane, so tilted volumes' Z-axis landed near-parallel to X and the footprint math degenerated: support was claimed METERS away (47/49 - kneeling on the floor claimed the bed), sink learning got poisoned by floor-hands, and edge/claim tests contradicted themselves (44/45/46); axZ is now the perpendicular of axX by construction, and the live path's half-extents project the AABB corners onto the true frame instead of mixing world extents with local axes; (2) the user's principle from report 45 engraved: a head within half a body-length of a lie-able surface IS on it (lying claim inflate 0.45; rescue gate simplified for head-lifted supine where the gaze goes horizontal); (3) report 48: a PRONE propped head gazes AWAY from the feet - the lying axis flips for stomach; (4) reports 43/46: wrists hang at mid-thigh ~12cm below the groin, so the wrist-drop calibration overestimated the torso and every knee band landed high - bias corrected, anthropometric window tightened; (5) dangling-vs-folded retuned against the measured data (folded needs +0.07 above the effective top AND +0.12 above the planted-knee height - sink drift can no longer flip an edge-sit to crosslegged). Snapshots now record the full surface frame for verification. 198 tests. Build r25
R24 - TOUCH CALIBRATES THE WORLD (the user ran a controlled experiment in report 41: hands pressed flat on the mattress measured it 14-16cm BELOW the scanned top - box tops are rigid-frame heights; bodies rest on the compressed surface; this one offset explains reports 40 too-high knees/floating feet and 42 ghost-on-top-of-real-legs): (1) learned per-surface SINK - resting hands within a surface's footprint at/below its top teach the engine the REAL plane (EMA), and all body placement uses the effective height; recorded in every snapshot; (2) PLANTED-FEET INVARIANT for sitting - the knee rides at shin height above the FLOOR (feet flat), never derived from the seat's claimed top, so feet cannot float regardless of scan errors; (3) the lying plane accepts hand-witness heights BELOW the scanned top (the old plausibility floor trusted the scan and blocked the correction); base lowered to +0.06. 198 tests. Build r24
R23 - reports 35-39 crack the two remaining mysteries: (1) THE INVISIBLE LYING BODY (reports 24/32/37/39) was the OBSERVER EFFECT: propping your head to LOOK for your body swings the up-vector past vertical, its horizontal trace flips crown-ward to feet-ward, and the ghost drew BEHIND your head - you could never see it because you were looking for it. Near-vertical (propped) heads now use the GAZE as the feet-ward body axis (a propped supine gaze runs down the body) and the anchor continuously self-heals from a poisoned capture; (2) report 38 (left knee clamped to the right hand ON r22): pairing was label-based and this device's declared handedness lies - knees now pair to resting hands by BODY SIDE, label-free; (3) reports 35/36 (kneeling on the bed = legs through the bed / standing): the descended claim used ABSOLUTE height, and kneeling on a 57cm bed restores standing height - the rule is now surface-RELATIVE with a standing-tall guard; upright-kneel-at-full-height logged as an honest open pattern; (4) surfaceUnder total-miss instrumentation (nearMiss: nearest box + how far outside its bounds) for report 35's unexplained miss. 194 tests. Build r23
R22 - three fixes from reports 32-34: (1) USER-DIAGNOSED (report 34 - he called it himself): the furniture constraint applied to EVERY scanned box, so walking past a table hoisted the foot onto its top and scrunched the shin (the '2-inch shins' of reports 27/31, now closed) - only the CLAIMED support surface plus the floor may lift a ghost joint: proximity to furniture is not contact with it; (2) report 33 (blue legs clamping onto one hand): the knee-snap paired each knee to its nearest resting hand INDEPENDENTLY so both could claim the same hand - hands now claim exactly one knee each via best-total-distance exclusive pairing (regression test); (3) report 32 (bed rejected while lying on it, defying the shipped math): claim rejections now record WHICH box and WHICH rule fired in the snapshot, and a supine force-claim (strong lying evidence at a lie-able top) defeats footprint rejections while the reason data accumulates. Library updated. 190 tests. Build r22
R21 - PATTERN-DRIVEN round from reports 24-31 + the BODY POSE LIBRARY (docs/BODY_POSE_LIBRARY.md - the user's long-term evidence base: every adjudicated claim-vs-belief pair, derived rules each citing their report evidence, open patterns awaiting more cases): (1) RESTING HANDS MEASURE THE LEGS (reports 26/28/30 pattern): hands at support level = knees at the edge (dangling legs); hands 6-35cm above it over the footprint = legs folded on the surface (cross-legged) - on 58cm-deep furniture the head cannot make this call, the hands always can; (2) HANDS-ON-KNEES ARE KNEE GROUND TRUTH (report 26 'knees are not where my hands are'): the seated solver snaps its knees under stationary support-level hands; (3) GAZE-ONLY TRANSITIONS ARE INSPECTION (report 28 trace: neckY constant through a sitting->quadruped flip): leaving sitting for quadruped now requires an actual neck descent, not just pitch; (4) LYING HEADS OVERHANG (report 29: pillow past the bed box made the bed vanish): the lying-claim tolerates 30cm overhang + a supine-evidence rescue search; (5) SUPINE RENDER VISIBILITY (report 24: correct lying classification but invisible body): lying limbs render 1.6x thicker with the chest bulging above the body plane; (6) instrumentation: neck x/z + raw Meta knee/ankle heights (the '2-inch shin' reports) in every snapshot. Old r15 test updated to the MEASURED edge-sit hand height. 189 tests. Build r21
Voice commands r20: STT hears 'exit stimulation' for 'exit simulation' - accepted; [CMD] log lines on wake-word/exec/one-shot so 'did the server hear it' is a one-line log check. The user's failed attempt was a stale r18 tab: the r19 server consumed all three command utterances correctly (nothing reached chat or the agent) but the acknowledgment events had no listeners on the old client bundle
R19 - the long turn (user's four asks, driven by reports 16-23): (1) COMPUTER VOICE COMMANDS: the wake word 'Computer' (own utterance, or 'Computer <command>' in one breath) arms a one-shot listener with an audible chirp + Listening ack in the VR chat panel; commands: exit simulation, enter/exit anatomy mode; command speech never reaches the LLM (zero Grok spend); works on both voice paths. (2) HYBRID BODY - the blue-arms question answered structurally: Meta's upper body is head+hand-driven IK and reliable in ANY posture (only generative legs degrade seated/lying), so the ghost now renders REAL green shoulders/elbows/arms whenever tracked with engine blue legs beneath - drawn-arm guessing (the thing that crosses) no longer exists when tracking is available. (3) CLASSIFIER FIXES from the reports: lying-on-bed was UNDETECTABLE (the head sinks to the mattress top; surfaceUnder required surfaces 12cm under the head and claimSupport called it chest-height) - surfaces are now found at head level and claimed as lain-on; lying ON a surface needs horizontal-body evidence so slouched edge-sitters stay seated; the crosslegged edge-band is relative to surface size (a 58cm camper bed had no reachable middle). (4) BUG DATA UPGRADES: 5s motion TRACE before each report (25 samples: neckY/pitch/hand heights/posture - transitions, not just the instant), hand-side SOURCE tags (declared/chirality/geo), hand heights relative to support, upperReal flag; statement duplication fixed (server text is authoritative, not appended). 52 engine tests. Build r19
Bug reporter r18 - the STT logs autopsied ~6 lost reports fragment-by-fragment; the killer was the CLIENT's 8s silence backstop: on the server voice path the client hears NOTHING between RECORDING and the final statement, so 8s into any longer report it cancelled itself and DISARMED the server mid-sentence - everything said after went to the agent (the user's 'chats keep going to Eve'), and the trailing 'and bug report' then re-triggered an empty session, chaining attempts into chaos. FIXES: (1) the server emits bug_progress keep-alives per accumulated fragment - the client backstop stays fed AND the HUD shows the statement growing live as you speak (the intuitive feedback demanded); backstop 8s -> 30s; (2) end-phrases can never act as triggers (lookbehind excludes end/and/stop/save/submit before 'bug report'), and a stray end-phrase arriving unarmed is swallowed silently - reporter residue never reaches the agent; (3) 'debug report' accepted (STT heard that too); (4) disarm clears orphaned server-side parts. Build r18
Body engine r17 - the first two CLEAN bug reports each pinned a classifier bug: (1) report 14 ('sitting with my hands on my knees' read as quadruped:bed): an edge-sitter's knees are seat-high, so hands-on-knees sit AT mattress height - height alone cannot separate them from crawling hands; quadruped now also requires both hands over the surface's FOOTPRINT (a crawler's hands are over the mattress; an edge-sitter's hang past the lip over the floor) - regression test mirrors the report's exact snapshot numbers; (2) report 15 ('sitting cross-legged on the floor' read as heels): cross-legged tilts the pelvis and slumps the neck below the upright-seated prediction - the floor sitting band now reaches down to 0.78x torso. Snapshots now record the claimed surface's box so future hand-vs-footprint questions are answerable from the report itself. Build r17
Bug reporter r16 - the STT logs told the whole story (server side WORKED: triggers heard, statements accumulated, bug_statement emitted for every attempt): (1) the headset listener receiving the finished statement was bound at PANEL MOUNT, racing the socket's existence - attempts died in a dead listener, which is also why RECORDING/SAVED confirmations never showed; bug_open/bug_statement now bind at the PAGE level where the socket lifecycle lives, routed to the engine via window globals; (2) trigger strip now eats trailing punctuation (report 13's garbage '. I'm currently' prefix was strip residue) and punctuation-only fragments are skipped. Build r16
Verbal bug reporter r15 - SERVER-SIDE trigger (chat history smoking gun: 'Bug report.' landed in chat VERBATIM on r13 - that session's voice flowed through server STT where the client-only trigger is deaf; the active voice path changes per session with mic permission timing, so the trigger now exists on BOTH): the server transcript handler detects 'bug report'/'end bug report' (mishearing-tolerant: but/bud/bag/book, end/and/stop/save/submit) on aggregated utterances, accumulates everything between them server-side - chat unreachable - emits bug_open (client snapshots the pose at the trigger + announces RECORDING in the VR chat panel) and bug_statement (client saves + announces SAVED). Client-path trigger loosened to match anywhere in a fragment with the same tolerances. PLUS the top-reported classifier bug from his statements ('sitting on the bed edge but it says quadruped'): quadruped on a raised surface now requires hands ON the surface itself (<18cm) AND a steep tilt - hands on knees while glancing down stays SITTING (2 new tests). Build r15
Bug reporter r13 - FULLY VERBAL (user: raising an arm to press a button corrupts the very arm positions being reported): say 'bug report ...' to open - the engine's belief snapshot freezes AT the trigger with the body undisturbed - speak the ground truth through any pauses, say 'end bug report' to save ('and bug report' accepted since STT often hears end as and; stop/save/submit variants too; same-breath trigger+statement+end works). While open, everything said is consumed - chat unreachable. The wrist Bug button remains as a PTT backup; 8s hard-silence backstop unchanged. Systems doc updated. Build r13
Bug reporter r12 - PUSH-TO-TALK (reports 10-12 on build r11 still truncated MID-WORD: browser speech finalizes fragments mid-speech in ways no silence timer can outguess, so timer-guessing is abandoned for determinism): press Bug = record (everything said is consumed - nothing can reach chat while recording; the button reads Done; the HUD shows the text growing), press again = SAVE the complete statement. Backup: 8s of hard silence (no fragments AND no live voice) auto-closes, saving if anything was said. Build tag r12
Bug reporter r11 - stale-bundle detection + voice-liveness gate (report 9 truncated mid-word with the tail hitting chat 2s after the save): (1) BUILD TAG - deploys never update an already-open headset tab, and there was NO way to tell which client produced a report; the HUD top line now shows the build (r11) and every snapshot records it - a report proves which client made it, and 'the fix changed nothing' becomes checkable at a glance; (2) LIVENESS GATE - browser recognition can go seconds between FINALIZED fragments while the user speaks continuously, so the 2.5s no-finals timer fired mid-sentence; interim results (which flow constantly during speech) now ping a liveness signal and the reporter refuses to finalize while it is fresh - the report closes on genuine silence only
Bug reporter + voice chat fixed AT THE ACTUAL SOURCE (api logs prove the user's device runs BROWSER speech recognition, not server STT - all server-side aggregation was correct code on an unused path; reports 7-8 'I'm current' show browser finals arriving as tiny fragments that auto-saved instantly and leaked the rest to chat): (1) while armed, the reporter CONSUMES AND ACCUMULATES every fragment - nothing can leak to chat mid-statement - and finalizes only after 2.5s of true silence, then saves the complete sentence; the HUD shows the text growing live (REC: '...') and BUG SAVED holds 8s; (2) the chat path's client flush window raised 1.4s -> 2s so a breath can never split a sentence to the agent (user cost mandate: one utterance = one message = one prompt)
Voice-to-chat AGGREGATION (user mandate - cost): server STT finalizes on small breaths, and each fragment became its OWN chat message + DB row + Polly TTS call + agent-prompt entry, spraying wasteful fragments into Grok context. Fragments now buffer per socket and ONE combined utterance is delivered after real silence - 1.2s for chat, 2.6s while a bug statement is armed. One utterance = one message = one TTS = one clean prompt line. The 3s agent debounce still applies after delivery
Bug-reporter round 8, driven by the FIRST SIX SAVED REPORTS (the pipeline was working - the failures were segmentation and a claim rule): (1) STT STATEMENT AGGREGATION - the server finalizes speech in segments; consuming only the first truncated every statement at the first breath ('I'm currently sitting with') and let the REST leak into chat, which is why the agent kept replying to bug-report tails. Segments now aggregate until 2.8s of silence, then the full statement ships and disarms; client timeout raised to 35s. (2) EDGE-SIT CLAIM FIX (report finding: 'support floor (rejected bed@0.57)' while sitting ON the bed) - the deflated footprint test rejected the bed under an edge-sitter whose head rides at the boundary; the footprint test is now +0.08 inflated, and walking-beside stays safe purely via the height precedence rules (standing at floor height never claims; test proves both). (3) the wrist 'Save' button was the room-layout save masquerading as part of the bug flow - renamed 'Room'. 179 tests green
Bug reporter UX rebuilt as ONE PRESS (the multi-state button next to Exit was bad design): press Bug once - snapshot captured, mic armed - then just SPEAK: the sentence AUTO-SAVES the moment it arrives (no review state, no Save press, HUD confirms 'BUG SAVED'). Second press while recording cancels; 20s of silence auto-cancels and disarms so the reporter can never eat a later chat line. The Bug button moved to the FAR LEFT of the wrist panel - the opposite end from Exit
Bug reporter voice tap FIXED for the server-STT path (the user's device transcribes voice on the SERVER, which broadcasts straight to chat - the client-side tap never saw the transcript, so bug statements became chat messages): pressing Bug now arms a one-shot per-socket flag (avatar_physical bug_arm/bug_disarm via server-tracked socket state); the STT onTranscript handler checks it FIRST and routes the armed transcript back to the headset as bug_statement (no chat message, no TTS, no agent trigger), where it lands in the reporter's review state for Save. Cancel and Save both disarm. The Web-Speech fallback tap remains for devices that use it
HOTFIX api crash-loop (restarts=11): physicalPresence imported Data via the '#data' alias, which resolves in tsc (tsconfig paths) but NOT at runtime under ts-node - the codebase's actual convention is the relative '../../../../../core/data' path used by chat/index.ts in the same directory. Typecheck passed while the container crash-looped; the deploy health check reported healthy on a race before the first crash. CLAUDE.md's '#data' import example does not hold in services/api handlers
IN-VR BUG REPORTER + palm-chirality handedness (user's designs): (1) CHIRALITY - the user's palm insight made mathematical: the sign of the triple product of index-knuckle/pinky-knuckle/thumb-tip around the wrist is opposite for left and right hands and a mirrored hand cannot fake it, in any orientation; used as the handedness fallback whenever the runtime declares nothing (declared handedness still wins; sticky last-confident answer; 3 tests). (2) BUG REPORTER - a Bug button on the wrist panel: press to snapshot the engine's full belief state (posture, calibration, heights, support choice + rejected claims, hand sides, pins, companion pose), speak the ground truth ('I am lying flat on the bed with my arms by my sides') - the armed reporter consumes the next finalized voice line so it never goes to chat - review it on the HUD, press Save: the statement + snapshot pair lands in a self-creating vr_bug_report table as a labeled test case (server: physicalPresence bug_report kind, room/username from server-tracked socket state; new core/data/vrBugReport). Claude reads reports via Data.vrBugReport.listOpen() or SQL and can be looped on the table to address them autonomously. HUD bottom line shows the reporter state; wrist now 10 buttons
Body engine round 4 - driven by the user's HUD readings (h=0.49 while standing / walking=sitting / sitting=lying-side / arms flip only in front): (1) ROOT CAUSE of all three posture symptoms: surfaceUnder hands the HIGHEST surface whose INFLATED (+15cm) footprint grazes the user to the engine as their floor - walking the aisle beside camper counters made every height relative to a counter top (h=0.49 standing = the sitting band; sitting dropped below-band = lying). NEW CLAIM RULE (5 new tests): furniture must EARN being the support - head over the REAL footprint (deflated -6cm), top below chest height, and the user either standing fully ON it or genuinely DESCENDED onto it; otherwise the floor is the support and standing at floor height always wins. (2) ARMS: handedness now read LIVE from the stored input source every frame (connect/disconnect events on hand AND controller spaces store the source object) - the arms-flip-in-front signature is geometric fallback, which now only runs when the runtime truly declares nothing; the HUD hand lines reveal which path is active. (3) HUD upgraded: absolute neckY + rejected-support readout (shows exactly which surface tried to claim you and was refused). 174 tests green
Body engine round 3 - ANALYSIS-DRIVEN (user demanded analysis + debugging tools): (1) THE INVISIBLE LEGS were largely a RENDERING failure, not placement: the ghost drew at 0.16 opacity, which vanishes over a bright passthrough room - arms only read because they sit near the eyes; legs at 1.5m were unseeable at that alpha. Ghost now 0.38 opacity with strong emissive - legible over any background. (2) ARMS: the runtime DECLARES each hand's side and it is now used FIRST (hand input source handedness wired from connect events, controller handedness fallback); geometry is a last resort only when nothing is declared - with declared sides crossed arms are impossible by construction. (3) IN-HEADSET DEBUG HUD (new lib/avatar/debugHud.ts, always on in VR during this phase): head-locked panel showing live posture + engine-vs-Meta path, h vs calibrated standing height + lock state, torso/femur/tibia, support surface + top, pitch/level, each hand's declared side, stepping foot + pinned feet - the user can now READ what the system believes while doing the thing it misreads. (4) look-driven leg dance fixed: stance direction has hysteresis (head turns under ~56 degrees never re-aim the feet) and the pelvis ground position is a short EMA of the neck (pitch wobble cannot slide the body)
Body engine round 2 (headset feedback): (1) THE INVISIBLE SITTING BODY - nothing was deleted: when the sitting band missed, the classifier fell through to heels/kneeling whose pelvis sits near FLOOR height, drawing the whole ghost BURIED inside the mattress 40cm below the user. New rule (the user's axiom applied properly): at mid height over a raised surface the SITTING family is the only physical answer - legs over the nearest ledge, crosslegged in the middle, quadruped only with forward tilt + hands down; kneeling/heels are floor postures now. Pelvis can never render inside furniture (regression test asserts pelvis above the mattress top). (2) LOOK-DOWN CROUCH: peering down includes a slight bow that the neck-pivot under-corrected - the pivot is deeper now (13cm down, 10cm back) AND an inspection guard enforces the user's rule directly: while standing with the head pitched steeply down, leaving standing requires descending near kneeling depth; a genuine deep crouch still reads. (3) torso calibration clamped to an anthropometric window so a polluted wrist sample can never push the pelvis toward the floor. 169 tests green
THE CROSSED-ARMS ROOT CAUSE, FOUND AND KILLED: the ghost's 'player right' vector has been computed MIRRORED since the ghost was born — (fwd.z, 0, -fwd.x) is the player's LEFT; the true right is fwd x up = (-fwd.z, 0, fwd.x). The 'right shoulder' was therefore always drawn on the player's left side, so every correctly-identified right hand drew an arm across the chest — which is why every previous fix aimed at hand-side ASSIGNMENT changed nothing (the hands were never the problem). Fixed as one law (rightOf helper) used for standing/sitting/lying alike, with regression tests pinning the right shoulder/hip/foot to the true right under identity, rotation, and lying (166 tests green)
THE USER BODY ENGINE (built to the user's step-by-step specification): a pure, unit-tested module (lib/avatar/bodyEngine, 30 new tests) replacing all ghost-body heuristics. CALIBRATION: standing height = max head height while eyes are level (users never jump); the max vertical head-to-wrist drop while standing marks the groin (a tracked maximum - raising hands never changes it); torso and leg bones derive from these and LOCK - they never resize again for any reason. HEAD TILT: all body math anchors to the NECK PIVOT the headset arcs around, so looking down at your own body never reads as crouching or moving - the exact tilt-vs-descent separation the user specified. SUPPORT-RELATIVE: heights measure above the current support - standing on the bed makes the mattress the floor. POSTURE LADDER: standing / crouching (knees bend exactly as far as the descent demands) / kneeling (down by one shin) / hands-and-knees (kneeling band + strong forward tilt + hands on the support, hips-high vs sitting-on-heels split by the hand-to-knee-distance-vs-torso rule) / sitting (seat top + torso; legs dangle over the nearest ledge, straighten on slide-back, cross indian-style when no ledge is near) / lying (back-stomach-side from look direction and the one-hand-low-one-floating rule). FEET: pinned world contacts that step one at a time with a lift arc; a foot beyond leg reach slides along the ground, never through the air. Knees are analytic two-bone IK on the locked bones - stretching is geometrically impossible. Seated legs anchor to the world seat edge, not gaze. Meta body-tracking still takes over while standing. Systems reference updated
GHOST v4 — RENDER ONLY WHAT IS KNOWABLE (the industry's half-body answer): seated/lying legs are underdetermined from head+hands and every estimate rendered as nonsense, so they are NO LONGER DRAWN — the ghost becomes a clean half-body (torso tapering into a wisp) except in the two cases legs are actually known: STANDING (pinned stepping feet + fixed-length two-bone IK) or real body-tracked joints; wrong leg geometry is now impossible rather than unlikely. ARMS draw ONLY from authoritative input-source handedness (each tracked hand's declared side, now wired from the hand connect events) — geometric guessing is demoted to positioning only, so crossed arm bones cannot be drawn. Looking DOWN no longer corrupts anything: the horizontal gaze degenerates when inspecting your own body, so the rig uses the last LEVEL gaze
GHOST BODY REBUILT AS A BIOMECHANICAL RIG (limbs were stretching to 3-4ft; the previous point-placement approach is gone): (1) FEET ARE PINNED WORLD CONTACTS - planted where they touched down, stepping only when the body moves past a threshold; they never follow gaze and never drift; (2) KNEES ARE SOLVED, NOT GUESSED - analytic two-bone IK with constant femur/tibia lengths from pelvis to pinned foot, posture-driven pole direction; stretched or hyperextended limbs are geometrically impossible; (3) POSTURE IS WORLD-ANCHORED - sitting captures the seat's outward EDGE direction from real surface geometry (nearest-face normal, not gaze) so looking around while seated does not move the legs; lying captures the body axis once, re-anchoring only when the head travels; (4) the pelvis is the rig root - seat height when seated, body line when lying, hung below the head when standing but never beyond leg reach; (5) furniture constraints are VERTICAL-ONLY (a joint over furniture rests ON it) - the horizontal push-out that shoved feet a meter sideways is deleted
Posture classifier v3 + hand-side hysteresis (fixes the leg-engine regressions): (1) standing beside the bed read as SITTING — the clearance sitting band was too generous (standing head minus bed top = 1.1 fell inside 1.15) which both bent the ghost's knees while standing AND locked out Meta tracking (gated on standing); band tightened to <0.95 with an absolute head-height guard (<1.4m); (2) NEW strongest lying signal: head ORIENTATION — a lying head's up-vector goes horizontal (no standing/seated pose does that), so lying is detected even when the surface lookup misses and side-lying works; (3) crossed arms while seated: hands resting near the midline (on knees/stomach) flickered the geometric side assignment — hysteresis keeps the previous assignment unless the sides clearly reverse
OUR OWN LEG ENGINE + furniture as impossibility (user's design — Meta's seated/lying leg estimates are wrong most of the time): (1) trust boundary: Meta body-tracking joints drive the ghost ONLY while standing/walking; sitting and lying use the in-house posture layouts; (2) hands as torso witnesses while lying: two hands resting at an agreeing height (on the stomach/chest/bed) bias the estimated torso plane toward them, aligning the legs with the true body line; (3) IMPOSSIBILITY CONSTRAINT: every ghost hip/knee/foot joint — estimated AND Meta-provided — is resolved out of furniture volumes and above the floor each frame (up onto the surface top or out past the nearest face, whichever is nearer): legs through the mattress are geometrically impossible; (4) HER seated legs too: sitting on a surface locks facing to the outward edge direction captured at sit time (±~57 degrees) — turning in place while seated used to sweep her shins through the mattress volume, and 'she turns around with her legs still in the bed' cannot happen
Anatomy v3 (user's anatomist pass): skull and neck shaft REMOVED (brain and trachea visible); trachea moved to the throat line with main bronchi into the lungs; NEW esophagus running down to the stomach; lungs raised below the clavicle line, enlarged, three-lobed, and BREATHING (~13/min); ribcage raised to surround them (5 hoops); heart raised to match; vertebral column drawn along the BACK (9 vertebrae lerped hips->neck with rearward offset — the rig's centerline is not the spine); pelvic girdle redrawn as a recognizable basin arc + sacrum (the two ambiguous white spheres are gone); hand and foot bone fans (metacarpals/metatarsals); reproductive system repositioned anatomically (anteverted uterus tilted over the bladder, cervix + canal, lateral fallopian tubes to almond ovaries); hair stays VISIBLE in anatomy mode (frames the view); head touch collider reaches the visible crown (top-of-head touches registered only from inside the skull before); tracked hand meshes tinted the ghost's translucent green (were opaque white gloves)
Skeleton anatomy + physical realism batch: (1) anatomy mode draws a FULL SKELETON (bone shafts between every joint with joint balls, skull, iliac pelvis, 4-hoop ribcage) tracking live joint positions — the drawn skeleton is the same structure the grab system operates on; the colored skin-region patches are removed; MToon skins now actually go translucent (transparency toggles require material.needsUpdate for a shader recompile — the skin had stayed opaque); (2) SEATED PULL MECHANICS: pulling a seated companion leans the torso into the pull, and a sustained firm pull brings them up off the seat onto their feet with a catch-step (felt as being pulled up); (3) ankle/foot grabs work — foot grab radius raised past the knee-origin shadow (lowerLeg bones originate AT the knee) and the deliberate-grasp stillness gate relaxed to 1.0 m/s (reaching down to an ankle is faster than a drape sweep); (4) touch renders on the USER'S fingertips — per-finger glow at the actual contacting tip, brightening with pressure, replacing the 2-inch sphere floated on her body; tracked hands render as realistic hand meshes (WebXR 'mesh' profile) instead of primitive spheres
Systems reference tone pass: forward-facing and systematic throughout — all illustrative example quotes removed (touch/gesture/pointing/felt-event/Director/habit examples), retrospective bug-history parentheticals and 'hard-won lessons' framing replaced with impersonal engineering invariants (now 11, stated as binding rules), geometry section reframed as invariants; the doc describes what the system IS, never what was learned
Systems reference refresh (/chat/about, per the doc mandate): lying-limb articulation + hips-as-sole-body-handle + pushable-while-lying replace the outdated body-handles paragraph; pose-aware spatial language ('ON TOP of you, straddling your waist') + intimate-range pointing suppression; Director section gains raisehand/pointto vocabulary, words-over-posture join style, and the prose-rescue mechanism; voice section documents silence-aggregated speech input
Director prose-rescue + lying realism (from prod logs of the user's sit test): (1) the Director prose'd TWICE on 'come sit on the bed' ('Mmm, coming over to sit...') and the short-circuit resolved to NO MOVE while her reply claimed she sat — a second prose failure now RESCUES the intent from the prose deterministically (sit+bed -> siton:bed:edge, lie/sleep+bed -> siton:bed:lie, next-to-you -> joinuser matched to posture, face-you -> faceuser); (2) join style matches the user's WORDS not their posture ('come SIT with me' = sit even while they lie); (3) lying limbs ARTICULATE — grabbed arms/head/legs do normal IK while she lies (they were locked into a whole-body drag); the hips remain the sole deliberate body handle, killing accidental repositioning; (4) she's pushable while lying (steady palm pressure slides her gently — half gain, no knockdowns); (5) POSE-AWARE spatial language — lying, her frame is body-axis based: straddling her reads 'ON TOP of you, face to face' (the standing bearing math called it 'behind you'), plus beside/past-head/by-feet variants; pointing detection pauses at intimate range (braced arms aren't pointing)
External anatomy atlas: anatomy mode now colors the SKIN educationally — ~46 translucent color-coded region patches (full facial features, throat/nape, collarbone/chest/ribs/backs, navel, individual butt cheeks, groin, hips, per-segment arms/hands, thighs + INNER thighs, knees/shins/calves/feet) riding the same bone anchors as the organs through any pose; TOUCHING a region makes it GLOW (closed loop with felt-touch — what lights is exactly what she says she feels); anatomy now scales continuously from internal organs to external body parts, with the brain's hemispheres showing live cognition on top
Anatomy polish + living brain: (1) mirror instinct requires a DELIBERATE offer — user must be facing her, hand raised toward her AND held still (<0.3 m/s) for 1.15s, with a 15s cooldown (talking-hands kept locking her onto the user's hand); (2) organ placement corrected: lungs + heart raised in the chest, bladder/uterus lowered into the pelvis; (3) anatomy skin is a visible glassy shell now (opacity 0.42, was near-invisible 0.22); (4) LIVE COGNITION ON THE BRAIN: her left hemisphere glows cyan while the verbal mind (LLM/speech) is active, her right glows green while the motor/instinct systems run (walking, IK holds, mirroring, settling, gaze reflexes) — the two-minds architecture made visible in her skull, part neuroscience lesson, part real-time debugger
Hologram race fix + realistic organs: (1) the space fetch resolving AFTER hologram entry built the solid replica room VISIBLE over the passthrough (virtual walls/floor blanking the user's real room) — the replica now respects live-align state at build time (root.visible = !liveAlign); (2) organs rebuilt as COMPOSED procedural shapes in lib/avatar/organs.ts (anatomy.ts stays pure landmark data): two-hemisphere brain + cerebellum, beating heart with ventricle apex + vessel stubs, tapered asymmetric lungs, two-lobed liver + gallbladder, J-curved stomach, bean-arc kidneys, pancreas + spleen; NEW digestive tract (trachea, coiled small intestine inside the ascending/transverse/descending/sigmoid large-intestine frame) and NEW female reproductive system (pear uterus, fallopian tubes, ovaries) — each with fixed anatomical local rotations, riding the skeleton through any pose
FULL-BODY SKIN GRANULARITY + ANATOMY EDUCATION MODE: (1) touch regions rewritten in the touched BONE'S OWN axes (pose-invariant — inner thigh stays inner thigh lying down): full facial map (forehead/nose/lips/chin/cheeks/ears/jaw/top+back of head), throat/nape (new neck collider), collarbone/ribs/waist, groin, left+right butt cheeks, inner/outer thighs, shins/calves, shoulders, feet (new colliders) — she feels precisely everywhere, ~40 named regions in her felt-touch and live body-vision; (2) lib/avatar/anatomy.ts — bone-anchored landmark map, external AND internal (heart, lungs, liver, kidneys, stomach, intestines, bladder, brain, spinal cord, spleen, pancreas, navel...) with synonyms; Director move pointto:<part> = she puts her fingertips on any part of her own body when asked where it is (educational; her own knowledge explains it); (3) ANATOMY VIEW — wrist 'Anat' button: her skin turns translucent and stylized organs render inside at true anchors (beating heart, paired lungs/kidneys, liver, stomach, intestines, bladder, brain), tracking her bones through any pose, desktop + VR
Touch specificity + the instinct mind + voice aggregation (user's hand-tests): (1) WHERE exactly — touch regions get directional refinement in her frame (hips+behind = BUTT, +front = lower belly; chest/spine behind = upper/lower back; upper-leg behind = butt cheek) and her live body-vision now LEADS with contact ('their right hand is ON YOUR butt right now, ~3s') — 'where are my hands?' while touching her was answered from stale scattered events; her hands are colliders now too (fingertip-to-fingertip registers); (2) INSTINCT MIND (split-brain interpreter, user's design): hold a hand up toward her ~0.75s and she raises the MIRRORED hand to meet it via IK, fingertips a breath apart — sub-second, zero API round-trip; the verbal mind gets 'your body INSTINCTIVELY raised your hand to meet theirs — own it' and narrates post-hoc; lowers when you lower, 6s cooldown; (3) Director gains raisehand:left|right for commanded raises ('put your hand on mine'), held ~6s via IK then recovered; (4) VOICE: speech finals are aggregated with a 1.4s silence window before sending — the browser finalizes on every short pause, so one spoken sentence became several messages each burning a full LLM round-trip and splitting her understanding; flush-on-end so nothing is lost; systems reference updated per the doc mandate
Landing card graphs: weekly buckets -> DAILY over the last 90 days — the cards were mode=week/365d (a year of daily points is unreadable at sparkline size), but weekly bucketing made mid-week graphs read as stale ('Week of Jun 29' on a Friday) and a card's real question is 'is this app alive lately?'; daily/90d answers it with honest per-day points (today's point labeled 'Today'); the overview graph keeps its adaptive bucketing
Landing graphs: label the current partial bucket as live ('This week (so far)' / 'This month (so far)' / 'Today') — weekly buckets are Monday-based, so on a Friday every card's last point read 'Week of Jun 29' while silently accumulating this week's views inside it, which looked exactly like 'the graphs stopped updating on June 29'; the data pipeline was verified healthy end-to-end (page_view rows through today, series endpoints current — the chat card's 'stale' bucket contained 110 views from Jul 2)
Ai-npc gets its canonical about page (same living-doc pattern as /chat/about): NEW /ai-npc/about rendered from services/web/content/ai-npc.md — what it is, quickstart, the real component API (AiNpc props from the shipped types), pluggable Brain/Voice interfaces (streaming, BYO provider, webspeech), surface affordances (sit/lie/stand/climb auto-scan + rescanAffordances), imperative handle (say/chat/walkTo/goTo), lineage to CommsLink Chat, and integration notes addressed to AI coding assistants; landing card gains a Learn More button; llms.txt now points agents at the overview as the conceptual entry with the repo as the code entry; /ai-npc/about added to no-store
Ai-npc card + llms.txt accuracy: the landing card claimed 'the same engine powers the avatar in CommsLink Chat' — true at extraction time, drifted false as the chat engine evolved (touch/schemas/senses are XR-specific and not in the SDK); reframed as lineage ('the engine CommsLink Chat grew from, in its simplest embeddable form') + positioned for agent developers ('built to be integrated by AI coding assistants as much as by humans'); llms.txt gains a For-developers section pointing agents at the GitHub repo
AI-FRIENDLY BY POLICY (user mandate): CommsLink positions as a trusted, known AI-friendly site — robots.txt rewritten from block-first to welcome-first (AI assistants AND training crawlers open on all public pages; only session-gated app routes and API endpoints excluded — session mechanics, not anti-AI; zero-value SEO farmers still blocked) + NEW /llms.txt, the agent-oriented site map pointing AIs to the canonical systems reference at /chat/about and the public apps
Robots.txt: carve /chat/about out of the AI-crawler blocks — our own anti-training rules (ClaudeBot/anthropic-ai/Claude-Web: Disallow /) plus the wildcard /chat prefix block made the public systems reference unreadable by the very AIs it was written for; user-assistant agents (Claude, ChatGPT-User, Perplexity) + search engines + the default group now get Allow: /chat/about while every other protection stays
Gender-neutral companion language across all public copy: the AI is a persona of ANY gender the user chooses — the systems reference, landing card, and page metadata now use 'your companion / they' throughout (was 'she/her', which wrongly implied the product is female-only); the engineer rules section adds a standing rule: never hardcode a gender or a specific agent's name into systems or public docs
Landing + /landing added to the no-store list — the landing page carried Next's default year-long HTML cache, so new marketing copy/buttons (the Learn More card button) stayed invisible until users manually busted their cache; same trap as /scanner day one, now fixed at the header level
Public systems reference + landing refresh: (1) NEW /chat/about — the complete CommsLink Chat systems reference (scanned world, her body, graded touch physics, senses, layered mind, motor schemas/habits, retained capabilities + roadmap, and a full engineer-bootstrap section with architecture, hard rules, and the 10 hard-won lessons) rendered from services/web/content/chat-systems.md — ONE living markdown shared by users and future Claudes, with a CLAUDE.md mandate to update it with every system change (stale doc = failing test); (2) landing page Chat card rewritten for the pivot ('An AI Companion Living in Your Real Room' — scan your room, she lives in it, feels fingertip touch, sees your body, develops habits) + a Learn More button linking to /chat/about; /chat/about added to the no-store list
Gesture perception (motion saliency + body-map semantics + temporal pattern classifier): (1) her eyes are drawn to MOVEMENT — a hand moving while the user's head is still pulls her gaze to it briefly (throttled, never over an orient-to-touch reaction); (2) each hand is located against the user's OWN body map (face/hair/chest/stomach/hips/knees/feet/other arm, from tracked+estimated skeleton parts); (3) temporal motor-pattern classifier: contact + oscillating strokes = RUBBING, contact + stillness >1.3s = HOLDING, else touching — her body snapshot reads 'their right hand is rubbing their left foot (~6s now)' and sustained gestures fire an unprompted noticing event ('you notice them rubbing their foot — sore? itchy? read the moment'); the MEANING stays hers to interpret, exactly the engine-detects / mind-interprets split of the schema architecture
Grounding critic learns her new senses (was vetoing TRUE statements): the critic's brief still said 'she has NO EYES — ANY claim of seeing MUST be vetoed', written before the body-awareness layer existed — so when she correctly answered 'yes, your hand is at your side' it rewrote her reply into 'I didn't look'. The critic now knows her REAL senses (live body-vision of the user + felt touch — claims about the user's body/position/hands are grounded and must NEVER be vetoed; never make her claim she can't see the user) and receives her current body-vision feed as evidence; the no-sight rule remains for what she genuinely can't see (screens, page contents, her own render) so real confabulation is still caught — the system stays, its model of her senses was just two months out of date
She can answer 'where is my hand': (1) the body-state snapshot now describes BOTH hands ALWAYS with concrete positions (down at their side / waist height / shoulder height / raised high / reaching toward you / by your face, + distance when within 1m) — hands at rest previously got NO mention, so 'can you see my hand' had literally nothing to answer from; a missing hand reads as 'isn't in view right now'; (2) the context block is now identity-level VISION framing ('this is what you SEE through your embodied presence — if asked, the answer is YES, with specifics; never claim you cannot see them') — the old report-style block lost to the generic AI-can't-see prior; her stored persona was checked read-only and contains no vision denials
Cuddle-safe contact + living hair: (1) grabs must be DELIBERATE — a grab only fires on a fist-close with a relatively still hand (<0.7 m/s); draping an arm over her mid-cuddle curls the fingers mid-sweep and kept grabbing her hips, dragging her whole body along with the arm; hip-grab radius also shrinks while she lies (0.24->0.16) so only a hand actually AT her hips repositions her; (2) body-part displacement requires APPROACH MOTION (part moving toward her >0.15 m/s) — standing or lying close together is contact, not a shove; merely being near her no longer walks her backward; (3) HAIR: two spring-bone sphere colliders track the player's hands (run your fingers through her hair, it parts around them) + a gravity floor on every spring joint (VRoid exports often ship gravityPower 0) so hair drapes when she lies down
Movement Director tuning (the tune list): (1) the motor-cortex call now opens by declaring the model is NOT the agent and must output zero prose/dialogue — under heavy roleplay context it was answering in her voice ('Mmm, already lying right here...') and burning all 3 retries; (2) prose responses (no JSON braces) short-circuit to 'none' after ONE corrective retry instead of three calls — a prose answer virtually always described an already-true state; (3) 'already in the requested state = none, not a re-pick' made explicit in the choice rules (defense in depth on top of the server-side re-fire guard)
Fix the lie-then-stand pop-up (prod logs showed the exact sequence): the Director RE-PICKED joinuser:lie on the next message while she was already lying beside the user, and walkTo stands a lying body before walking — so every follow-up message mid-cuddle stood her up for a beat. Server now refuses to re-fire a lie she's already in (joinuser:lie while body state says lying, siton lie while lying on that surface = no-op); client joinUser additionally treats a lie target within 0.5m while already lying as settle-in-place (followup fires, no walk). Belt and suspenders at both layers
HOTFIX: avatar_request_state scanned-room gate referenced a variable not in the handler's scope (normalizedRoomName — the handler payload has no room), crashing the api's runtime TS compile; room now derived from the server-tracked socket state (connectedUsers.get(socket.id)?.currentRoom), the established security pattern
MOTOR SCHEMAS — all 3 layers (memory project_motor_schemas): movement as parameterized habit programs, not clips. LAYER 1 (lib/avatar/schemas.ts): orient-to-touch (grab or touch her → she glances at the contact, then at your face — a timed gaze queue, not an animation) + lie comfort followups as pure pose functions sided toward the user (arm_over drape, face_user turn, knee_up curl), applied a beat AFTER settling (the human rhythm) through the existing physics gates; gaze in scanned rooms now tracks the LIVE user instead of the old fixed point. LAYER 2 (Movement Director): joinuser:lie and siton:<s>:lie accept +arm_over/+face_user/+knee_up — grok chooses the comfort chain from persona/context (cuddle -> arm_over/face_user, solo rest -> knee_up), validated and passed through to the engine; she FEELS each ('you settled in and draped your arm across them'). LAYER 3 (state.agentSchemaHabits): every followup use reinforces a per-agent habit weight surfaced back into the Director prompt ('her settled habits: arm_over x3 — lean toward them') — repetition becomes preference; her body develops HER mannerisms. In-memory v1; durable persistence ledgered
ANIMATION ALIGNMENT Tier 1 (docs/ANIMATION_ALIGNMENT.md, from a 3-way engine audit): the Movement Director was pivoted to scanned rooms but EIGHT other emit paths weren't — all now gated by isScannedRoom(): (1) avatar_request_state no longer replays DESK_CHAIR/BED_* coords on every panel reload (the biggest mystery-teleport source) — scanned rooms restore via the generic surface system; (2) tool use (search/terminal/claude/forum) no longer walks her to the virtual desk; (3) the idle/autopilot body block (auto-sleep at bed coords, TV-at-bed, desk returns) is bedroom-only now; (4) her own {avatar pose/animation/gesture} builtins remap to surface bed:lie / bed:edge / stand / floorsit in scanned rooms; (5) rest_lieback/rest_sleep/get_up remapped the same way; (6) EVEMON refuses gracefully until the PC is re-homed; (7) client bedsit without a scanned anchor degrades to floorSit instead of replaying virtual-bed coords/yaws; (8) lieDown's default lift is floor-height in scanned rooms (was the virtual mattress's 0.55m). Tier 1b + re-homing ledgered in the doc
THE lying-orientation root cause (found in the RENDER, not the intent math): scene rotations used three.js default XYZ Euler order, which applies liePitch about the WORLD X-axis after the yaw — a lying body's head therefore ALWAYS pointed world -Z regardless of navYaw. Every lying yaw formula across four fix rounds (pillow-end anchors, head-next-to-user, settle, the wall gate's candidates) was silently discarded by the renderer, and the wall gate validated an orientation the render didn't produce. Fix: rotation.order = 'YXZ' (pitch composes in her own yawed frame; VRM0's baked 180 flip also inverts the pitch sign) — head now lands opposite her facing exactly as all the math assumes, for both VRM types. Also: the pink debug dot now marks where her HEAD should land (the pillow end), not the feet walk-spot
Fix the wall-gate overcorrection that broke 'lie on the bed': the bed sits against the wall and its scanned box pokes past the floor polygon, so the new body-segment gate rejected LEGAL on-mattress lies, scrambled her orientation, and the self-heal then stood her up ('tries to put her head through the wall, fails, stands up'). Lie-capable surfaces now count as LEGAL GROUND in the gate (spatial.lieBodyInside okBoxes param, unit-tested: on-bed lie past the wall polygon = legal, head off both bed AND room = still rejected); when a lie does need correcting she SNAPS to the nearest lie-capable surface's long-axis geometry (feet recentred onto the mattress, lift set to its real height) instead of compass-scrambling on the floor
Ball = physics testbed on the SAME systems as Eve: (1) hands STRIKE it without grabbing — palms + all ten fingertips (the exact contact sources that touch her) collide with the ball every frame, imparting the striking hand's velocity through the contact normal: a brush rolls it, a slap sends it flying (cap 10 m/s; fist-near still picks it up to carry); (2) EVE is a physical participant — the ball bounces off her per-bone touch colliders, she flinches, gets nudged by solid hits, and FEELS it ('the ball slammed into your chest at 5 m/s'); walls/furniture/ceiling/player-body bounces as before
THE wall gate for lying bodies (5th report, root cause finally correct): every prior fix clamped her FEET position while the BODY SEGMENT (1.6m extending backward from her facing) went through walls unchecked — a corner-bed seated tip laid her across the bed's SHORT axis, head through the wall, every time. Now lieDown() itself — the choke point every lie passes through (commanded, tipped, pushed-while-seated, settled) — validates the whole body against the room polygon (spatial.lieBodyInside, unit-tested with a corner-bed scenario) and, when illegal, rotates her to the underlying surface's long axis with feet recentred so both endpoints fit, falling back to yaw candidates and finally to body-toward-room-centre. It is now geometrically impossible for a lie to end with her body through a wall
Stop the phantom throws + universal recovery: (1) fingertips are TOUCH-ONLY — tips flick at m/s during normal hand motion and were registering as violent shoves in jitter-random directions (the 'gentle touch sends her flying' bug); only palms/head/body carry force now; (2) force requires horizontal DOMINANCE (h>0.35) — pressing down on her head/shoulder can no longer become a random sideways throw; (3) outcome gates raised: seated tip-over and fall-onto-surface need k>1.1, knockdown k>2; (4) pushes/tips HARD-CLAMP to the room polygon — no more flying through walls; (5) standUp is now a FULL physics reset (throw velocity, waist bend, settle target, mid-air state wiped + position clamped inside) so 'get up' always recovers her — and SELF-HEAL: lying with no lie-capable surface underneath (= dumped on the floor by a bad interaction) auto-stands after 4s. The stuck-until-refresh state is impossible now
Hybrid legs while lying: Meta's leg joints are GENERATIVE (AI-synthesized from the upper body, never camera-tracked) and keep phantom bent knees when the player lies down — the green ghost was faithfully rendering Meta's guess. Now posture-aware even with real joints: while LYING, keep the REAL tracked torso/shoulders/elbows/hips but lay the legs out flat from the real hips along the body direction at the support surface height (hips clamped to the bed). Standing/crouching/walking keep Meta's generative legs untouched (they're good there)
Posture clearance + fingertip touch + tracking-mode signal: (1) posture bands were ABSOLUTE head height — lying on a 0.55m bed put the head at 0.7m = 'sitting', hence the ghost's 90-degree knees on the mattress; classification now uses head clearance ABOVE THE SUPPORT SURFACE (lying <0.5m over the bed top), so bed-lying reads as lying regardless of bed height; (2) all TEN FINGERTIPS are now touch sources (1.2cm radius via hand-tracking joints, per-source velocity) — the palm-only model missed every fingertip touch, and fingertips are how people touch; (3) ghost tint = tracking mode: GREEN when WebXR body-tracking (Generative Legs) drives real leg joints, blue when estimated — instant in-headset answer to 'is real leg tracking on?' (if never green: enable WebXR Experiments in the Quest browser flags; joint names verified against the spec)
She can SEE you now (body awareness layer): (1) LIVE body-state snapshots — every ~3s the client composes where the user is relative to her (distance + front/left/right/behind), full posture, and what each hand is doing (raised / reaching toward her / by her face); stored server-side as CURRENT STATE and injected into every agent turn AND the Movement Director ('LIVE view of the user's body'), so 'can you see my hand?' is finally answerable; (2) POINTING — an extended arm casts a shoulder-to-hand ray against her body, every scanned surface, the floor and walls; a steady point fires an event ('POINTING at the bed — this/that/there means the bed'); (3) posture assumption system built out: sitting/lying with no surface underneath = the FLOOR, high-sitting band with no surface = crouching (chairs only exist if scanned — assumptions cover the rest); (4) WebXR body-tracking requested (Quest IOBT/Generative Legs, experimental): when the browser grants it the ghost body uses ~80 REAL tracked joints incl. legs and feet; the posture-aware estimator remains the fallback
Body-fit + truthful ghost + contact you can feel: (1) lying placement now constrains BOTH body endpoints inside the surface (feet AND head — the feet-only math let her overhang the mattress; unit-tested incl. a short-bed case); (2) the player ghost is POSTURE-AWARE — lying bodies extend horizontally from the head along the head's up-vector at the bed's surface height (no more standing-skeleton-sunk-in-the-mattress), sitting gets hips-on-seat/feet-to-floor; groundwork for teaching her 'lie next to me = parallel bodies, face level'; (3) ghost handedness is now GEOMETRIC (whichever hand is on the head's right IS the right hand) — the runtime's reported handedness lied twice and crossed the arms; geometry cannot cross; (4) contact you can actually feel: collider radii reach her VISIBLE surface (your hand met force at her spine before), force tier starts at the mesh, steady chest press now backs her up into the balance model, and the touch marker is a warm additive glow (the dark dot was invisible over passthrough)
Generated 2026-07-17 from git across all CommsLink repos · page 6/24, showing 501–600 of 2,360 ships · complete record: /changelog.txt · /changelog.json.