Skip to content

Commit 9bb1db5

Browse files
committed
Steady the neon current as v1.3.2
Constraint: Smooth Chrome on Intel and lower-performance hardware without returning to the old fixed background pack, changing combat timing, or introducing a reduced-quality gameplay mode. Rejected: Restore the pre-v1.3 PNG backgrounds | The ten procedural neon identities remain the source of every runtime composite. Rejected: Remove enemies, particles, hazards, or authored waves | The recovered budget comes from full-screen presentation passes and redundant redraws, not gameplay density. Rejected: Run timing evidence beside parallel browser work | Functional and visual checks fan out safely; delivered-frame evidence keeps an uncontested worker. Confidence: high Scope-risk: medium Directive: Let five neon horizons become one steady current, and let every pilot keep the world they already know. Tested: bun run typecheck; bun run typecheck:ts6; bun run lint; bun run test; bun run test:e2e (20 passed, 3 expected applicability skips); bun run levels:validate; bun run knip; bun run build; bun run bundle:check; git diff --check. Not-tested: Long-session production telemetry and the users exact Linux Intel Chrome driver stack remain observable after publication.
1 parent facf1a5 commit 9bb1db5

26 files changed

Lines changed: 471 additions & 131 deletions

.github/workflows/quality.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,11 @@ jobs:
3636
- name: Install browser test runtime
3737
run: bunx playwright install --with-deps chromium
3838

39-
- name: Browser smoke tests (bounded parallel workers)
40-
run: bun run test:e2e:smoke
39+
- name: Browser functional and visual tests (bounded parallel workers)
40+
run: bun run test:e2e:fast
4141

42-
- name: Browser visual and performance evidence (isolated)
43-
run: bun run test:e2e:evidence
42+
- name: Browser performance evidence (isolated)
43+
run: bun run test:e2e:performance
4444

4545
- name: Validate levels
4646
run: bun run levels:validate

CHANGELOG.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,21 @@
22

33
All notable changes to this project will be documented in this file.
44

5+
## [1.3.2] - 2026-08-01
6+
7+
### Changed
8+
- Preserved all five procedural neon background planes by compositing their authored alpha and additive treatment once per level, then rendering one full-screen texture alongside the existing independently moving planets, twinkles, and debris.
9+
- Reduced premium-background residency to the active composite by default while keeping the next level's just-in-time PlanetIntermission warmup.
10+
- Replaced the redundant full-camera WebGL vignette/glow pair with a CSS vignette; the new procedural art, ships, and effects retain their baked neon glow and the level color grade remains active.
11+
- Suppressed settled surge-meter redraws while preserving exact endpoint updates.
12+
- Ran functional and visual browser coverage with bounded parallel workers, then kept timing-sensitive performance evidence isolated on one worker.
13+
14+
### Quality
15+
- Added a non-invasive raw `requestAnimationFrame` delivery probe with refresh-adaptive cadence classification and lifecycle coverage, without `gl.finish()` or renderer monkeypatch synchronization.
16+
- Added focused tests for procedural compositing, one-layer presentation, texture-residency windows, and HUD redraw policy.
17+
- Retained desktop/mobile visual evidence and isolated performance evidence while making slow or background-throttled Chromium measurements self-describing instead of timing out.
18+
- Passed 20 canonical browser checks with 3 expected project-applicability skips, alongside both TypeScript compilers, lint, unit tests, level validation, Knip, production build, and bundle budgets.
19+
520
## [1.3.1] - 2026-08-01
621

722
### Changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ bun run dev # start local dev server
177177
bun run typecheck # type-check source, scripts, config, and tests
178178
bun run typecheck:ts6 # compare against the temporary TypeScript 6 compatibility compiler
179179
bun run test # run unit/regression tests with per-file isolation
180-
bun run test:e2e # run desktop and mobile Chromium smoke tests
180+
bun run test:e2e # run parallel functional/visual checks, then isolated performance evidence
181181
bun run build # type-check and production build
182182
bun run preview # preview production build
183183
bun run lint # eslint
@@ -201,7 +201,7 @@ for an explicit loadout, or `&upgrades=0` for a stock ship.
201201

