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

+19 -13
View File
@@ -1,9 +1,9 @@
/**
* qa-l9-matrix.mjs — the L9 release-candidate QA matrix, in one command.
*
* L9 is the final live keyed end-to-end QA pass, including the browser tracking
* gate and a re-confirmation of the release bar, run against a release
* candidate before publication.
* L9 = the final live keyed end-to-end QA pass
* (P1-5) + the browser tracking gate (P1-7) + a re-confirmation of the release
* bar, run against the release candidate before the repo goes public.
*
* This runner does everything in that matrix that a machine can honestly do:
*
@@ -15,10 +15,10 @@
* clean-UI keeps attribution, no key leaks into the client.
* D · HARNESS the existing qa-*.mjs fleet, invoked as subprocesses and
* aggregated. This runner never reimplements what they cover.
* M · MANUAL checks that require a person (voice microphone round trips,
* the LAN warning, the live-vessel transfer, …). Always
* reported as SKIPPED/OWNER-RUN so coverage stays honest; use
* --list to print their descriptions.
* M · MANUAL the owner-eyes checks (3 voice mic round trips, the LAN
* warning, the live-vessel transfer, …). Always reported as
* SKIPPED/OWNER-RUN so the coverage math stays honest — the
* steps live in the maintainers' release runbook.
*
* Honest degradation is the core contract: a check that needs a key THIS run
* does not have is SKIPPED with an OWNER-RUN tag, never failed. A FAIL always
@@ -663,21 +663,24 @@ check({
check({
id: 'A6', group: 'A', desc: 'Private-name scan over publicly shipped paths (release checklist)',
run: async () => {
// The public snapshot must not carry non-public scenario vocabulary. This
// check scans the complete tracked candidate, which is already curated.
// The public snapshot must not carry the private scenario vocabulary.
// Maintainer-internal directories are stripped at curation, so they are
// excluded here — this scans what would actually ship.
//
// The release checklist also lists two more terms that are dropped as
// blockers because both are legitimately present in the shipping tree: one
// is the name of the auto-detection default view (README, CHANGELOG,
// src/data/*), the other appears inside the bundled public geodata
// (datacenter and submarine-cable landing points). Scanning for them
// produces only false positives, so they are intentionally omitted here.
// produces only false positives — flagged as a stale checklist item in
// the maintainers' release runbook, not silently honoured.
//
// The terms are assembled from fragments so THIS file carries no literal
// copy of the private vocabulary. Spelling them out here would make the
// scanner its own first hit — and this script ships publicly.
const terms = [['horm', 'uz'], ['cease', 'fire'], ['gps-', 'jamming']].map(([a, b]) => a + b);
const grep = await sh('git', ['grep', '-lIiE', terms.join('|'), '--'], { timeoutMs: 120000 });
const grep = await sh('git', ['grep', '-lIiE', terms.join('|'), '--',
':!docs/inter' + 'nal/**', ':!.cla' + 'ude/**', ':!.gev-logs/**', ':!CLA' + 'UDE.md', ':!AGENTS.md'], { timeoutMs: 120000 });
// 0 = matches, 1 = no matches, >1 = the scan itself failed.
if (grep.code > 1) return crash(`git grep failed (exit ${grep.code}): ${tail(grep.err)}`);
const hits = grep.out.split('\n').filter(Boolean);
@@ -1142,7 +1145,10 @@ check({
script: 'qa-floor-verify.mjs',
parse: readFloorVerdict,
timeoutMs: 600000,
knownConditions: [],
knownConditions: [{
when: /VERDICT:\s*FAIL|buried/i,
note: 'EXPECTED at main 4f9d99b — the below-mesh fix is not landed, so grounded contacts sit under the floor. Annotated, never green. If fix/below-mesh-contacts has landed, PASS is expected instead and any remaining FAIL (jet-bridge / intra-cell relief residual) is a REAL failure that stays FAIL.',
}],
}),
});
check({
@@ -2163,7 +2169,7 @@ async function main() {
const runList = CHECKS.filter(selected);
const runSerial = async (c) => {
if (c.manual) { record(c, skip('manual step — run with --list for its description', 'OWNER-RUN'), 0); return; }
if (c.manual) { record(c, skip('owner-eyes step — see the maintainers\' release runbook', 'OWNER-RUN'), 0); return; }
if (CHEAP && (c.heavy || c.costly)) { record(c, skip('heavy/cost-bearing check omitted by --cheap', 'CHEAP'), 0); return; }
if (c.needsKey && env.keys[c.needsKey] !== true) {
const state = env.keys[c.needsKey];