Skip to content

Releases

Office 3D v1.4.1

Choose a tag to compare

@oslook oslook released this 05 Nov 06:15
a38ccb7

Fixed

  • Ghost profiles in Office 3D and office_status (#1). Both discovery paths
    now exclude internal directories such as profiles/.deleted/, retired
    directories without profile identity markers, invalid profile names, and
    tombstoned profiles even when residual files remain. Valid offline profiles
    remain listed; default appears once, followed by sorted named profiles.
    Discovery stays scoped to the same HERMES_HOME used 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

Choose a tag to compare

@oslook oslook released this 05 Nov 06:15
5de8792

Added

  • Delegated subagent attribution. delegate_task children run as managed
    workers inside the gateway and record source='subagent' sessions in the
    TOP-LEVEL state.db, so a specialist desk (meo-finance, meo-coding, …)
    showed offline while its delegation was actively working β€” all activity lit
    up the default desk. The backend and office_status now parse each
    in-flight delegation's route (explicit profile task field, or the
    [profile] goal prefix specialist profiles already use) from
    async_delegations and light up the routed desk while live subagent
    sessions are active, with a new delegated_sessions count 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

Choose a tag to compare

@oslook oslook released this 05 Nov 06:15

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 by drawFrame and 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 β€”
    drawIsoBoxSoft and drawIsoDiscSoft β€” 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() and drawSofa() 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 in tests/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. drawHead now takes a facing direction, 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: +y faces 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 with passive: false and remove it on unmount, instead of React's passive
    delegated onWheel. 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 in rgb() 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 colours shade() 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
    ...
Read more