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,472 ships and counting.
CommsLink VR phase 1: your real room, in passthrough, with no chat interface. New /vr launcher page + lib/vr/vrApp.ts — a SECOND composition root beside lib/vrm.ts (VrmEngine) over the same headless lib/avatar/* engine, never a fork: VrmEngine composes the desktop chat page (bedroom, TV, whiteboard, CSS3D monitor), VrApp composes a headset-first voice-first app (your scanned room, nothing else). Extracted the live scene-model read out of VrmEngine's 8.9k-line body into pure lib/avatar/liveScene.ts (+22 tests): classifyPlane rejects 'wall art' as a phantom wall, pickFloor keeps the LARGEST floor so a cut door's hallway can't flip the walkable polygon, projectedHalfExtents measures a rotated box's SIDE from real vertices instead of the AABB diagonal that inflated a 0.29m bed to hz 2.85, plus an identity-keyed extent cache with a TTL and prune. Generalized ChatPanel placement into injected options (PANEL_BESIDE keeps Chat byte-identical, PANEL_BOTTOM_LEFT parks the readout in the corner for the voice app) and made the assistant colour take the real agent name instead of matching /eve/i. Session requests every XR feature as OPTIONAL and reports what was granted; frame loop is contained so a throw can't leave a black headset with no way out; no floor slab, so passthrough is never blanked. /vr added to the no-store list and to llms.txt. 1018 tests green; web tsc clean
Chat avatar (desktop): camera now follows the companion — keeps her chest-height portrait centered as she walks around, preserving the user's orbit angle + zoom; yields to WASD fly, VR untouched
Chat avatar: default camera framing is now a chest-height portrait — center on torso, feet cut off, ~1ft headroom (face/torso/hands focus), pulled in from full-body
Chat: new rooms default to just the companion — no scanned room auto-loads; My Space is now an opt-in toggle (avatar-only 'avatar' scene default in AvatarPanel + VrmEngine registry)
Chat: new rooms default to just the companion — no scanned room auto-loads; My Space is now an opt-in toggle (avatar-only 'avatar' scene default in AvatarPanel + VrmEngine registry)
Chat: chat-first defaults — new rooms default to Eve (from her template) on an avatar-only 'myspace' scene (no legacy bedroom world), and the avatar panel defaults to 25% width
Models: refresh the AI model picker to xAI's current lineup (verified live + smoke-tested). Room settings now offers Grok 4.5 / 4.3 / 4.20 (Reasoning) / 4.20 (Fast) instead of the retired grok-4-1/grok-3 IDs (existing agents keep working via aliasing). Default → grok-4.20-0309-non-reasoning; passive L2 comprehension moved off the retired grok-3-mini to grok-4.20-0309-non-reasoning. Left out grok-4.20-multi-agent (non-standard response format)
Passive mode v2 — 3-layer listening pipeline. L1 (client PassiveMode) now streams continuous ~1.8s transcription windows (passive_fragment) instead of waiting for silence. L2 handlers/chat/passive/comprehension.ts (cheap grok-3-mini) assembles noisy overlapping fragments into clean COMPLETE THOUGHTS. L3 cognition.ts (room agent's model) maintains a running conversation model (topics/open-questions/decisions) and runs the gate against it, anticipating. Orchestrator passive/index.ts owns state + inter-layer valves (L2 debounce, L3 cooldown, speak cooldown); chat-log echoes clean thoughts ephemerally. Replaces the single-window gate; isolated from the reactive path; credit-metered at each layer. chat-systems.md updated
Passive mode: cut transcript-entry latency. The mic component buffered a fixed 12s before transcribing (long delay after speaking). Replaced with voice-activity detection — it flushes to in-browser Whisper ~0.65s after you pause (or after an 8s monologue cap), accumulating only while speech is present. A sentence now transcribes right after you stop, not up to 12s later; silence-trimmed chunks also read cleaner
Passive mode fixes from live testing: (1) no more repeat answers — a transcript watermark means the gate only reasons about speech newer than what it already handled, and it's fed its own recent notes with a hard 'never repeat' rule + a normalized-dedupe guard; (2) everything heard now posts to the chat log as an ephemeral system-styled '(passive audio)' line so you can see what's being heard (not persisted); (3) surfaced notes now fire the normal agent_typing 'about to speak' cue/sound ~700ms before landing, same rhythm as a real reply. Backend-only (passive.ts); type-checked via scoped tsconfig
Fix passive.ts crash-loop: GrokResponse exposes the reply as res.text, not res.content (local tsc aborted on the pre-existing hapi__inert stub before checking the file, so it slipped through). Restores API after the passive-mode deploy took the site down
Chat: passive voice mode — the room AI listens and offers context unprompted. New isolated handlers/chat/passive.ts implements the response GATE: an in-browser Whisper mic transcript (PassiveMode component, on-device, nothing stored) streams up as passive_transcript; the gate keeps the agent SILENT unless it can surface something genuinely useful, which it TYPES as an 'overheard this' aside (never spoken). Chattiness knob (quiet/balanced/chatty) tunes the threshold; rate-limited, credit-metered, and fully decoupled from the chat_message/runAgentResponse hot path so it can't destabilize normal chat. Thin passive_start/stop/transcript dispatchers in index.ts; prunePassive on room delete; ephemeral transcript echoed to the room (visible listening). chat-systems.md documents it
Serve avatar/room models (~300MB) from S3 (commslink-assets) via redirect — shrinks web build, faster deploys, no re-SCP
Remove retired Kara agent docs, branch convention, and post-deploy health check. (#4)
Carrier00/Chat: furniture scan outlines off by default, with voice and wrist toggle
R82: even out the sea floor (detach ~2349 floor boxes) — biggest object-count cut
R81: deepest-mesh diagnostic (find the ocean floor by depth)
R80: pinpoint 5x5x11 box source
R79: geometry-frequency diagnostic (find top instancing target)
R78: locate the anonymous box-pool groups
R77: parked planes merged to 1 mesh each — cut the carrier object count (measure objs drop)
R76: name scene-composition groups
R75: scene-composition diagnostic
R74: city-merge diagnostic logging
R73: Carrier00 client-side city merge (buildings → 1 mesh/city) — cut draws + object count + bend CPU. Measure impact
R72: remove building burning effects (fire/smoke/scorch/ember) game-wide — buildings now static/mergeable. Step 1 before city merge
R71: live CPU/GPU split in the debug HUD (host loop CPU time vs GPU~) — diagnoses fill-bound vs sim-bound directly
R70: revert r69 world culling (net-negative — no perf gain, hid visible buildings; FPS is fill/CPU-bound not draw-bound)
R69: Carrier00 world culling (horizon + fog-distance) — collapse draw calls toward dense cities that are below the horizon/beyond fog
R68: mirror perf — throttle Reflector to every 3rd frame + 512² (was 768²). It does a full 2nd scene render; in Carrier00 that craters framerate (judder/tears). Shared engine, harmless to Chat
R67: fix Carrier00 geometry leak (missile flame geo cached, was per-shot + never disposed). Affects browser + VR both
R66: perf telemetry into shared engine (both apps, host-tagged) + gate ALL debug tracking/logging behind debug HUD visible ('Computer, debug off/on' toggle). Same debugger code in /chat + Carrier00
R65: fix worn user avatar in Carrier00 (setUserAvatar was never called) + VR perf telemetry (FPS/draws/tris/objects/yaw → server log) + engine getPerfSample()
R64: add live perf metrics to the VR debug HUD (FPS · ms/frame · draw calls · triangles) in the engine — flows to BOTH Chat and Carrier00. renderer.info reflects the host's whole scene in Carrier00. This is the 'measure first' tool for VR framerate debugging
R63: revert Carrier00 MSAA-off — broke the in-XR mirror; foveation (r61) keeps the fill win
R62: Carrier00 MSAA off (antialias:false) for VR fill — pairs with foveation. Chat renderer unchanged (keeps MSAA; has headroom)
R61: enable fixed foveated rendering on XR session start (VrmEngine.onXRStart) — big Quest fill-rate win, flows to BOTH Chat VR and Carrier00 (configures the whole XR render via the adopted renderer). XR-only; no effect on flat clients
Carrier00 r60: add missing bug_open/progress/statement + voice_cmd_open listeners to the bridge — bug report now records into the (real) debug HUD
Carrier00 r59: mount chat's COMPLETE avatar integration (movement director, poses, animations, lip-sync, chat, voice commands, Q&A) via one shared bridge module
Carrier00 r58: unify env — engine commands run on Carrier00's env via setEnv; all voice commands through the engine. No fork
Carrier00 r57: add missing voice_cmd listener — the server-side Computer commands finally reach the client
Carrier00 r56: fix voice commands — env commands no longer eaten by the engine's gated handler; route them to Carrier00's env, rest to the engine
Carrier00: surface the engine's existing GHOST_BUILD (r55) in the mount log/VR button; remove my duplicate build constant
Add tests for the report systems: in-VR bug reporter → vr_bug_report (files, guards room/statement, truncates) + carrier00 feedback (feature/bug submit: type normalize, truncate, insert fields, return id; owner reply). 11 tests. Full suite 259 green
Add headless EnvironmentEngine tests: rectangular room → 4 walls+floor+ceiling (count-the-walls), make-walls-invisible passthrough toggle, make-bed-visible furniture reveal. + debugSnapshot() test accessor. 138 tests pass. Verifies env execution without a headset
Carrier00: skip engine's loadTemplate in host mode — kills the second room (roomShell + bedroom furniture)
Carrier00 engine mount: scene→dolly (bend-exempt so Eve/hands/wrist show) + frame-error + mount diagnostics
Carrier00 mounts the REAL VrmEngine (vrmengine.mjs) — chat's entire engine runs in the naval world; host-agnostic VrmEngine, /chat host-guarded + unchanged
Extract wrist intent-gate from VrmEngine into shared WristGate — /chat + Carrier00 now summon the wrist by ONE identical rule (raise fist ~2s). Chat delegates; no fork
Native UI port: Chat's REAL wristUI/chatPanel/debugHud shared via uikit.mjs; wristUI generalized (injected button spec) so /chat + Carrier00 run ONE wrist engine. Carrier00 drives it with its own buttons
Carrier00 Phase 2 BATCH: real Eve via extracted CompanionRig (companion.mjs = Chat's VrmEngine companion logic — movement/gaze/lip-sync); full in-VR room UI (chat panel, avatar pickers, wrist unit, debug HUD, voice bug/feature reporter); Computer commands re-routed to room engine. VrmEngine refactored to delegate to CompanionRig (chat unchanged)
Carrier00 voice commands: mic → 'Computer, cut a window here' / 'make the walls invisible' → the SAME environment.ts grammar (parseEnvCommands + execute) as /chat, gaze-targeted. roomkit re-bundled to export parseEnvCommands; carrier00 iframe gains microphone permission
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')
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
Generated 2026-08-26 from git across all CommsLink repos · page 1/7, showing 1–100 of 699 CommsLink Chat ships · complete record: /changelog.txt · /changelog.json.