RobotARme

Timeline
Login

Timeline

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

50 most recent check-ins

2026-10-07
03:34
Sweep part B (server 0.128.0): domain layer — sweep COMPLETE src/poses.lisp: pose-plist / apply-pose / normalize-quaternion shared by twin, area and scan-view poses; DEVICE poses are now guarded like the others (NaN/inf/absurd positions fall back, quaternion normalised, scale clamped) — the drift the sweep found; test-device-pose-sanitising. mito:find-dao for 17 single-row lookups (+ %find-binding x3). Migrations: *tables* + dolist, config:db-connect-args everywhere (incl. tests), releases:ensure-org-signing-key reused; robotarme.migrations no longer :uses mito (its MIGRATE was redefining mito:migrate). One make-signed-url, util:unix-now (8 copies), util:sha256-hex (db re-exports), secure-random for salts/nonces. Rules engine: ops table, %loose-equal, one safe parser, one priority comparator; device resolver = fleet resolver on one device. with-temp-directory macro (unique names). :import-from models in 7 packages (~250 prefixes). Dead code deleted; validate-glb / start-twin-generation / seed-test-data / create-photo-card split. bin/migrate run clean on the dev DB. Rove 1679; all 19 Node suites + Android unit tests green against the NEW server. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Leaf check-in: 7c2df5fd08 user: dkords tags: trunk
02:24
Sweep part A (server 0.127.0): cross-cutting + web refactors New src/fileio.lisp (atomic write-json-file / write-text-file / write-octets, read-json-file, run-mapper with per-call python lookup, json-last-line, u32le, glb-pack shared by twins + mesh-thumb). ttl-store struct under the five TTL stores, every B4 guarantee kept (one-shot TOTP take, expired device codes refused, atomic companion append, tts file eviction). Web: %ingest-scan-upload (POST /api/scans and /api/contribute were copies; test-contribute-upload added first), %begin-session (anti-fixation in one place), %with-session-user moved and used, one definition of username/email/password rules, valid-length-p, multipart helpers in web.lisp (duplicate stream reader gone), find-in-org, scan list serialised OUTSIDE *scan-lock*, long functions split (%capture-complete-worker, %twin-from-photo, %paginate/%sort-devices, %consume-backup-code), :: reach-ins exported. Review fix: %multipart-field ignores file parts (would have stored "#<STREAM>"). Writes of meta/metrics/boundaries/thumbnails/models now atomic. Rove 1671 (+58); all 17 Node suites green against the NEW code. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 4147a71ff3 user: dkords tags: trunk
2026-10-06
22:47
WebXR W4 (server 0.126.0): admin parity — completes the W1-W5 plan New xr-admin.js, all inside existing sections (menu stays 11): ORG: members list with remove (confirm; self refused; server refusals shown), edit profile, create org, leave (confirm), accept invite (code or URL, PHONE). ACCOUNT: API tokens (plaintext shown once, revoke), server status, and a LIVE language switch (relocalizeTree re-renders every label; MSDF only ever gets Latin; no reload). Device detail: RESOLVE RELEASE (read-only). Fixed on the way: devices.prev/next contained < > (MSDF crash on every device list open) and the org panel used a nonexistent colour (WebGL errors per frame). 77 keys added, 5 orphans removed (unused by any client). xr-admin 9/9; 13 other XR/areas suites, i18n-pages 16, web-tui 42, Android unit tests green; i18n PASS. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: a8a9f76a53 user: dkords tags: trunk
22:09
WebXR W3 (server 0.125.0): twin asset management New xr-assets.js, reached from the fleet scene (TWINS -> ASSETS; main menu kept at 11): asset list with thumbnails, detail with bindings (UNBIND each), BIND to hardware type / device / group (shows what it replaces), PREVIEW on a small table (HIDE disposes), DELETE with confirm. New assets still come from the phone companion or 2D /twins (no file picker in a headset). 57 en+ja keys. xr-assets 6/6; all 13 other XR/twins/areas suites green; i18n PASS. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 3d1245dd56 user: dkords tags: trunk
21:49
WebXR W2 (server 0.124.0): AREAS with live occupancy and trails New xr-areas.js: area list + detail (rooms, TRUE SIZE / AUTO-PLACED / ORIGIN), VIEW AREA composes member rooms in one frame like areas.html (member pose outer, up-axis inner; mesh rooms as line wireframe), TABLETOP map table (0.8 m, clipped at a scaled 2 m so it reads as a floor plan) <-> FULL SCALE (1:1, area floor on the user floor). Live headset markers from /occupancy (1 s poll, magenta, on top, eased, name label via the adaptive text helper) and breadcrumb trails (full / fading 60 s / short 8 s / off), client-side only. Poll stops + GPU freed on hide/leave. 30 en+ja keys. xr-areas 8/8; all 11 other XR/areas suites green; i18n PASS. Not yet judged in a headset. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 486e6eb2a5 user: dkords tags: trunk
21:28
WebXR W1 (server 0.123.0): SCANS section in the immersive app New xr-scans.js: scan gallery (6/page, thumbnails as textures, kind, status, pipeline), detail with VIEW IN ROOM / DELETE (confirm), and the PHONE INVITE QR (upload token -> /contribute/go) as the WebXR capture route. VIEW IN ROOM: photo/multiview GLB or a headset mesh as cyan line wireframe (/edges), saved /view correction + up axis applied as scan-lab does, TABLETOP (0.6 m) <-> FULL SCALE (1:1 on the floor), HIDE disposes. 53 en+ja keys; labels via catalog keys (no t() into MSDF). New suite tests/xr-scans.test.mjs 9/9; jp-layout 5, xr-releases 5, xr-devices 5, xr-widgets 7, xr-themes 14, xr-fleet 2, xr-account 4, xr-map 2, xr-deployments 3 all green; i18n PASS. Not yet judged in a headset. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 42814bd97f user: dkords tags: trunk
21:07
docs: WebXR parity re-audit (2026-10) + plan W1-W5; tools/parity-audit.py Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 1d66245f6a user: dkords tags: trunk
21:04
B6-B9 (server 0.122.0): transactions, Stripe retries, no leaked errors, one scan 404 B6: create-release is atomic (a failed blob write left a ready release with file-path ""; now rolls back and removes the partial file); org auto-creation and twin/area deletes are transactions. Test proven to fail without the transaction. B7: a known Stripe event that fails to apply is logged and answered 500 so Stripe retries (was swallowed + 200 = a payment silently lost). B8: util:user-facing-error / user-error for messages meant for clients (SSRF refusals, caps, area full, CSV problems); any other error is logged and answered generically - no socket/DNS internals echoed (SSRF oracle). Malformed CSV / bad UTF-8 are clear 400s. B9: :scan t on define-api-route (one parse, one org check, one 404) on 11 scan routes: DELETE .../view no longer says ok for any id; junk ids no longer 500; frames/complete 404 like their siblings. Rove 1613, CLI e2e 28/28, srcurl 2/2, areas 6, scan-lab 9, contribute 8, twins 11 (one cold-start timeout on the first run, 11/11 on rerun). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: ccf1e36ac1 user: dkords tags: trunk
19:48
CLI 0.48.0: define-cli-command, verb table, exit-code contract (4700 -> 4095 lines) - Exit codes follow docs/cli-grammar.md section 4 everywhere: api calls return the HTTP status; one table maps it (401->3, 403->4, 404->6, 409->5, other 4xx->1, 5xx/no answer->2). --json errors carry status. - define-cli-command binds args/flags/switches and derives the flag list; ~60 commands converted; define-cli-get -> %cli-show; with-api-result, parse-arg, %fmt-row and defmenu retired (%run-menu). - *cli-verbs* table drives main, dispatch and a GENERATED --help (fixes missing areas, token-rotate, devices update/template/resolve-release, groups preview). Unknown verb -> 64. - %cli-print-table, %tui-pause/ok/fail (failure fallbacks localized). - B10: --token read; ~/.config/robotarme/token (XDG); one artifact-type list in util shared with the server (wizard now offers all 18); device-auth-login now captures the session cookie (was a real bug); $ROBOTARME_SERVER honoured; 2FA users no longer fake a headless login. - CLI e2e 28/28 (+5), rove 1594, srcurl 2/2, i18n PASS. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: ccd1a43349 user: dkords tags: trunk
08:49
B5 (CLI 0.47.0): uploads send Bearer under ROBOTARME_TOKEN Every multipart upload (twins upload/card/thumbnail, scans upload/capture, releases upload --file) hand-built cookie + CSRF headers and never sent Authorization, so token auth failed. One %auth-headers now serves JSON and multipart; releases upload also accepts a token as "signed in". New CLI e2e test drives --file with ONLY a token — fails on the old headers, passes now (23/23). Sweep doc: B1-B5 marked fixed. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 70e8a84211 user: dkords tags: trunk
08:33
B4 (server 0.121.0): in-memory stores are thread-safe Device-auth, companion, TOTP-session, upload-token, TTS and check-in tables were plain hash tables on hunchentoot request threads. Now all :synchronized, and every multi-step operation (sweep, scan-for-code, companion append, confirm, take, cooldown) runs under the table's own lock. Two real races closed: a lost/duplicated companion event, and two logins from ONE TOTP session (consume is now a one-shot take the route must win). confirm-device-auth refuses expired codes. Rove 1594 incl. thread races (400 pushes, 8 consumers). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: bbae892b4c user: dkords tags: trunk
08:28
B3 (server 0.120.0): rate limiter keys on the real client, bounded, locked The limiter read (getf env :http-x-forwarded-for), which Clack never sets (headers are in :headers), so it always keyed on the socket peer: not spoofable as the sweep assumed, but behind a reverse proxy all users shared one 5/min login budget. client-ip now reads X-Forwarded-For only from a trusted proxy (ROBOTARME_TRUSTED_PROXIES, default loopback) and takes the LAST hop; tables are swept past 1000 keys and updated under a mutex. Rove 1584 incl. end-to-end both ways. Sweep doc corrected. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 2f1084b80c user: dkords tags: trunk
08:11
SECURITY B1+B2 (server 0.119.0): request bodies capped; secret compares constant-time B1: no request body had a size cap — the multipart parser spooled any upload to disk before a route could look, and both photo routes never measured what they wrote. New body-limit middleware (per route family, in front of session + parser; chunked bodies spooled to a capped temp file and replayed with a real length), %spool-upload that stops AT the cap, photos (25 MB) spooled before a scan exists so a refused upload leaves nothing behind; capture frames/video stop at their caps. B2: signed download/signature URLs compared HMACs with LOOP...ALWAYS (timing oracle). One util:constant-time-string= (from billing) now used there, for CSRF and for TOTP codes; the two verifiers share one body. Rove 1577. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 10263328f3 user: dkords tags: trunk
2026-10-05
22:22
docs: Common Lisp code sweep — findings, open bugs, macro/function plan Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 6640f9191b user: dkords tags: trunk
22:20
SECURITY: client numbers no longer go through the Lisp reader (server 0.118.0, CLI 0.46.0) READ-FROM-STRING ran on client strings with *READ-EVAL* at T, so "#.(...)" executed on the server from: area placements, device poses, scan views, twin width, camera height, and a device's own current_version (read by every comparison rule — reachable with a device token). Found by the code sweep. New robotarme.util:parse-number parses decimals without the reader (no eval, no symbol interning); all 8 server sites and 3 CLI sites use it; dead %numeric-string-p removed. Rove test proven to FAIL against the old code (payload executed) and pass with the fix. CLI version drift fixed. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: d9cb442d01 user: dkords tags: trunk
21:47
/areas: breadcrumb trails — full path (default), fading by age, short tail Each wearer's path is drawn as a ribbon on the floor from the eased marker position. Fading colours by age (magenta -> violet -> blue, 1 min); short keeps the last 8 s. Trails live in the page only — the server still holds just the latest pose. Mode remembered per browser; CLEAR TRAILS. Playwright live test now walks a path and checks full + short. en+ja. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: ef91a27b6c user: dkords tags: trunk
21:13
/areas: live marker visible inside headset rooms; top view is a floor plan The marker was depth-tested inside a closed room shell (walls + ceiling) and 22 cm across: invisible. Now drawn on top, larger, magenta (the mesh uses cyan/green/lilac/yellow), with a pulsing floor ring; TOP VIEW clips everything above 2 m. Verified with the headset's own pose on #535. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 26d85bf0bb user: dkords tags: trunk
08:08
androidxr 0.78.2: presence posts carry space=stage StageFrame.space was a Kotlin default, and the client Json does not encode defaults: every POST /api/presence lacked "space":"stage" and got a 400. Now explicit; a test checks the encoded body; failures log the HTTP code. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 96864a3c84 user: dkords tags: trunk
05:30
androidxr 0.78.1: presence stamp in wall-clock time; O1 diagnostics The head pose was stamped with the steady clock (time since boot) and the app compares against System.currentTimeMillis(), so every pose read as stale and none was posted. Logs the STAGE locate result and first write. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 15eadb80fa user: dkords tags: trunk
2026-10-04
05:08
R34 O1: live headset position on the area floor plan (server 0.117.0, app 0.78.0) - server: POST/DELETE /api/presence (STAGE pose + device, in memory, 10 s, org-scoped); GET /api/areas/:id/occupancy places it via any member mesh the same headset captured; GET /api/scans/:id/frame - headset: Settings "Share my position on floor plans" (default off); native viewer writes head STAGE pose, activity posts it at 2 Hz and deletes on exit; green dot on the hand crown while sharing; MESH OVERLAY of a mesh this headset captured registers to STAGE - web /areas: live head + heading cone, TOP VIEW toggle - tests: rove presence/occupancy (1542 ok), Playwright live marker with its own fixture account, JVM PresenceTest; en+ja keys Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 651f3f730b user: dkords tags: trunk
04:42
androidxr 0.77.0: crown THEME is an on/off toggle THEME OFF / THEME ON instead of cycling themes: hide the backdrop while looking at a model, bring it back as it was (MIXED vs FULL remembered). Choosing which theme stays in Settings. en+ja keys; toggle unit-tested. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 1eeaac6f45 user: dkords tags: trunk
04:30
androidxr 0.76.1: Settings scrolls; mesh row no longer under the nav rail Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 57d6c4e517 user: dkords tags: trunk
2026-10-03
23:52
androidxr 0.76.0: crown side pebbles press — swept contact HIDE / THEME (the 3 and 9 o'clock pebbles) never registered: a fingertip crossing a 3 cm target can step over the 1.6 cm contact sphere between tracking samples. Passing through the widget plane within its radius now counts; contact radius r+8 mm. Hover/deny logged per pebble. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 13b32374f1 user: dkords tags: trunk
23:34
androidxr 0.75.0: crown text, colour and tracking-loss — the known fixes Re-applied lessons the HD viewer hand menu and nosebar already taught: - label text sized from the view's real height in onDraw + fit to width (fixed px text was huge, overflowed, and cut off at the centre line) - colour via an EMISSIVE matcap over black (unlit vertex colours were lit anyway -> pastel); pure-JVM PNG writer; Khronos-valid - hands lost 1.5 s -> re-configure perception and re-acquire handles (crown vanished until the screen was re-entered) Field rules written into androidxr/airspace/README.md. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: b88ced7960 user: dkords tags: trunk
22:44
androidxr 0.74.0: crown colours + label layout - Baked vertex colours converted sRGB->linear (glTF COLOR_0 is linear); pebbles rendered pastel with flattened shading. - Labels go OUTWARD from the ring (above / beside), never inward over the hand, which the headset draws over them. - Ring 9 cm toward the eye (was 6) to clear curled fingers. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: ae96709e2d user: dkords tags: trunk
19:54
androidxr 0.73.0: crown gets hands; HD viewer hand crown + real back - Hand tracking was configured only when the classic hand menu was on, so the 0.72.0 crown never saw a hand. Now on when either is on. - HD viewer: the lone triangle (read as PLAY) becomes a three-button crown: BACK (arrow with shaft), RESET (room back to where it opened), LOCK (freeze pinch gestures). Edge-triggered presses, shaded discs. The overlay is built whenever hands are tracked; FPS digits stay behind the setting. - Leaving the viewer explicitly brings MainActivity forward (it lives in its own task, so the system chose where you landed). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 37b046f681 user: dkords tags: trunk
10:03
androidxr 0.72.0: AiRspace P1 — hand crown on the SCAN screen CrownLogic (reveal/arming/smoothing/gaze, 9 tests) + SceneCore SpatialCrown with runtime GLBs; contextual SCAN / VIEW-HIDE / SCALE / THEME pebbles; setting defaults ON, classic hand button is the fallback. ThemeActions shared with Settings. en+ja keys. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 06b8cee9d1 user: dkords tags: trunk
09:31
androidxr: :airspace prototype module, P0 (core + glb, 23 tests) Android XR-first AiRspace prototype per owner direction; plan revised in docs/airspace-ui-review.md. Not wired into the app yet. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 95d1e5de08 user: dkords tags: trunk
09:11
docs: AiRspace UI review and adoption proposal Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 0f7bd19afd user: dkords tags: trunk
07:51
docs: R34 occupancy plan (room-mesh M5 hand-off); M4 marked built Area frame; localization by STAGE (capturing headset), persisted device anchor, anchor sharing, and printed QR/markers for robots and devices — all read as present in the Puck runtime; pose channel as an R2 check-in field; top-down wireframe minimap; opt-in, org-scoped headset positions; O1-O5. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 41811df4e5 user: dkords tags: trunk
07:50
Room mesh M4: headset meshes as wireframe in the headset's scan room and areas (server 0.116.0, app 0.71.0) SceneCore draws only what a glTF describes, so the server now serves /api/scans/:id/edges?style=lines|ribbons — every unique edge once in the mesh's own label colours, unlit: LINES (mode 1) over the original vertices (scan #406: 1.7 MB, same as the mesh) or crossed-quad ribbons (20 MB, a fallback for a renderer that does not draw LINES). Cached beside room.glb. Headset: Scan Room and Areas load the wireframe for headset meshes; a new Experimental setting MESH ROOMS: LINES / RIBBONS / SOLID picks the style (en/ja) — LINES is unproven on SceneCore (glTF POINTS were invisible), so the first look on the device decides the default. Tests: Rove test-mesh-scan-edges-glb (LINES mode/indices/vertices, ribbons valid triangles, HTTP + cache) — 1528 pass; the LINES file renders as coloured edges in three.js. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 39337fbd6a user: dkords tags: trunk
07:43
Room mesh M4: headset meshes place themselves in areas; true size (server 0.115.0, app 0.70.0) - Headset: opens the STAGE reference space when offered (the Puck offers it) and writes each saved mesh's stage pose into room_mesh.json as frame {space, p, q} for the centred, floor-at-0 mesh. - App: uploads it with a device id (8-byte SHA-256 of "robotarme:"+ANDROID_ID), since a STAGE frame only means something on the headset that recorded it. - Server: /api/scans/mesh keeps a validated frame + device in meta.json. A mesh joining an area that already holds a mesh from the same headset is posed area←A·(stage←A)⁻¹·stage←B with method "anchor" (overridable); other headsets and malformed frames fall back to the usual suggested pose. Area members now carry kind and metric (mesh = true size). - Web areas page: TRUE SIZE and AUTO-PLACED badges (en/ja). - Headset areas: when the oversized room is a headset mesh, the warning says the photo rooms are the ones to resize. Tests: Rove test-headset-meshes-from-one-headset-place-themselves (pose and turn as measured; other headset / bad frame not anchored; metric flag) — 1519 pass; MeshMetaTest 2; areas-web 5/5. Fixed on the way: a dropped frame is stored as JSON null and read back as NIL, which LISTP accepted. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 7737aad256 user: dkords tags: trunk
07:29
Room mesh §4.3: snap labelled surfaces to planes (app 0.69.0) SnapToPlanes fits the runtime's floor/ceiling/wall-labelled geometry to planes and pulls vertices within 6 cm onto them — floors and ceilings to their dominant heights (1 cm histogram, 5 cm window), walls to vertical planes clustered by facing (6°) and distance (6 cm), area-weighted; corner vertices claimed by two walls stay put. Applied to what is DRAWN (live scan: a copy; overlay: on load); the saved/uploaded mesh stays raw. xr_flags snap=0 off. Scan #406 on the Puck: 1 floor, 3 ceiling, 8 wall planes; 23,699 of 55,403 vertices flattened. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 072fe7d4a3 user: dkords tags: trunk
2026-10-02
16:56
xr-themes test: set Matrix before asserting it is the default The fixture account keeps the last theme the per-theme tests wrote; with robotsrule last in the list the "default" check failed unless a Rove run had reseeded the account in between. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> check-in: b6fc042257 user: dkords tags: trunk
16:55
Robots Rule: one footfall per stride, only within 4 m (app 0.68.0) The first bake fired 751 Grunt steps and 152 Hulk treads in a 60 s loop — about 15 a second. Now a step per full stride from Grunts within 4 m and a Hulk tread per stride: 187 + 76, a few approaching marches instead of a clatter. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> check-in: 9c25d024ed user: dkords tags: trunk
09:11
Floor adjust in 25 cm steps; plane tracking diagnostics (app 0.67.0) No session so far has tracked a FLOOR plane, so the ground is always the head-1.3 guess and 10 cm presses were a slow way to fix a metre. Steps are 0.25 m; the watcher logs what plane tracking sees at 10/20/30 s. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> check-in: 232ab60c8b user: dkords tags: trunk
09:10
Sign font: Press Start 2P (8-bit) on web and in the bake Owner 2026-10-02: the sign title "looks awful. Go with a very 8bit font". xr-branding.js uses Press Start 2P for the sign regardless of the UI font preference (0.26 / 0.11 m); the baker draws the same face with smoothing off and nearest magnification so the blocks stay crisp. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> check-in: 78521e1264 user: dkords tags: trunk
08:13
Theme survives an Activity recreate; debug floor no longer lingers (app 0.66.0) Switching the language recreates the activity, which makes a new XR session and disposes the old one's entities; the theme cache then handed the new session a dead entity ("Entity … is already disposed") and the surroundings vanished — read as a crash (owner 2026-10-02; the process never died). The cache is now per session (cleared when it changes) and a DisposedException evicts and reloads once. Reproduced with a font-scale recreate: clean. The --es themeFloor debug value stayed set in the running process after my test and forced the owner's themes to -2 m all evening; it now applies to that one launch only. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> check-in: 55df6363da user: dkords tags: trunk
06:54
Theme floor: moved in the model file, plus a FLOOR adjust (app 0.65.0) Measured on the Puck (debug --es themeFloor): a SpatialEnvironment IGNORES its geometry entity's pose — Battlezone's horizon did not move between entity y = -1 and -2 — which is why the ground stayed at chest/neck height: the baked ground (y = 0) sits at the ActivitySpace origin, ~0.4–0.9 m below the head. GlbShift rewrites the GLB root node's translation before GltfModel.create, and that DOES move it (horizon drops between -1 and -2). Floor height = tracked FLOOR plane (polled 2 s, then watched 30 s and re-applied) else head - 1.3 m, plus the person's own FLOOR ▼/▲ adjustment in Settings (0.1 m steps, per headset, re-applies live). Device + plane tracking is now configured before any height is read (the first read came back "DeviceTrackingMode is set to DISABLED"). Models cached per theme and 5 cm floor step. One log line reports every height source. GlbShiftTest: a shifted theme keeps a 4-byte-aligned JSON chunk, the header length, the binary chunk byte-for-byte, and shifts add up. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> check-in: 376642b9df user: dkords tags: trunk
05:04
Owner notes: all edges by default, readout in view, logo upright (app 0.64.0) - Mesh scans "look a lot worse… a minimalist artist sketching with a pencil": the M2 crease filter. ALL edges is the default again on the headset and in the web scan lab (WireframeGeometry), keeping the even-width lines and hidden-line removal; `edges=feature` (xr_flags / debug.robotarme.edges) keeps the sketch look. Line capacity raised to 130k edges. - Scan readout "way outside the FOV, far to the upper left": now lower middle. - The sign's logo "on its back… a rotating rectangle": the model is authored face-up; xr-branding.js stands it up (rotation.x = 90°), web and bake. - The lost upload was the adb reverse tunnel, gone after the headset dropped off adb and came back; restored by hand (adb reverse tcp:8000 tcp:8000). On the Puck: meshview draws 106,615 of 106,615 edges + occluders at 72 fps; HUD visible lower-middle; scan-lab 9/9, theme-bake 26/26. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> check-in: 24b376f4a1 user: dkords tags: trunk
03:05
Room mesh M2: screen-width lines, label-aware creases, capture HUD (app 0.63.0) - meshline.vert/frag: each feature edge is six LineVertex (both ends + side) expanded in the vertex shader to a constant ~3 px soft ribbon from its own projected direction (near-plane clipped) — no more 1 px LINE_LIST shimmer. Own pipeline/layout (mvp + viewport/width push constants) and buffers; occluders stay OvlVertex in the mesh buffer, drawn from 0. - Creases on surfaces the runtime labels floor/ceiling/wall need > 60° (mesh noise on a wall is not a line); other creases 30°, borders kept. - MESH SCAN HUD: floor area (m², FLOOR-labelled triangles) as 7-seg digits over a bar to 30 m², green when the area has not grown for 12 s. - Fixed the occluder pipeline using destroyed shader modules (-13): it gets fresh ones. On the Puck: meshview 46,973 verts -> 9,911 of 106,615 edges, 209k occluder verts, 72 fps; live scan HUD shows digits + bar. Plane rectangles (§4.3 proper) remain open: they need plane tracking in the native viewer. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> check-in: 160be595c7 user: dkords tags: trunk
02:52
docs: encrypted scan storage plan (plan only) Per-org wrapped keys, chunked AES-256-GCM files streamed on the way out, scan registry moved to the DB, pipelines run in a private scratch, in-place migration, key backup. Six milestones. Nothing built. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> check-in: 48aa5b12aa user: dkords tags: trunk
02:50
Android XR 0.62.0: theme floor keeps watching for the FLOOR plane The 2 s wait at apply often misses the plane; a 30 s background watch now re-places the environment on the plane when it arrives (>8 cm off), and the last plane height seen seeds the next apply instead of the head-1.3 guess. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> check-in: 71a737c64d user: dkords tags: trunk
02:36
Themes: owner's headset notes fixed + "Robots Rule" theme (server 0.114.0, app 0.61.0) Web (the source): - Reagent, Petrichor, Mercado, Glade divided the time by 1000 — xr-app passes seconds — so they ran a thousand times too slowly everywhere ("no motion", "no tree"). Fixed. - Matrix: 40 columns (was 24), taller, and the columns FALL; Matrix gets an ambient pack (hum, swept shimmer, glyph ticks) — it was silent by design. - New theme robotsrule: an arena after Robotron: 2084 around the person — Grunts marching in, Hulks sweeping, Electrodes, the family, Spheroids spawning; cues carry a bearing (robots:step/spawn/hulk/rescue); pack with arcade bass throb and per-robot sounds. Registered everywhere (THEMES, names en/ja, branding, server allowed list, tests). Baker: - Wraps detected by direction reversal vs the median step (Synthwave's 1 m grid wrap was below the fixed 2 m test and smoothed into "sliding back"). - A faded-out material counts as hidden (Godzilla's flames hide by opacity). - Time-driven shaders bake as a 6-phase flipbook over 3 s (Matrix rain scroll and floor pulse, Synthwave sun stripes, TRON floor) — Matrix 2.8 MB, budget raised to 3 MB. - Cues record az/el when the scene gives them. Headset: - Environment floor: y = 0 placed on the tracked FLOOR plane (polled 2 s), else head - 1.3 m — the ground was at chest height seated. - Cues with bearings play from there; Matrix and Robots Rule packs ported. - Device tests: the shell's VisibilityBarrier is checked AFTER a launch fails to resume, not before — it is also what is in front when no app is, and skipped every test on a worn headset. Verified: JVM 10+8 audio/catalog tests, bake 26/26, Rove 1513, xr-themes 14/14 (12 themes), i18n; on the Puck robotsrule + matrix load, animate, and open the sound field; floor fell back to head - 1.3 (no FLOOR plane in 2 s). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> check-in: 8c47a4b8d4 user: dkords tags: trunk
2026-10-01
19:42
Room mesh M2: feature edges + hidden-line removal, headset and web (app 0.60.0) Headset (robotarme_xr.cpp): EmitFeatureMesh keeps only creases (|cos| < cos 30°, tunable with debug.robotarme.crease) and borders, after welding vertices at 2 mm so chunk seams do not draw as borders; used by the live scan (on the whole merged room, not per chunk) and MESH OVERLAY. Hidden lines: a new depth-only occluder pipeline draws the mesh's triangles (depth bias pushes them back) before the depth-tested lines; off with xr_flags hiddenlines=0. Scan #407 on the Puck: 4,961 of 78,459 edges kept. Web (scan-lab): headset mesh scans render the same way — EdgesGeometry at 30° over a depth-only surface on navy (4,926 edges for #407); Wireframe still shows every triangle. Tests: scan-lab "feature edges over a depth-only surface" (9/9). Also fixed 4 pre-existing scan-lab failures: the splat tests took the first done scan, which became a headset mesh scan with no gaussians — they now ask for one with splats. Not yet measured on a worn headset: frame rate with the occluder pass. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: de82b83a14 user: dkords tags: trunk
19:25
Device tests no longer hang: launch without -W, time-limited shell, awake check in the rule The 13 x 180 s timeouts: ShellLaunchedActivityRule ran `am start -W` and read its output to the end; in a Full Space launch -W can wait forever for "launch complete", so the read blocked past the rule's own 20 s deadline to the leash. Now: `am start` without -W, every shell read capped (10 s / 5 s), then RESUMED or a failure that names what is in front. And the awake check moved into the rule's before(): it ran in the test body, after the launch had already failed, so a taken-off headset failed 16 tests instead of skipping them with the reason. Measured on the Puck via am instrument (app stays installed): full suite ends in 5.5 min (was frozen); asleep headset -> each launch test skips in ~1 s with "the headset is ASLEEP ... wear it or cover the don sensor". A worn-headset full pass is still to run. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 7de1370beb user: dkords tags: trunk
19:14
Ambient volume in the profile, sound field, stay signed in, cold-start crash (server 0.113.0, app 0.59.0) Ambient volume (themes T5): - user.ambient_volume (0..100, default 50 = the web's 0.5); returned with the session; set through POST /api/profile/audio {ambient_volume}, 0..100 integers only. Run bin/migrate. - Web: xr-app and the console apply it; `audio volume <0-100>` in the console saves it; setAmbientVolume restarts the playing pack so a change is heard at once. en + ja strings. - Headset: SOUND: n% in Settings (0/25/50/75/100), saved to the profile, restarts the ambience at the new level. Positional sound (T5): the engine renders first-order ambisonics (AmbiX, ACN W Y Z X, SN3D) and AmbientPlayer opens a SceneCore sound-field AudioTrack when SPATIAL_AUDIO is granted (stereo otherwise, said in the log). Events are placed: birds in the trees around you, owl behind, Invaders bass from the row above, radar ping following the sweep, MCP overhead, Recognizer crossing, traders' chatter around, drums ahead; beds stay all around. Stay signed in (#7): the session cookie is written through to TokenStore (Keystore-encrypted) and resumed at launch via GET /api/session; a dead cookie (server restart, expiry) falls back to sign-in and is forgotten. Crash: applying a theme before the window was attached aborted the process (SceneCore node-transform callback, View.getWindowToken() NPE). Session resume made that every cold start; ThemeEnvironment now waits for RESUMED + window token. 3 cold starts on the Puck: no crash, sound field opened. Tests: Rove ambient-volume test (1513 pass); console A-21b (42/42 on a second server); AmbientPacksTest +2 (AmbiX encoding, stereo pan), 9/9; ThemeCatalogTest volume steps; CookiePersistenceTest (4). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 6fa6fd6036 user: dkords tags: trunk
18:43
Themes T5: the robotARme sign in every baked theme (app 0.58.0) xr-branding.js's sign is troika SDF text, which glTF cannot carry. The baker now redraws each line with the same font (Roboto) on a canvas, as a textured quad of the same size, colour, outline and anchor; the plate and frame bake as before; the 3D logo is kept, its lit materials given a fixed key light in vertex colours plus the theme-tinted glow the web adds, and its slow turn and bob come through the sampled clip. The version line is this XR app's (BAKE_VERSION from Gradle's versionName, labelled "XR"). Bake page served as UTF-8 (the middle dot rendered as "·"). theme-bake test: every theme carries the sign's text textures (22/22). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 16c568265f user: dkords tags: trunk
17:58
Android XR 0.57.0: theme sound — all ten WebXR ambient packs ported (T4) - AmbientDsp: Web Audio work-alike in pure Kotlin (PolyBLEP oscillators, noise, Web Audio biquad rules incl. lowpass Q in dB, AudioParam automation, LFOs, absolute-time voices, interval/chained timers). - AmbientPacks: synthwave, cyberpunk, battlezone, invaders, tron, godzilla, petrichor, reagent, mercado, glade ported line for line from xr-audio.js; matrix silent as on the web. Bocci speech ported. - Godzilla/TRON cues: bin/bake-themes.mjs records the scene's audio events on the loop clock into <id>.cues.json; the packs replay them in step. - AmbientPlayer: streaming float AudioTrack on its own thread; follows audio_enabled, AROUND ME OFF, and onStop/onStart (silent in the HD viewer). Underruns logged every 10 s to files/theme-log.txt. Tests: AmbientPacksTest (7) — every pack sounds, finite, unclipped; matrix silent; stomp on its cue and again next loop; cue file parses; lowpass Q in dB; C5 arp note at 8 s and 1760 Hz radar at 20 s; faster than real time. On the Puck: 0 underruns on tron/godzilla/mercado/reagent, ~11% of a core, Home stops it. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 03397b31a0 user: dkords tags: trunk
09:52
Android XR 0.56.0: themes load and animate on the headset First headset run of 0.55.0: themes showed but did not move; Invaders did not show. The new files/theme-log.txt named the causes: - Battlezone "Invalid index range": all primitives unindexed -> baker indexes every primitive. - Invaders/TRON "Animation missing target node": exporter dropped hidden nodes but kept their tracks -> visibility baked as scale-0 keys, never-shown nodes dropped with their tracks (restores the frame flips). - No motion: clip started before the entity's animation list loaded -> start after the environment owns the entity, polling up to 3 s. Debug builds accept `am start ... --es theme <id> --es themeDisplay FULL` so themes can be checked from adb without signing in. Verified on the Puck: all 11 load and start their clip; Battlezone visibly moves between two screen captures. theme-bake test gains the two loader rules (indices present, every channel has a target): 22/22. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> check-in: 01bb0c0ee7 user: dkords tags: trunk