Files
gods-eye-view/CHANGELOG.md
T
daikaginza e21c174f76 feat(search): finish the keyless fallback at every geocode call site
The keyless fallback landed on the LOCATION search box only. Two other places
forward-geocode a name and neither had it: the annotation resolver returned
null, so an annotation silently failed to anchor, and the Radio layer THREW,
which surfaced as a failed voice turn rather than as a station it could not
place. src/keylessGeocoder.test.mjs now COUNTS the call sites instead of
checking them file by file, so a second seam added to a file that already has
a fallback fails the suite too.

The annotation path carries the feature's own name out of Photon. Footprint
scoring matches OSM on that canonical name rather than on the user's words, so
incidental locality tokens cannot win: "the monument near the Texas Capitol,
Austin" scored on the raw utterance picks a downtown building that shares only
"Texas", "Capitol" and "Austin".

Photon's country is deliberately NOT re-exported. It comes back in the
feature's own language — "Việt Nam", "日本", "Россия" — and
normalizeRadioCountryInput fails CLOSED on a name it cannot map, so forwarding
it would filter the station list to nothing for exactly the places the lookup
had just resolved. The composed label still names the country. A keyless
lookup must not apply a filter the keyed one never applies.

A not-found is now remembered only when every source consulted returned a
verdict. Photon not replying is a network blip, not "no such place": memoizing
it kept the query answering not-found for the rest of the session on a network
that had since recovered — the same conflation the Overpass disk cache had to
be repaired for. geocodeMissIsDefinitive states the rule once and both entry
points use it, and the adapter's own memo follows it as well.

Reverse geocoding stays out of scope: the street-label reader consumes
Google's ranked address_components, and Photon's /reverse cannot reproduce
that shape.
2026-09-05 09:46:04 +07:00

275 lines
12 KiB
Markdown

