Cluster of small, targeted URL-state contract fixes surfaced by Codex's retrospective review of #203 + #205. Each item is independently shippable; bundling for tracking, not for one PR.
Items
Why bundled
Each is a small, localized fix in explorer.qmd. None unblocks the others. Codex flagged them as a group; tracking them together keeps the URL state contract's edges visible while we work through them. Individual PRs are fine.
Refs
Cluster of small, targeted URL-state contract fixes surfaced by Codex's retrospective review of #203 + #205. Each item is independently shippable; bundling for tracking, not for one PR.
Items
Low-altitude-without-
mode=pointround-trip (Codex item 4). The early-write fix in explorer: fix URL state round-trip (closes #201 parts A+B) #203 can produce URLs likealt=8000withoutmode=pointif the user copies during a pending point-mode transition. Boot only force-enters point mode when the URL saysmode=point, so the round-trip lands in cluster mode at low altitude — not what the user saw. Fix shape: boot path should enter point mode based on altitude (alt <ENTER_POINT_ALT) AND/OR the URL flag, not the URL flag alone. UpdatetryEnterPointModeIfNeeded()call at boot end to fire whenever altitude is below threshold, regardless ofih.mode.h3hashchange null-result asymmetry (Codex item 6). WhenfetchClusterByH3(state.h3)returns null in the hashchange handler (explorer.qmd:~2568-2580), the UI is cleared butviewer._globeState.selectedH3is NOT cleared. Boot does clear it (line ~2590). The asymmetry means an invalid/filteredh3can be re-emitted later bybuildHash(). Fix shape: clearviewer._globeState.selectedH3in the hashchange null branch to match the boot behavior.Selection state with search-result flights (Codex item 8). Search-result clicks fly the camera but don't set or clear
selectedPid/selectedH3. The URL then becomes "new camera, old selection". Fix shape: search-result click handler should either set selection to the searched-for sample or clear stale selection before flying.Avoid
pushStateduring boot/hash hydration (Codex item 3).tryEnterPointModeIfNeeded()at boot eventually callsenterPointMode()with defaultpushHistory, so boot hydration can add a browser history entry. Boot and hashchange should reconcile state without growing history. Fix shape: thread an explicit{ pushHistory: false }option through the boot call site.Why bundled
Each is a small, localized fix in
explorer.qmd. None unblocks the others. Codex flagged them as a group; tracking them together keeps the URL state contract's edges visible while we work through them. Individual PRs are fine.Refs