feat(sim): sky scale + auto-start experience + drop reef_hawaiian
Expanded-pools sky-scale work plus two experience tweaks: - New `sky` altitude (airplane-window / low-flight layer) between orbit and coast; RING_ORDER cosmos·orbit·sky·coast·reef·abyss. New clip pools across all scales, re-baked the full adjacent-pair morph set (all-intra, LFS), and removed the now-stale cosmos↔abyss transitions the old ring order produced. - Auto-start: once the preload finishes the experience turns Video on and raises the audio dial to 3/10 with no user gesture (app.js autoStart()). - Dropped reef_hawaiian (text overlay — violates the text-free pool rule); reef pool 7→6, manifest transitions 586→558. Tests: rewrote tests/test_e2e_audio.py for the dial UI + auto-start; updated the manifest morph-count assertions and the altitude-scrub target for the new ring order. 302 pytest + 11 Playwright e2e + 9 node unit all green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -72,22 +72,22 @@ test("a new volume fade supersedes a stale one (audio not silenced after landing
|
||||
expect(vol).toBeGreaterThan(0.7); // ended near 0.8, not dragged to 0
|
||||
});
|
||||
|
||||
test("audio is a 0-10 level dial, defaulting to 0", async ({ page }) => {
|
||||
test("audio is a 0-10 level dial", async ({ page }) => {
|
||||
await boot(page);
|
||||
const ctl = await page.evaluate(() => {
|
||||
const c = document.querySelector("#audio") as HTMLInputElement;
|
||||
return { type: c.type, min: c.min, max: c.max, value: c.value };
|
||||
return { type: c.type, min: c.min, max: c.max };
|
||||
});
|
||||
expect(ctl.type).toBe("range");
|
||||
expect(ctl.min).toBe("0");
|
||||
expect(ctl.max).toBe("10");
|
||||
expect(ctl.value).toBe("0"); // silent until raised
|
||||
});
|
||||
|
||||
test("turning video on for the first time lifts audio to 3/10", async ({ page }) => {
|
||||
test("the experience auto-starts once loaded: video on + audio at 3/10", async ({ page }) => {
|
||||
await boot(page);
|
||||
expect(await page.evaluate(() => (document.querySelector("#audio") as HTMLInputElement).value)).toBe("0");
|
||||
await enableVideo(page); // first video-on couples audio at a gentle level
|
||||
// No gesture needed — autoStart() flips Video on and lifts audio to a gentle level
|
||||
// the moment the preload finishes.
|
||||
await expect.poll(() => page.evaluate(() => (document.querySelector("#visual") as HTMLInputElement).checked)).toBe(true);
|
||||
await expect.poll(() => page.evaluate(() => (document.querySelector("#audio") as HTMLInputElement).value)).toBe("3");
|
||||
// The level label reflects it.
|
||||
expect(await page.evaluate(() => document.querySelector("#audio-level-val")?.textContent)).toBe("3");
|
||||
@@ -134,7 +134,7 @@ test("auto-scrub speed is constant per altitude (a 2-step jump takes ~2x a 1-ste
|
||||
return (await page.evaluate(() => performance.now())) - t0;
|
||||
}
|
||||
const t1 = await timeJump(60, "orbit"); // cosmos -> orbit (1 altitude)
|
||||
const t2 = await timeJump(120, "reef"); // orbit -> reef (2 altitudes)
|
||||
const t2 = await timeJump(120, "coast"); // orbit -> coast (2 altitudes; ring is cosmos·orbit·sky·coast·reef·abyss)
|
||||
const ratio = t2 / t1;
|
||||
expect(ratio).toBeGreaterThan(1.5); // proportional to distance, not a fixed total
|
||||
expect(ratio).toBeLessThan(2.7); // ~2x, not more
|
||||
|
||||
Reference in New Issue
Block a user