Repository navigation
Releases
Office 3D v1.4.1
Fixed
- Ghost profiles in Office 3D and
office_status(#1). Both discovery paths
now exclude internal directories such asprofiles/.deleted/, retired
directories without profile identity markers, invalid profile names, and
tombstoned profiles even when residual files remain. Valid offline profiles
remain listed;defaultappears once, followed by sorted named profiles.
Discovery stays scoped to the sameHERMES_HOMEused for status reads, using
Hermes identity helpers when available and compatible filtering on older releases. - Added regression coverage for both independently loaded discovery paths,
including canonical-helper and compatibility behavior, identity markers,
offline profiles, deletion markers, ordering, and directory scan errors.
Office 3D v1.4.0
Added
- Delegated subagent attribution.
delegate_taskchildren run as managed
workers inside the gateway and recordsource='subagent'sessions in the
TOP-LEVELstate.db, so a specialist desk (meo-finance, meo-coding, β¦)
showed offline while its delegation was actively working β all activity lit
up thedefaultdesk. The backend andoffice_statusnow parse each
in-flight delegation's route (explicitprofiletask field, or the
[profile]goal prefix specialist profiles already use) from
async_delegationsand light up the routed desk while live subagent
sessions are active, with a newdelegated_sessionscount per entry.
Display-only heuristic; aggregate-only reads; every failure degrades to
"no attribution". Historical subagent sessions are not re-attributed.
Office 3D v1.3.0
Added
- One global profile overview above the scene. Total / Working / Idle / Offline
use the complete backend response; Working is online with recent session activity,
Idle is online but not working, and Offline is not online. Hide-offline filters
only the scene and usage list, with an explicit βShowing N of Mβ scope notice. - Recorded-session usage semantics. Ranking and details label tokens/cost as sums
over recorded sessions, not today, this visit, or a guaranteed lifetime. Cost is
actual USD with estimated fallback. Details name the 90-second activity window,
unended sessions, and gateway-reported agents accurately. Selected details survive
hiding their offline profile, with a visible explanation. - Responsive page hierarchy and repeatable DOM verification. Duplicate bottom
stats/legend are removed; narrow screens stack the scene and inspectable usage,
while wide screens keep the side panel. Local-library React/Tailwind browser tests
cover partitions, filtering, selection, loading/error, and 320/390/1440px layouts
without new dependencies or claiming Electron integration. - Zoom and pan. The scene used to be locked to fit-the-canvas. β/Ctrl + scroll (or
a trackpad pinch, which browsers report as a ctrl-wheel) zooms about the pointer, so the
desk under the cursor stays put; drag pans; double-click or the % readout
returns to fit; β/+ step the zoom (0.4Γβ6Γ, shown live as a percentage). A plain
wheel is deliberately left alone, so the page still scrolls over the canvas. The
transform is a pure function (frameTransform) shared bydrawFrameand the zoom
handler, so a click is hit-tested against the exact projection the pixels came from at
any zoom β and a drag that starts on a desk no longer selects it. - The devices are drawn at the same fidelity as the people. Two new primitives β
drawIsoBoxSoftanddrawIsoDiscSoftβ give every face a gradient and light only the
top-front edges, replacing flat fills plus a hard 1px outline all the way round (that
outline was the "wireframe toy" look). On top of them: a monitor (plinth + gas neck +
bezel panel with the glass inset, plus an additive halo drawn behind the panel so the
light spills around it rather than washing over the screen), a keyboard and mouse on
the desk, a mug on its free end, a chair (plinth + post + cushion + soft
backrest), a stool, a sofa, and a coffee table with four legs and a top β
the teacups stand on it instead of sinking through it. - Pure layout functions and a headless harness.
deskLayout(),loungeLayout(),
sofaDims()anddrawSofa()keep every piece of geometry in one place, shared by the
drawing code and the tests. The harness asserts, across several scales: both hands lie
outside the torso silhouette, both arms reach downward on screen, there is no gap
between head and neck, and the sofa's world-space upholstery proportions. The sofa
browser regression independently ray-tests the frontmost box at sampled pixels to verify
both arm/back overlaps and hidden seat seams, with the saved pre-fix module as a failing
negative control, plus pixel-level head checks and colour-pipeline guards
(shade()must never return its input unchanged; every palette colour must respond).
Changed
-
Distinct, jointed working and tea poses. Pure
deskPose()/loungePose()keep
shoulder, elbow, wrist, head and held cup on one timeline, offset by stable profile
identity. Working keeps the approved off-centre workstation and rear-facing head;
fingers type smoothly out of phase with only subtle breathing (no whole-body bounce).
Tea sitting keeps hips/feet planted, visible separated shins and shoes, a relaxed
lap hand, and a 12-second rest/lift/sip-hold/lower cycle. The held cup stays in the
grasp and its rim stops at the lower lip, not through the face. -
Table cups do not animate. The three tea-table cups stay at exactly
tableZ + topH; the separate workstation mug also remains fixed on its desktop.
Only the sitter's own held cup moves. Real-browser regression tests compare tableware
pixels across times, with the former floating tableware as a failing negative control. -
Repeatable pose regression. Both themes, small/default/enlarged scales, phase
sweeps, finite joints, palm/key contact, cup/grasp/lip geometry, hand-depth pixels and
face gates are covered intests/pose-preview.py/tests/pose-regression.html.
Browser images are explicitly not Electron screenshots; the sofa oracle is unchanged. -
Unified low-poly semi-realistic figures. Shared human-only polygon primitives
now draw chamfered skull/jaw, geometric hair, restrained size-gated eyes and a
calibrated lower-lip line, broad shoulders/chest, tapered waist and seated pelvis,
tapered jointed limbs, polygon palms/grasp and shoes. Upper-left planar lighting
uses a small, deliberate set of faces, without black contour outlines or random
triangulation. Clothes retain profile identity; skin/hair/trousers/shoes remain
neutral in both themes. Furniture primitives and all layout/pose trajectories stay
unchanged, including right-sleeve partial masking, fixed tea-arm bones and static
tableware. Real-browser tests cover actual facet paths, jaw silhouette, feature
ownership, full-avatar eyes, lip/rim contact and small-scale rendering; saved sphere
and fixed-elbow builds remain failing negative controls. -
Heads face the right way in both poses.
drawHeadnow takes afacingdirection, in
screen space, because the two poses look in genuinely different directions: the desk
sitter faces the monitor (βy in world, which projects to up-right, 0.816/β0.577), so the
hair stays a full cap, no features are drawn, and only a sliver of cheek plus one ear
show β the back of the head; the lounge sitter faces the room (0.19, 0.98), so the face is
drawn. Features are emitted only when the face is turned toward the viewer
(facing[1] > 0.45); rear-facing heads retain a geometric hair mass with only
a small side cheek/ear plane. -
The sofa faces the room. Its backrest sits on the near (+y) edge:
+yfaces the
camera in this projection, so a backrest on the far edge turns the sofa around to face the
viewer with its back to the room. Its full-depth arms sit at the Β±x ends. The back has a
continuous rear upholstery panel; cushion divisions belong on the seat, not the rear. -
Lounge group placement. The whole group β stool ring + coffee table + sofa β is
anchored at the ZONE's centre instead of hanging off the work floor's left edge, which had
crammed it into the first third of an 11-wide zone and left the rest of the floor empty. -
Coffee table widened 1.4 β 2.0 so all three teacups stand on it with an even margin
instead of crowding the near edge.
Fixed
- Cancelable modifier-wheel zoom in React. Register the canvas wheel listener
natively withpassive: falseand remove it on unmount, instead of React's passive
delegatedonWheel. Ctrl/β wheel now prevents browser default zoom and updates the
scene exactly once; plain wheel remains untouched. A synchronous latest-view ref
preserves consecutive wheel updates before React commits. Real React/Chromium
DOM-event regressions cover cancellation, deltas, bursts, and cleanup/remount. - Tea sleeves no longer stretch. Both seated arms use fixed-length two-bone
geometry with continuous outward elbow poles: held arm 0.32/0.32, relaxed lap
arm 0.33/0.30 world units. The cup/wrist trajectory is unchanged; elbows follow
the lift instead of anchoring a telescoping forearm. Browser regression sweeps
four identities, both themes and three scales, checks seam continuity and
full-avatar eye pixels after cup/arm paint, and rejects the saved dirty
fixed-elbow implementation as a negative control. - A readable workstation right sleeve cap. Only a clipped outer upper-sleeve
patch crosses the torso edge; shoulder root, sitter, keyboard and monitor
coordinates are unchanged. The distant forearm stays behind the body. Pixel
tests confine changes to the cap while retaining keyboard/hand-depth guards.
Magenta right / cyan left diagnostic copies confirm sleeve attachment at the
unchanged shoulder and partial torso masking at default and enlarged scale.
Actual Canvas path endpoints are checked over 121 times Γ four identities Γ
three scales (5,808 arm segments), independently of pure pose-only assertions.
Full-scene eye checks classify dark cool eye ink (not exact antialiased RGB),
separate blinking frames, and require nonzero raster evidence at fit/enlarged zoom. hexToRgb()only understood#hex. Any colour already inrgb()form β e.g. the
sofa's base,shade(accent, -0.4)β silently skipped the entire shading chain, so every
face of that object came out the exact same colour and it rendered as a featureless slab
(shade('rgb(46, 92, 153)', -0.22)returned its input unchanged). It now parses
rgb()/rgba()too, so shading works for coloursshade()itself produced.- Sofa construction and occlusion. Comparing screen-top bounds of components at
different x/y was an invalid height rule and produced an unnecessarily tall 1.42 back.
The seat remains at 0.45, back top is 1.02, arm tops 0.70. The far arm is now painted
before the seat and back; only the near arm is painted after the back. Seat divisions are
painted before the opaque back so hidden lines cannot cut through it. False cushion
divisions/top rail on the rear panel were removed. The frame fits between the arms,
avoiding coincident solid surfaces. No people or lounge placement changed in this fix. - The typing pose. In this projection "forward" (βy) also moves a point up-and-right on
screen, so a sitter on the desk centre line put one hand inside their own torso silhouette
...