202202
## Release notes
203203

204-
- [Latest release notes](docs/releases/1.3.1.md)
204+
- [Latest release notes](docs/releases/1.3.2.md)
205205
- [Release archive](docs/releases/README.md)
206206

207207
## Acknowledgements

docs/bundle-size-optimization-notes.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,4 +80,7 @@
8080

8181
- Release 1.3.0 replaces the ten packaged premium PNGs with five procedurally generated neon layers per level.
8282
- `public/assets/backgrounds/*.png` is removed from the distribution; the earlier PNG size and delivery notes above remain as historical baselines only.
83-
- Game creation retains only the active level plus one look-ahead level and releases obsolete generated textures after the new parallax has claimed its layers.
83+
- Game creation retains only the active level and releases obsolete generated textures after the new parallax has claimed its layers. The next set is generated during PlanetIntermission, immediately before it is needed.
84+
- The five authored procedural planes are now generated as before, composited once with their original alpha/additive treatment, and released as source canvases. Gameplay samples one 1024px background texture while planets, twinkles, and debris preserve independent depth and motion.
85+
- The active level is the default residency window. PlanetIntermission explicitly warms the next composite just before transition rather than permanently keeping a second five-canvas source set alive.
86+
- The global vignette is a CSS compositor overlay and the procedural/entity art keeps its baked neon glow. Gameplay retains its color-grade filter without two additional full-camera WebGL post-processing passes.

docs/qa/quality-gates.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ bun run bundle:check
2424
- `bun run typecheck` uses TypeScript 7.0.2 as the authoritative compiler for production source, scripts, Vite config, and tests.
2525
- `bun run typecheck:ts6` checks the temporary TypeScript 6 compiler-API bridge retained for typescript-eslint compatibility.
2626
- `bun run test` runs each test file in its own Bun process so file-level mocks and globals cannot leak across suites.
27-
- `bun run test:e2e` exercises the real Phaser runtime in desktop and mobile Chromium, including WebGL rendering, Arcade Physics, routing, resize, lifecycle recovery, and console-error failure.
27+
- `bun run test:e2e` runs independent functional and visual coverage with bounded parallel workers, then runs timing-sensitive performance evidence alone on one worker. It exercises the real Phaser runtime in desktop and mobile Chromium, including WebGL rendering, Arcade Physics, routing, resize, lifecycle recovery, and console-error failure.
2828
- `bun run build` keeps the production build path focused on source type-checking plus Vite output.
2929
- `bun run bundle:check` expects a fresh `dist/` from `bun run build`.
3030
- Phaser is pinned to 4.2.1, consumed through its package ESM export, and configured for WebGL. Unsupported browsers receive the explicit WebGL-required state.

docs/releases/1.3.2.md

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# Release 1.3.2 - steady the neon current
2+
3+
Keep the new ten-mission procedural backgrounds and current combat intact while removing the full-screen GPU passes that made Chrome stumble on Intel and lower-performance hardware.
4+
5+
## Highlights
6+
7+
- Generates the same five authored procedural planes for every level, preserves their alpha and additive treatment, and bakes them into one runtime composite before gameplay begins.
8+
- Keeps the passing planets, twinkles, debris, atmosphere motion, color grades, hazards, enemies, particles, and campaign choreography in place.
9+
- Replaces two full-camera WebGL post-processing passes with a lightweight CSS vignette; the new art and entity textures already carry their neon glow.
10+
- Keeps only the active composite resident during gameplay and warms the next level explicitly during PlanetIntermission.
11+
- Runs safe functional and visual E2E work in parallel while leaving frame-delivery evidence uncontested on one worker.
12+
13+
## Chrome frame path
14+
15+
- The v1.3 five-layer presentation asked Chrome to composite five viewport-sized scrolling textures before planets, entities, effects, HUD, and camera filters. The delivered-frame probe reproduced recurring doubled refresh intervals even though Phaser update and render submission stayed inexpensive.
16+
- Level startup now rasterizes the far, nebula, mid, near, and additive mote planes into one ordinary 1024px CanvasTexture. The source canvases are released immediately, so gameplay samples one background texture rather than five.
17+
- The composite scrolls at the authored mid-plane rate. Independent planets, twinkles, and debris retain visible depth and motion, so this is the current neon art direction—not a return to the old packaged background images.
18+
- The camera's color matrix remains active. A CSS radial vignette replaces the external vignette/glow filters, avoiding two more full-frame WebGL passes while the baked neon strokes, ship halos, and additive effects preserve the look.
19+
20+
## Runtime and residency
21+
22+
- Premium texture windows default to the current level only.
23+
- PlanetIntermission still generates the next level immediately before transition, preserving seamless progression without permanent double residency.
24+
- Settled zero/full surge values no longer clear and rebuild HUD geometry every frame; changed endpoints still render exactly once.
25+
26+
## Faster, trustworthy browser gates
27+
28+
- Functional desktop/mobile and visual desktop/mobile projects use bounded parallel workers (`4` locally, `2` in CI).
29+
- Desktop/mobile performance projects run afterward with one worker, preventing competing browser contexts from distorting timing evidence.
30+
- The raw delivery probe observes `requestAnimationFrame` without forcing GPU completion. Its cadence threshold adapts to the measured refresh interval and its watchdog tolerates background-throttled Chromium.
31+
32+
## Quality evidence
33+
34+
- Parallel functional/visual lane: 16 passed and 1 expected project-applicability skip in about 1.4 minutes locally.
35+
- Isolated performance lane: 4 passed and 2 expected desktop/mobile applicability skips in about 3.1 minutes locally.
36+
- Canonical `bun run test:e2e`: 20 passed and 3 expected applicability skips.
37+
- Desktop and mobile lane-reading visual evidence passed; measured p95 glow regression remained within the existing 2 ms budget.
38+
- Focused compositor, residency, HUD redraw, and raw-delivery tests pass alongside the existing campaign coverage.
39+
40+
## Lore
41+
42+
Constraint: Smooth Chrome on Intel and lower-performance hardware without returning to the old fixed background pack, changing combat timing, or introducing a reduced-quality gameplay mode.
43+
Rejected: Restore the pre-v1.3 PNG backgrounds | The ten procedural neon identities are part of the current campaign and remain the source of every runtime composite.
44+
Rejected: Remove enemies, particles, hazards, or authored waves | The hitch belonged to full-screen presentation pressure, not gameplay density.
45+
Rejected: Run timing evidence beside parallel browser work | Functional and visual checks can fan out safely; delivered-frame evidence still needs an uncontested worker.
46+
Confidence: high
47+
Scope-risk: medium
48+
Directive: Let five neon horizons become one steady current, and let every pilot keep the world they already know.
49+
Tested: `bun run typecheck`; `bun run typecheck:ts6`; `bun run lint`; `bun run test`; `bun run test:e2e`; `bun run levels:validate`; `bun run knip`; `bun run build`; `bun run bundle:check`; `git diff --check`.
50+
Not-tested: Long-session production telemetry and the user's exact Linux Intel Chrome driver stack remain observable after publication.

docs/releases/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
Latest first.
44

5+
- [`1.3.2`](./1.3.2.md) - preserves the procedural neon skies while collapsing Chrome's full-screen compositor load and parallelizing safe browser checks
56
- [`1.3.1`](./1.3.1.md) - quiets redundant frame work and splits fast browser checks from isolated visual/performance evidence
67
- [`1.2.2`](./1.2.2.md) - restores Level 1's standard encounter flow and makes projectile-cadence evidence frame-resolution aware
78
- [`1.2.1`](./1.2.1.md) - steadies active-combat frame pacing, trims projectile trail pressure, and sharpens hostile firing lanes