# Changelog
This changelog records public product changes. For the authoritative description
of current runtime behavior, see [`docs/CURRENT-STATE.md`](docs/CURRENT-STATE.md).
## [Unreleased]
### Fixed
- The Overpass proxy now rotates to the next mirror on any non-2xx upstream
response, not only on 5xx. `overpass-api.de` and its `lz4` alias answer 406 to
the proxy's User-Agent while two of the configured mirrors answer 200 to the
identical request, so the fan-out stopped at the first refusal with healthy
mirrors untried. The refusal was also cached to memory and disk and served as
data — boundary-class queries hold a month-long TTL — which affected every
Overpass-backed feature: road geometry, annotation outlines and place lookup.
- Existing cached refusals are now ignored immediately, including during
stale-data fallback. Concurrent identical requests share the same last-good
fallback when all mirrors refuse, without duplicating upstream requests.
- A keyless place lookup no longer remembers a network failure as "no such
place". A blip while Photon was answering used to be memoized for the rest of
the session, so the query kept returning not-found from memory on a network
that had since recovered. A miss is now cached only when every source
consulted actually returned a verdict.
### Added
- Keyless place search. The LOCATION search box and the `fly_to_location` voice
tool now resolve place names through Photon (komoot, over OpenStreetMap) when
no Google Maps key is configured — previously the lookup threw. Google stays
the primary path and is unchanged when it answers; the fallback also covers a
key whose Geocoding API is not enabled, which Google reports as HTTP 200 with
`REQUEST_DENIED`, so an empty result is the detector rather than an error.
- The same keyless fallback now covers the remaining two place lookups: map
annotations ("annotate the botanical garden") and the Radio layer's
"near \<place>" selection. Radio previously threw without a key, which
surfaced as a failed voice turn rather than as a station it could not place;
annotations silently failed to anchor. Annotation footprints match OSM on the
resolved feature's canonical name, so locality words in the request cannot
pull the outline onto a neighbouring building.
## [0.1.1] — 2026-09-01 — Installation and live-data fixes
### Changed
- Tightened the README opening around keyless setup, source freshness, modeled
experiences, and the accessibility of the provider stack.
### Fixed
- Pinokio now recognizes its nested successful-install marker, so a completed
one-click install exposes Start instead of returning to Install.
- The keyless `dev-fresh.sh` startup summary now names Esri World Imagery with
keyless terrain and identifies OpenStreetMap as the fallback.
- All three VIIRS sources now reach the Active Fires layer. Merging a source's
detections used argument spread, which exceeds the engine's argument limit on
the two largest sources and dropped them entirely — leaving roughly a third of
global detections while reporting each dropped source twice, once as
successful with its real count and once as failed.
- `./scripts/dev-fresh.sh` no longer crashes on stock macOS bash 3.2 when no
provider keys are exported: expanding the empty external-keys provenance
array under `set -u` was fatal there. Launches with exported keys are
unchanged.
### Security
- GBFS proxy body-size cap now measures the response in bytes
(`Buffer.byteLength`) instead of JavaScript string length, so the
`GBFS_MAX_BODY_BYTES` limit holds for multi-byte payloads and cannot be
overrun by non-ASCII upstream responses.
## [0.1.0] — 2026-08-31 — One-click install, keyless boot, Provider Settings
### Added
- **One-click install** via Pinokio. Keyless boot lands on a live Esri World
Imagery satellite globe with keyless terrain; OSM takes over automatically if
Esri is unreachable, and the globe continues without terrain if its source is
unavailable.
- **Provider Settings** (the POWER UP panel): add, replace, or remove API keys
inside the app. Credential files are made owner-only before any secret is
written — verified on macOS and Windows — and keys configured outside the
panel are shown read-only, never rewritten.
- **Keyless capability responses**: the optional HUD summary and place-search
endpoints return a deliberate "not configured" success instead of errors, and
never consume rate-limit quota.
- `.gitattributes` normalizes line endings, so Windows clones pass the full
test suite out of the box (#81 — thanks @ethanstoner).
### Changed
- README rewritten keyless-first around the provider ladder: zero keys → free
Cesium ion (eligible personal, non-commercial use) → billing-enabled Google
Maps.
- Browser-built data modules no longer import `node:fs`; a repo-wide boundary
scan test keeps it that way (#83 — thanks @ethanstoner).
- Aircraft-identity voice answers explicitly cover operator, type, and route,
and say so plainly when enrichment is unavailable instead of guessing.
### Security
- Provider Settings answers only local, unproxied requests and disables itself
entirely whenever the server is shared. Public datacenter and dam datasets
omit contact-oriented fields (see the dataset READMEs).
## Pre-release development history
The dated entries and internal milestone numbers below predate the first
tagged GitHub Release. They are retained as project history and do not
represent previously published GitHub Releases.
## [Unreleased] — 2026-08-24
### Added
- Added honest aircraft identity narration: callsign, operator, registration,
type, and route come only from selected-contact context, and missing operator,
route, or type enrichment is named explicitly.
- Added local, publication-compatible copies of the two README PNGs, with source
records and third-party-license boundaries in `docs/media/README.md`.
- Added regression coverage for aircraft identity narration and optional-key
loading feedback.
### Changed
- First-run presentation now opens with Detection `DENSE` at 75%, `ELASTIC`
allocation, Fade 7%, Outside 1%, scope feather 11%, and aircraft 3D models in
`PROXIMITY`. Stored state and share links still override these baselines.
- The 17 selected README GIFs remain unchanged and are documented separately
from the two owner-published PNGs.
- Bundled datacenter and dam snapshots now omit contact-oriented fields and
note values containing email or phone identifiers. Feature geometry, names,
operator/capacity/river metadata, counts, and ODbL terms are unchanged.
- Public documentation and the L9 release matrix no longer reference non-public
planning material or repository history.
### Fixed
- A missing optional FIRMS key no longer turns the complete Environmental
mission into `LOAD FAILED`. The FIRMS row still reports `KEY REQUIRED`, while
earthquakes continue to load. Real lifecycle and fetch failures retain
failure priority.
- The mapped-installations layer retries after an unavailable request when it is
enabled or the camera settles.
- Aircraft trails attach to the rendered aircraft transform and remain near the
rear center across headings. Parked aircraft do not draw a moving head
segment.
- Grounded aircraft keep validated floor evidence through temporary terrain
outages and wait for measured photoreal-surface evidence before a 3D model
takes over from its billboard.
- Cockpit altitude uses aviation MSL data rather than Cesium render height.
### Security
- Production transitive dependencies resolve to patched DOMPurify and
protobufjs releases without changing the Cesium version or application APIs.
- Production dependency audit reports no known advisories; remaining audit
findings are confined to development and QA tooling.
## [Unreleased] — 2026-08-23
### Added
- Added a first-run mission launcher for Contacts, Space Missions,
Environmental, and manual exploration.
- Added terrain-validity gating and bounded last-known placement for grounded
aircraft models.
### Changed
- Environmental consistently presents both earthquakes and NASA FIRMS fires,
with honest optional-key degradation.
- The tracked aircraft trail acceptance bar is visual: roughly rear-center,
stable across headings, with minor hull overlap allowed and no conspicuous
top, bottom, or lateral projection.
## [Unreleased] — 2026-08-18 to 2026-08-22
### Added
- Added the four-source Map Source tray, share-link v2 state, cockpit/context
voice parity, MSL altitude readouts, and close-range tracked aircraft models.
- Added the L9 release-candidate matrix, AIS feed watchdog, voice cost controls,
satellite classes, and the shared world-overlay host.
- Added deterministic first-run, map-source, floor, overlay, tracking, and
aircraft-model regression harnesses.
### Changed
- Consolidated world labels, cards, tracked readouts, CCTV thumbnails, cable
labels, mission labels, and detection presentation under shared allocation and
lifecycle rules.
- Reduced idle rendering through the render governor and explicit scope mask.
- Improved cockpit layout, context restoration, keyless feed honesty, and
aircraft 2D/3D handoffs.
### Fixed
- Fixed degenerate depth picks, map-source restore states, route-camera motion,
bright-ground label readability, grounded display flooring, and cross-layer
tracking cleanup.
- Fixed stale overlay callbacks, parked-idle render leaks, cable-label sweep
starvation, and several share-link state conflicts.
## [Unreleased] — 2026-08-02 to 2026-08-16
### Added
- Added Global Context modes, Cockpit briefing surfaces, Radio context,
satellite mission replay, and real per-class aircraft models with adjacent
provenance records.
- Added a shared screen-space overlay system with bounded allocation for labels,
cards, callouts, detection brackets, and selected-object presentation.
### Changed
- Unified right-side product controls and responsive cockpit/map layouts.
- Migrated public-safe neighborhood geometry to DataSF and tightened safe local
development defaults.
- Improved proxy resilience, annotation outline bounds, CCTV enable pacing,
contact de-emphasis, and deterministic visual stacking.
## [Unreleased] — July 2026
### Added
- Added live NASA FIRMS fires, optional live TomTom traffic, Caltrans and TfL
CCTV packs, CCTV viewsheds and direct-manipulation calibration, citywide CCTV
cards, Natural Earth regions, analyst queries, and voice routing QA.
- Added the end-to-end vertical-datum system for aircraft, vessels, CCTV,
annotations, trails, and terrain-aware rendering.
- Added aircraft class silhouettes, path-derived display heading, ADSBDB
enrichment, cached CelesTrak TLE lookup, and next-ISS-pass prediction.
### Fixed
- Fixed elevated-airport aircraft placement, vessel sea-surface placement,
close-zoom FIRMS anchors, antimeridian region framing, annotation resolution,
cross-layer tracking ownership, and CCTV projection lifecycle issues.
## [Unreleased] — June 2026
### Added
- Added OpenAI Realtime voice control, scene-aware entity context, viewport image
grounding, the AI HUD summary, live AIS vessels, infrastructure layers, map
source switching, free-text navigation, and server-side data proxies.
- Added hybrid map annotations, 3D aircraft, panoptic detection, tracking
harnesses, and public data attribution.
- Added MIT source licensing, security guidance, contribution guidance, data
source notices, and third-party asset boundaries.
### Changed
- Removed the experimental AI video-edit style and retained seven deterministic
visual styles.
- Moved Realtime text-history trimming to the server-side retention policy while
keeping only the latest viewport image in conversation context.
## [0.7.0] — 2026-02-18
- Added the Bikeshare Pulse layer and panoptic label improvements.
- Improved tracked-item boxes, post-render alignment, and CCTV projection
quality.
- Removed the experimental shift-drag CCTV calibration interaction.
## [0.6.0] — 2026-02-10
- Added the initial multi-layer 3D globe experience, visual styles, live
aircraft, satellites, earthquakes, CCTV, traffic, FIRMS, infrastructure, and
performance controls.
- Added entity inspection, tracking, scenes, keyboard controls, and shareable
views.
## [0.1.0] — 2026-02-09
- Initial project version.