diff --git a/CHANGELOG.md b/CHANGELOG.md index 08d2afc3c..e71f98787 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,7 +19,7 @@ of current runtime behavior, see [`docs/CURRENT-STATE.md`](docs/CURRENT-STATE.md browser harness renderer portability fixes contributed by Tom-Neverwinter. macOS retains Metal; other platforms default to SwiftShader. Cockpit renderer assertions and evidence labels follow the actual selected mode. Floor-hold - keeps its mesh and terrain assertions; software runs are not real-GPU evidence. + explicitly selects its measured 2D billboard mode and keeps its mesh and terrain assertions; software runs are not real-GPU evidence. First-run QA now checks the existing attribution Escape-close/focus-return behavior while preserving the launcher-underneath regression checks. diff --git a/TESTING.md b/TESTING.md index 95eddb50c..fb9ca960a 100644 --- a/TESTING.md +++ b/TESTING.md @@ -225,6 +225,8 @@ While recording, call out anything in these areas — this is the feedback I mos The first-run, view-target prewarm, cockpit-plates and floor-hold harnesses select Metal on macOS and SwiftShader on other platforms. Cockpit-plates also accepts `--swiftshader` on macOS; floor-hold retains `--angle=`. +Floor-hold explicitly selects 2D aircraft mode because it measures billboard +positions; the tracking suite covers the 3D handoff. Software runs validate their assertions but do not establish real-GPU visual correctness. Floor-hold retains both mesh and DEM checks: an unavailable mesh oracle fails the run even when the DEM check passes. Record the backend with diff --git a/scripts/qa-floor-hold.mjs b/scripts/qa-floor-hold.mjs index 00eac1807..82bdf6baa 100644 --- a/scripts/qa-floor-hold.mjs +++ b/scripts/qa-floor-hold.mjs @@ -110,6 +110,10 @@ await page.goto(APP_URL, { waitUntil: 'domcontentloaded', timeout: 120000 }); await page.waitForFunction(() => window.__godsEyeView?.viewer && window.__godsEyeView?.dataManager, { timeout: 150000 }); await sleep(12000); // let the boot fly-to settle before pinning +await page.evaluate(() => { + document.querySelector('#first-run-launcher:not([hidden]) [data-first-run-choice="explore"]')?.click(); +}); +await sleep(600); // let the launcher dismissal finish before taking evidence await page.evaluate((site) => { window.__SITE = site; }, SITE); const pin = () => page.evaluate(() => { @@ -125,7 +129,16 @@ const pin = () => page.evaluate(() => { v.camera.moveEnd.raiseEvent(); }); await pin(); -await page.evaluate(async () => { await window.__godsEyeView.dataManager.toggle('flights'); }); +const billboardMode = await page.evaluate(async () => { + const manager = window.__godsEyeView.dataManager; + const flights = manager.layers.get('flights').module; + // This harness measures billboard positions. A ready 3D model deliberately + // hides its billboard; that handoff is covered by track-regression instead. + flights.setParams({ models3d: false }); + await manager.toggle('flights'); + return flights.getParams().models3d === false; +}); +record('the billboard floor test is explicitly in 2D aircraft mode', billboardMode); /** Reads the contact's rendered height and the rendered mesh beneath it. */ const measure = () => page.evaluate(async (icao) => {