index.html

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,14 @@
3737
height: 100dvh;
3838
padding: env(safe-area-inset-top, 0px) env(safe-area-inset-right, 0px) env(safe-area-inset-bottom, 0px) env(safe-area-inset-left, 0px);
3939
}
40+
#game-shell::after {
41+
content: '';
42+
position: absolute;
43+
inset: 0;
44+
z-index: 1;
45+
pointer-events: none;
46+
background: radial-gradient(ellipse at center, transparent 0%, transparent 64%, rgba(1, 4, 12, 0.08) 76%, rgba(1, 3, 10, 0.36) 100%);
47+
}
4048
#game-root {
4149
width: 100%;
4250
height: 100%;

package.json

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "space-explorer",
3-
"version": "1.3.1",
3+
"version": "1.3.2",
44
"author": "Douwe de Vries",
55
"license": "MIT",
66
"private": true,
@@ -9,9 +9,12 @@
99
"scripts": {
1010
"dev": "vite",
1111
"test": "bun scripts/run-tests.ts",
12-
"test:e2e": "bun run test:e2e:smoke && bun run test:e2e:evidence",
13-
"test:e2e:smoke": "playwright test --project=chromium-desktop --project=chromium-mobile --workers=2",
14-
"test:e2e:evidence": "playwright test --project=chromium-desktop-evidence --project=chromium-mobile-evidence --workers=1",
12+
"test:e2e": "bun run test:e2e:fast && bun run test:e2e:performance",
13+
"test:e2e:fast": "playwright test --project=chromium-desktop --project=chromium-mobile --project=chromium-desktop-visual --project=chromium-mobile-visual",
14+
"test:e2e:smoke": "playwright test --project=chromium-desktop --project=chromium-mobile",
15+
"test:e2e:visual": "playwright test --project=chromium-desktop-visual --project=chromium-mobile-visual",
16+
"test:e2e:performance": "playwright test --project=chromium-desktop-performance --project=chromium-mobile-performance --workers=1",
17+
"test:e2e:evidence": "bun run test:e2e:visual && bun run test:e2e:performance",
1518
"test:e2e:desktop": "playwright test --project=chromium-desktop",
1619
"test:e2e:mobile": "playwright test --project=chromium-mobile",
1720
"typecheck": "node ./node_modules/@typescript/native/bin/tsc -p tsconfig.json && node ./node_modules/@typescript/native/bin/tsc -p tsconfig.test.json",

playwright.config.ts

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import { defineConfig } from '@playwright/test';
22

33
export default defineConfig({
44
testDir: './tests/e2e',
5-
fullyParallel: false,
6-
workers: 2,
5+
fullyParallel: true,
6+
workers: process.env.CI ? 2 : 4,
77
timeout: 60_000,
88
expect: {
99
timeout: process.env.CI ? 15_000 : 5_000,
@@ -34,13 +34,27 @@ export default defineConfig({
3434
},
3535
},
3636
{
37-
name: 'chromium-desktop-evidence',
38-
testMatch: '**/*.evidence.spec.ts',
37+
name: 'chromium-desktop-visual',
38+
testMatch: '**/visual.evidence.spec.ts',
3939
use: { viewport: { width: 1280, height: 720 } },
4040
},
4141
{
42-
name: 'chromium-mobile-evidence',
43-
testMatch: '**/*.evidence.spec.ts',
42+
name: 'chromium-mobile-visual',
43+
testMatch: '**/visual.evidence.spec.ts',
44+
use: {
45+
viewport: { width: 844, height: 390 },
46+
hasTouch: true,
47+
isMobile: true,
48+
},
49+
},
50+
{
51+
name: 'chromium-desktop-performance',
52+
testMatch: '**/performance.evidence.spec.ts',
53+
use: { viewport: { width: 1280, height: 720 } },
54+
},
55+
{
56+
name: 'chromium-mobile-performance',
57+
testMatch: '**/performance.evidence.spec.ts',
4458
use: {
4559
viewport: { width: 844, height: 390 },
4660
hasTouch: true,

0 commit comments

Comments
 (0)