release: v0.1.0 — one-click install, keyless boot, in-app Provider Settings (#142)

The first formal release.

- One-click install via Pinokio; keyless boot lands on a live Esri World
  Imagery satellite globe with keyless terrain, with automatic OSM fallback
  and graceful degradation when terrain is unavailable.
- Provider Settings (the POWER UP panel): add, replace, or remove API keys
  inside the app; credential files made owner-only before any secret is
  written; external keys shown read-only; the panel refuses shared or proxied
  servers.
- Keyless capability responses for the optional HUD summary and place search.
- Aircraft-identity voice answers cover operator, type, and route, and say so
  plainly when enrichment is unavailable.
- README rewritten keyless-first; concise 0.1.0 changelog section; CI
  workflow included.

Gates: 2,672 unit tests pass / 0 fail, build clean, tracking regression
108/108, map-source tray QA pass, setup doctor ready.
This commit is contained in:
Bilawal Sidhu authored and GitHub committed 2026-08-31 17:49:45 -05:00
1 parent 6d83bb6008
commit b6da93b8ac
170 files changed
+5800 -853

No files matched your search

+10 -7
View File
@@ -1,17 +1,20 @@
// src/reasonableDefaults.test.mjs
//
// What the console looks like the FIRST time it opens — before any share link,
// before any stored state. The "reasonable defaults" batch (product invariant,
// before any stored state. The "reasonable defaults" batch (owner directive,
// 2026-08-22) moved three of them together:
//
// 1. 3D aircraft models ON, mode `proximity`.
// Pinned in `data/layerState.test.mjs`, next to the coordinator that
// actually decides fresh-boot layer state — including the early return that
// makes each layer's own initializer the operative default.
// 2. Scope feather moved to 0% on 2026-08-22, 8% on 2026-08-23, and a soft
// 11% edge on 2026-08-24. The hard crop is still one drag away and pinned.
// 2. Scope feather. Owner: "I like to hide feather" set it to 0% on
// 2026-08-22; the owner revised that to 8% on 2026-08-23 and locked 11%
// on 2026-08-24, a soft
// edge. The hard crop is still one drag away, and that is pinned too.
// 3. Detection ON (Dense @ 75%) for EVERY style, Normal included.
// 4. Detection OUTSIDE opacity 1% (final value, 2026-08-24; 3% on 08-23, 5% before), with
// Owner: "detect should also be on by default."
// 4. Detection OUTSIDE opacity 1% (owner final lock, 2026-08-24; 3% on 08-23, 5% before), with
// the slider's `step` at 1 so the range around it is reachable at all.
//
// Each pin below has the same three parts, because a default is never one
@@ -73,7 +76,7 @@ function managerForHash(hash) {
test('first run opens with a subtle scope feather, at every surface that decides it', () => {
assert.equal(SCOPE_FEATHER_RATIO_DEFAULT, 0.11,
'final value 2026-08-24, superseding the 08-22 hard-crop and 08-23 8% rulings');
'owner final lock 2026-08-24, superseding the 08-22 hard-crop and 08-23 8% rulings');
assert.equal(getScopeMaskFeather(), 0.11,
'and the live module starts there, not merely documents it');
@@ -141,7 +144,7 @@ test('the subtle default did not weaken the feather control, and 0 is still reac
// ---------------------------------------------------------------------------
// 2c. Detection Fade — 7% on a first run, at every surface that decides it
// (final value 2026-08-24; 16% before). Fade is the label/card fading
// (owner final lock 2026-08-24; 16% before). Fade is the label/card fading
// band around the keyhole — a different control from the scope-mask feather.
test('first run opens at 7% detection fade, at every surface that decides it', () => {
assert.equal(KEYHOLE_LABEL_FEATHER_RATIO, 0.07,
@@ -161,7 +164,7 @@ test('first run opens at 7% detection fade, at every surface that decides it', (
test('first run opens at 1% OUTSIDE opacity, at every surface that decides it', () => {
assert.equal(KEYHOLE_OUTSIDE_OPACITY_DEFAULT, 0.01,
'final value 2026-08-24: the world overlay reads quieter beyond the keyhole');
'owner final lock 2026-08-24: the world overlay reads quieter beyond the keyhole');
// Four independent literals decide this on a fresh boot: the engine constant
// above, the markup and its readout, ui.js's global post defaults, and the