Skip to content

Fix pre-release defects from the v1.0.30 regression audit#747

Open
brentyi wants to merge 3 commits into
mainfrom
claude/regressions-v1-0-30-5wehcp
Open

Fix pre-release defects from the v1.0.30 regression audit#747
brentyi wants to merge 3 commits into
mainfrom
claude/regressions-v1-0-30-5wehcp

Conversation

@brentyi

@brentyi brentyi commented Jul 26, 2026

Copy link
Copy Markdown
Collaborator

Generated by Claude Code

brentyi added 2 commits July 26, 2026 15:19
Python:
- Initialize _share_tunnel before the atexit registration so a failed
  __init__ can't leave the atexit stop() recursing through the
  backwards-compat __getattr__ shim at interpreter exit.
- request_share_url now closes and replaces a dead ("failed"/"closed")
  tunnel instead of returning None forever; ViserTunnel.close()
  tolerates the failed connection's already-closed loop.
- GuiTabGroupHandle.remove() tombstones under _panel_lifecycle_lock
  (mirroring PanelHandle.remove) so a racing add_tab can't register an
  orphan container for a dead group.
- min/max_orbit_distance setters validate finiteness, positivity, and
  min<=max before the no-op short-circuit.
- _colors_to_int_tuple materializes its argument once so generator
  inputs can't be half-consumed by the warning pass.
- Async callback dispatch reachable from user threads (on_client_connect
  replay, value-setter update callbacks, form submit, pointer-done
  cleanups) now uses run_coroutine_threadsafe instead of the
  non-thread-safe loop.create_task.

Client:
- App.tsx reads the mobile media query synchronously on first render so
  mobile-width loads no longer mount the canvas inside the dock surface
  and immediately remount it (throwaway WebGL context + GPU re-upload).
- The mobile bottom-sheet panel list subscribes with value-level
  equality, so visible/order/tab-metadata updates propagate.
- InstancedMesh2.dispose() nulls instanceIndex and drops the geometry
  attribute so a frame drawn in the dispose->swap window re-initializes
  instead of binding a deleted GL buffer.
- The splat sort worker tracks buffer dirtiness so an updateBuffer that
  lands during a running sort is re-sorted even with a stationary
  camera.

Dock (spec-traced per dock-ux-spec.md):
- All resize surfaces (region resizer, docked dividers, stack divider,
  window grips) share the one-gesture slot move-drags already used, so
  a second pointer can't start a concurrent gesture (spec 4).
- Hit-testing: vertical tab insertion gets the same proximity bound as
  the horizontal bar path so rail merge is reachable (spec 5.3); the
  region side band yields across its overhang of a collapsed cell so
  one seam yields one drop with no hint hop (D55); sub-8px bottom
  split/snap bands are removed rather than shrunk (P11).
- The stack divider's cancel/motionless-press path commits the stored
  pinned height instead of the capped rendered height (P2/D56).
- Escape during a region resize restores float positions pushed by
  pushFloatsAheadOfSeam, not just widths (spec 4, P2).

Every behavioral fix is pinned by a regression test verified to fail on
the pre-fix code: 5 Python (tunnel recovery, orbit validation, color
coercion, atexit exit, tab-group race) and 11 client assertions across
hit-testing, divider cancel, float restore, splat staleness, and
dispose. Gates: ruff check/format clean, 689 Python tests pass; tsc,
eslint, prettier clean, 630 client tests pass.
The new setter validation rejected non-finite values, which removed the
only opt-out from the 1e4 default: infinity is the pre-1.1.0 unbounded
behavior and the camera-controls default, and large-scale scenes need
it. Accept +inf for the max bound (NaN and <= 0 still raise); the min
bound stays strictly finite.
@brentyi
brentyi force-pushed the claude/regressions-v1-0-30-5wehcp branch from 37b58d6 to e922562 Compare July 26, 2026 15:19
A local npm 10 re-resolve during the gate runs dropped the
@emnapi/core and @emnapi/runtime entries that @napi-rs/wasm-runtime
references, which npm 11's stricter 'npm ci' sync check rejects. No
dependency changes were intended; this restores main's lockfile
byte-for-byte.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant