Releases: ddv1982/space-explorer
Release list
v1.5.1 - Temper the Shattered Guard
Release 1.5.1 — Temper the Shattered Guard
The frontier's command ships have adapted. Their guards now demand steadier pressure, recover sooner when the firing rhythm slips, and expose the core for a shorter decisive opening.
Guard balance
- Raises Guard capacity by 25% on every guarded boss across Levels 5–10.
- Progresses authored capacity from 30 at Deep Space Inferno to 60 at Terminus Black.
- Starts Guard decay after 1.2 seconds without a main-player hit, down from 1.5 seconds.
- Increases the decay curve from 10 pressure per second in Level 5 to 21 per second in Level 10.
- Shortens the break window from 2.5 seconds to 1.8 seconds.
- Retains double main-player damage during the opening, preserving a strong reward for earning the stagger.
Intent
- Makes accidental or intermittent breaks less common.
- Requires sustained aim and firing discipline as later bosses become more demanding.
- Keeps Guard Break tactically valuable without allowing repeated long staggers to flatten boss encounters.
Quality
- Adds an exact campaign regression for all six capacity, decay, delay, and duration profiles.
- Retains existing Guard lifecycle, scaling, HUD, collision-routing, helper/picket isolation, and responsive browser coverage.
v1.5.0 - Arm the Starlit Frontier
Release 1.5.0 — Arm the Starlit Frontier
The frontier changes after the fourth orbit. Ten worlds now arrive as authored raster vistas, while the later campaign answers the pilot's growing strength with allied pickets, priority targets, breakable boss guards, and a new reward for holding the firing rhythm at its peak.
Ten authored worlds
- Replaces the procedural vector-like planet discs with ten distinct optimized WebP portraits.
- Preserves the responsive neon arrival chrome, orbital markers, destination briefings, mobile layouts, and reduced-motion behavior.
- Loads portraits through the normal Phaser asset lifecycle and releases visited textures safely between intermissions.
AEGIS Picket network
- Unlocks a new two-tier upgrade after Level 4.
- Deploys automatic hardpoints at both screen edges, favoring nearby chaff without taking control away from the player.
- Uses dedicated flat-damage bolts, bounded pooling, staggered firing, responsive viewport anchoring, restrained effects, and its own audio identity.
- Persists cleanly in new and legacy saves; older campaigns begin with the system uninstalled.
Late-game combat texture
- Marks sparse enemies in Levels 5–10 as gilded Aces with 2× durability, 4× base score, and one guaranteed power-up.
- Activates Overdrive at a sustained x5 chain, cycling the player's main gun 15% faster until the chain falls.
- Gives Level 5–10 bosses a Guard meter that builds only from the main player's fire, decays after inactivity, and opens a 2.5-second stagger with double player damage when broken.
- Pauses boss movement and new attacks during Guard Break, then resumes through reset phase and attack timers instead of releasing a queued burst.
Compatibility and quality
- Keeps helper ships and picket damage independent from Guard pressure and its damage amplification.
- Restores Marked Ace stats, tint, and reward state correctly when pooled enemies are reused.
- Handles shifted and letterboxed camera viewports for turret mounts, bolt lifetime, targeting, and intermission decoration.
- Validates finite Guard Break tuning and sparse Ace placement across all ten levels.
- Includes focused unit, integration, desktop/mobile browser, visual, lifecycle, save-compatibility, performance, bundle, and production-build coverage.
Space Explorer v1.4.1
Release 1.4.1 — Planet arrival visual redesign
Version 1.4.1 improves the rendering quality and lifecycle behavior of all ten planet-arrival screens introduced in 1.4.0. Gameplay, progression, upgrades, and level configuration are unchanged.
Planet rendering
- Generates each hero planet at 512×512 for cleaner desktop and high-density display scaling.
- Replaces hard-edged lighting stamps with layered spherical illumination, a soft terminator, directional rim lighting, and a smoother atmospheric halo.
- Adds shadow-side color and deterministic night lights to inhabited worlds.
- Integrates each level's motif into the planet surface with proportionally scaled geometry and lighting-aware shadow treatment.
- Splits the eclipse and singularity rings into rear and foreground passes to provide clearer depth.
Motion and accessibility
- Adds restrained halo breathing and orbit-line animation to the arrival composition.
- Preserves the existing reduced-motion behavior by disabling the new ambient tweens when reduced motion is requested.
- Keeps all rendering deterministic and dependency-free, with the existing Phaser Graphics texture-generation path as the fallback-compatible implementation.
Memory and lifecycle
- Removes generated hero textures when the intermission scene shuts down.
- Avoids retaining all ten higher-resolution textures for the full campaign while still generating each destination only when needed.
Test coverage
- The visual evidence lane now captures each of the ten desktop planet arrivals individually.
- Portrait evidence waits for the resized intermission to finish rendering before asserting its title and continue prompt.
- Type checks, lint, unit tests, production build, level validation, dependency analysis, bundle budgets, and browser evidence remain part of the release validation corridor.
v1.4.0 - Chart the Starlit Atlas
Release 1.4.0 - chart the starlit atlas
Turn every level transition into a distinct destination: ten cinematic planetary arrivals, one responsive navigation language, and the same premium campaign art and gameplay beneath them.
Highlights
- Reimagines all ten planet screens with a unique procedural world, orbital motif, approach code, classification, signal state, and destination briefing.
- Carries the existing premium procedural backgrounds into each arrival instead of returning to the earlier fixed artwork.
- Reflows the planet, mission context, upgrade bay, next vector, and campaign-completion record across desktop, laptop, phone landscape, phone portrait, and ultra-compact viewports.
- Gives upgrade choices distinct iconography and color treatment while preserving their exact costs, prerequisites, purchase behavior, keyboard flow, and gameplay effects.
- Keeps action-section music pressure bounded in Chrome by coalescing sub-threshold intensity requests without flattening the authored soundtrack or atmosphere transitions.
Ten destinations, one flight language
- Arrival art now reads as a navigational event rather than a detached upgrade menu: the player's route enters a large orbital composition while the destination record and refit bay share a deliberate information panel.
- Each campaign level owns a different visual motif, from Lumen Gate's aurora currents and Korra Vale's shattered reef to Omega Spire's singularity engine.
- The final mission replaces the ordinary next-level vector with a complete ten-sector campaign record.
- Planet textures are generated once per identity and the arrival animation is a single short tween, keeping the presentation lightweight and respecting reduced-motion preferences.
Responsive flight deck
- Desktop and laptop layouts place the orbital body beside a two-column mission/refit panel.
- Portrait phones stack the planet, destination record, and four full-width upgrade choices with touch-sized controls.
- Short landscape and ultra-compact screens preserve the title, status, upgrades, next vector, and continue control while progressively omitting secondary prose.
- Live QA covered 1280×800, 844×390, 390×844, 480×320, and 280×360 compositions, including a real upgrade purchase on the smallest viewport.
Chrome and CI reliability
- Music-intensity updates no longer pressure Chrome's audio graph every animation frame when the requested change remains below the audible threshold.
- Functional/visual and performance browser lanes stay isolated so software WebGL work cannot contaminate frame-delivery evidence.
- Campaign evidence waits for the exact staged planet title and procedural texture, rather than treating an already-active intermission scene as proof that its restart has rendered.
Quality evidence
- Every one of the ten authored profiles is checked against campaign configuration, with unique motif and approach-code coverage.
- Responsive layout tests enforce in-bounds, touch-sized upgrade controls and true reflow rather than desktop shrinkage.
- The visual browser test stages all ten arrivals on desktop and mobile Chromium and captures portrait evidence.
- A CI-shaped stress run repeated the desktop/mobile campaign test five times per project: 10 runs and 100 scene restarts passed.
- The complete local corridor passes both TypeScript compilers, lint, unit tests, level validation, Knip, production build, bundle budgets, and the canonical browser suite.
Lore
Constraint: Give every campaign world a memorable arrival on every supported screen without changing combat, upgrades, progression, or the premium procedural backgrounds.
Rejected: Return to the fixed planet screens | The current neon skies remain visible and every new world is generated from its campaign identity.
Rejected: Shrink the desktop composition onto phones | Portrait and short-landscape screens receive authored reflow with touch-sized controls and progressive information density.
Rejected: Mask the CI race with retries | Evidence now waits for the exact rendered destination and texture requested by the harness.
Confidence: high
Scope-risk: medium
Directive: Chart ten worlds across the starlit atlas, and let every arrival feel earned.
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; CI-shaped ten-run planet-arrival stress test.
Not-tested: Long-session production telemetry and the user's exact physical mobile/browser combinations remain observable after publication.
v1.3.2 - Steady the Neon Current
Release 1.3.2 - steady the neon current
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.
Highlights
- 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.
- Keeps the passing planets, twinkles, debris, atmosphere motion, color grades, hazards, enemies, particles, and campaign choreography in place.
- Replaces two full-camera WebGL post-processing passes with a lightweight CSS vignette; the new art and entity textures already carry their neon glow.
- Keeps only the active composite resident during gameplay and warms the next level explicitly during PlanetIntermission.
- Runs safe functional and visual E2E work in parallel while leaving frame-delivery evidence uncontested on one worker.
Chrome frame path
- 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.
- 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.
- 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.
- 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.
Runtime and residency
- Premium texture windows default to the current level only.
- PlanetIntermission still generates the next level immediately before transition, preserving seamless progression without permanent double residency.
- Settled zero/full surge values no longer clear and rebuild HUD geometry every frame; changed endpoints still render exactly once.
Faster, trustworthy browser gates
- Functional desktop/mobile and visual desktop/mobile projects use bounded parallel workers (
4locally,2in CI). - Desktop/mobile performance projects run afterward with one worker, preventing competing browser contexts from distorting timing evidence.
- The raw delivery probe observes
requestAnimationFramewithout forcing GPU completion. Its cadence threshold adapts to the measured refresh interval and its watchdog tolerates background-throttled Chromium.
Quality evidence
- Parallel functional/visual lane: 16 passed and 1 expected project-applicability skip in about 1.4 minutes locally.
- Isolated performance lane: 4 passed and 2 expected desktop/mobile applicability skips in about 3.1 minutes locally.
- Canonical
bun run test:e2e: 20 passed and 3 expected applicability skips. - Desktop and mobile lane-reading visual evidence passed; measured p95 glow regression remained within the existing 2 ms budget.
- Focused compositor, residency, HUD redraw, and raw-delivery tests pass alongside the existing campaign coverage.
Lore
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 are part of the current campaign and remain the source of every runtime composite.
Rejected: Remove enemies, particles, hazards, or authored waves | The hitch belonged to full-screen presentation pressure, not gameplay density.
Rejected: Run timing evidence beside parallel browser work | Functional and visual checks can fan out safely; delivered-frame evidence still needs 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; 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 user's exact Linux Intel Chrome driver stack remain observable after publication.
Release 1.3.1 - quiet the starstream
Release 1.3.1 - quiet the starstream
Keep Space Explorer's neon campaign, combat language, and responsive flight intact while removing redundant frame work and shortening the browser-test feedback loop.
Highlights
- Caches exact active-section lookup and avoids duplicate music and atmosphere presentation calls without quantizing progress or changing boss transitions.
- Skips renderer-facing alpha writes when the computed value is already applied, preserving every authored background layer and motion formula.
- Replaces seven hazard-list traversals with one pass and clears dormant overlay geometry only when it actually becomes invisible.
- Runs independent functional browser coverage with two workers while keeping all visual and frame-pacing evidence isolated on one worker.
- Splits the former monolithic browser smoke file into focused shared-fixture, smoke, interaction, visual, and performance suites.
Runtime quieting
- Active campaign sections remain cached only while the same level config and exact authored section bounds remain valid.
- Atmosphere progression still receives every distinct section-progress value; no visual stepping or quality tier was introduced.
- Music intensity still updates for every distinct resolved value, section transition, and boss entry/exit, but identical steady-state requests are suppressed.
- Distant planets, debris, twinkles, passing planets, and premium background layers keep their existing alpha calculations and only skip a
setAlphacall when the sprite already has that exact value. - Hazard overlays still clear and redraw on every visible animated frame. Once their final geometry fades below the visibility threshold, they clear once and remain untouched while dormant.
Faster, trustworthy browser gates
- Functional desktop/mobile projects use two bounded Playwright workers and retain isolated browser contexts.
- Visual and frame-pacing projects use one worker through both the canonical local command and CI, preventing competing browsers from distorting evidence.
- Shared fixtures centralize browser-error capture, harness readiness, snapshots, menu entry, and scene polling.
- Avoidable fixed startup waits were replaced with harness-observed gameplay readiness.
- The obsolete audio-resume-disabled scenario was removed after runtime request deduplication made both sides consistently measure zero; remaining probes require request pressure to stay below sampled frame count, while focused unit coverage proves section and boss transitions still issue updates.
Quality evidence
- Canonical functional E2E lane: 14 passed, 1 expected desktop/mobile applicability skip, about one minute locally.
- Canonical isolated evidence lane: 5 passed, 1 expected mobile applicability skip, about 3.6 minutes locally.
- Desktop/mobile visual evidence retained the existing layer geometry and showed p95 lane-reading glow regression of 0 ms in the release run.
- Independent verification accepted runtime parity, hazard cleanup, worker isolation, evidence bounds, and exclusion of the user-owned untracked seam-check script; it explicitly classified the removed audio-resume comparison as obsolete coverage.
Lore
Constraint: Improve low-end steadiness and test feedback without dimming the neon frontier, changing combat timing, or contaminating performance evidence with parallel browser load.
Rejected: Reduce background layers, particles, texture size, visual cadence, or authored values | The frame budget should be recovered from redundant work, not from the game's identity.
Rejected: Run every browser project in parallel | Functional checks benefit from bounded concurrency, but visual and frame-pacing evidence require an uncontested worker.
Rejected: Keep an audio-resume comparison whose control and treatment both measure zero | Dead evidence spends time without increasing confidence.
Confidence: high
Scope-risk: medium
Directive: Let the starstream stay vivid, let each frame carry only necessary work, and let the evidence fly in clear air.
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.
Not-tested: Production CDN propagation and long-session field telemetry remain observable only after publication.
Release 1.3.0 - awaken the neon frontier
Release 1.3.0 — awaken the neon frontier
Space Explorer’s ten-mission voyage has been rebuilt as a distinct neon campaign. Every sector now carries its own visual identity, authored combat language, enemy roles, hazard grammar, pacing arc, and boss escalation—while keeping safe lanes readable and gameplay clocks honest through pauses.
Highlights
- Reimagines all ten levels with authored sections, formations, recovery beats, signature hazards, and clearer campaign escalation.
- Introduces six enemy roles: Diver, Dodger, Sower, Lancer, Splitter, and Swarmling, plus mines and aimed lancer bolts.
- Adds solar-flare sweeps, laser lattices, wormhole packs, boss add waves, and pause-safe telegraph timing.
- Adds the Graze Surge system and a kill-chain score multiplier for more expressive high-skill play.
- Replaces ten packaged background PNGs with five procedural neon layers per mission, removing roughly 26 MB of shipped raster assets.
- Bounds generated background residency to the active mission plus one look-ahead mission.
- Refreshes ships, bosses, projectiles, particles, HUD, menus, intermission, game-over, and victory presentation under one neon art direction.
- Bundles Orbitron and Share Tech Mono UI fonts without external font requests.
- Supports touch play in portrait and landscape; hardware keyboard detection swaps hints and hides the joystick while retaining tap-to-pause.
- Adds a development-only level jump and progression-legal loadout shortcut for campaign playtesting.
Encounter integrity
- Choreographed waves advance on accumulated gameplay delta, so pauses cannot compress schedules into a burst.
- Hazard beams retain their full telegraph and active windows across pauses.
- Wormhole packs freeze during pauses and are canceled on death relief or section changes, preventing stale encounters from leaking forward.
- Death relief lasts for eight seconds of active gameplay rather than expiring on the scene clock.
- Bonus waves require actual defeats; enemies escaping the viewport no longer count, and pooled-instance reuse remains correctly attributed.
Performance and delivery
- Removes
public/assets/backgrounds/bg_level01.pngthroughbg_level10.png. - Production build: approximately 1.73 MiB raw / 479 KiB gzip across 13 files.
- Bundle guardrails pass with the Phaser chunk isolated and total JavaScript below the existing threshold.
- Procedural texture generation is windowed and obsolete mission textures are released after the new scene claims its layers.
Quality evidence
- TypeScript 7 and TypeScript 6 stable-order checks pass.
- Lint, isolated unit suite, ten-level validation, Knip, production build, bundle guardrails, and diff checks pass.
- Browser release corridor passes on desktop and mobile: 19 passed, 3 expected project-specific skips.
- Mobile coverage includes portrait play, free rotation, viewport recovery, unsupported-WebGL handling, and hardware-keyboard handoff.
Lore
Constraint: Reforge the ten-mission voyage into a distinct neon campaign without weakening Lane-Reading, Ambush Anticipation, pause-safe telegraphs, mobile play, or the established save and progression contract.
Rejected: Keep the packaged premium PNG fleet | Five procedural layers per mission deliver the new art direction while removing roughly 26 MB of shipped raster assets and bounding live texture residency to the active window.
Rejected: Express every encounter through weighted random spawns | Authored formations, wormhole entries, recovery beats, hazards, and boss adds give each mission a Dominant Motif while preserving ordinary encounter pressure.
Rejected: Drive new consequences from the scene clock | Choreographed waves, hazard beams, wormholes, and death relief use gameplay delta so pauses cannot erase telegraphs, compress schedules, or leak stale encounters across section boundaries.
Confidence: high
Scope-risk: high
Directive: Let every horizon glow with its own identity, every warning survive the silence of pause, and every pilot find a readable lane through the Eventide Engine.
Tested: bun run typecheck; bun run typecheck:ts6; bun run lint; bun run test; bun run test:e2e (19 passed, 3 expected project skips); bun run levels:validate; bun run knip; bun run build; bun run bundle:check; git diff --check.
Not-tested: Subjective full-campaign balance and long-session production telemetry still benefit from field play; production CDN propagation remains observable only after publication.
Release 1.2.2 - let the opening current breathe
Release 1.2.2 - let the opening current breathe
Return Solar Slipstream to its straightforward opening rhythm, preserve its readable hazard lessons, and keep performance evidence honest when the host cannot resolve the cadence being compared.
Highlights
- Removes the two extra authored enemy packets from Level 1's Prism Crossfire and Light Channel sections.
- Keeps weighted scout/fighter encounters, section pacing, hazard telegraphs, bossless progression, and the final Recovery Beat intact.
- Leaves the reusable signature-wave system and authored gameplay in later levels unchanged.
- Makes the projectile-trail A/B assertion depend on sufficient sample depth and frame delivery faster than the active 150 ms cadence.
- Records complete cadence-comparison context before assertions so failures retain actionable evidence.
- Passes the complete local release corridor across source, tests, browser smoke, level validation, build, and bundle budgets.
What changed
Solar Slipstream
- Prism Crossfire no longer injects the authored left/right scout pair on top of its normal weighted encounter pressure.
- Light Channel no longer injects the authored center fighter on top of its corridor sequence.
- Existing ring-crossfire and rock-corridor hazards continue teaching Lane-Reading without making the opener imitate later authored-wave levels.
- Campaign regression coverage now requires Level 1 to declare no signature waves while preserving the approved authored beats in Levels 5, 6, and 10.
- The current gameplay-diversity plan now reflects Level 1 as an onboarding/readability baseline rather than an authored-wave vertical slice.
Frame-pacing evidence
- Full 60-sample runs enforce the optimized-versus-legacy trail-event ratio only when both scenarios' p95 frame intervals are below 150 ms.
- Slower delivery is explicitly recorded as resolution-limited because both 18 ms and 150 ms cadences collapse to at most one emission per rendered frame.
- Ten-sample CI smoke runs continue verifying both trail paths without overclaiming a statistically or temporally unresolved A/B result.
- Frame-pacing attachments and console diagnostics now include the active interval, comparison-resolution decision, and both events-per-shot rates before any assertion can stop the test.
- The enclosing browser test allows 300 seconds for all six scenarios and final lifecycle checks while retaining each probe's own bounded timeout.
Quality evidence
- Focused campaign and wave-runtime coverage passes with Level 1's no-signature-wave contract.
- Level validation passes all ten campaign levels.
- Full desktop evidence records slow delivery as unresolved while full mobile evidence resolves the cadence and shows the optimized rate below 80% of legacy.
- The canonical release gate passes TypeScript 7, TypeScript 6 parity, lint, unit tests, 18 browser smoke tests with 2 expected project skips, level validation, Knip, production build, and bundle budgets.
Lore
Constraint: Restore Level 1's standard opening flow without weakening its Lane-Reading hazard cues, changing player economy, or removing authored gameplay from later levels.
Rejected: Remove the signature-wave system | Levels 5, 6, and 10 still use authored beats to express their distinct Dominant Motifs and Within-Level Pacing.
Rejected: Relax the trail ratio globally | The strict comparison remains in full-sample runs whenever frame delivery is fast enough to resolve the active cadence.
Rejected: Retune Solar Slipstream broadly | Removing only the two added packets preserves weighted encounters, hazards, pacing, and the final Recovery Beat.
Confidence: high
Scope-risk: low
Directive: Let the opening current teach through readable hazards and standard encounters, and let performance evidence claim only what delivered frames can resolve.
Tested: bun test tests/levelCampaigns.test.ts tests/WaveManager.test.ts; bun run levels:validate; bunx playwright test tests/e2e/game.smoke.spec.ts --grep "captures representative active-gameplay frame pacing" --workers=1; CI=1 bunx playwright test tests/e2e/game.smoke.spec.ts --grep "captures representative active-gameplay frame pacing" --workers=1; 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.
Not-tested: Subjective Level 1 feel still benefits from a dedicated manual desktop and narrow-viewport playtest; production CDN propagation remains observable only after publication.
Release 1.2.1 - steady the firing lanes
Release 1.2.1 - steady the firing lanes
Measure the intermittent combat hitch before touching the flight model, remove confirmed hot-path pressure, and keep every projectile lane readable across desktop and mobile sorties.
Highlights
- Adds a browser-harness-gated frame-pacing probe with raw interval percentiles, over-budget counts, synchronized update/render/GPU work, and runtime-load context.
- Confirms that most observed delivery delay lies outside Phaser update and the complete GPU-synchronized renderer lifecycle rather than inside gameplay simulation.
- Reduces player and enemy projectile trail emission from 18/24 ms to 150 ms while preserving direction and combat hierarchy.
- Avoids redundant audio-context suspend/resume Promise chains when the requested state is already satisfied.
- Gives enemy projectiles and trails a brighter magenta-white identity that remains distinct from cyan player fire and orange nebula backgrounds.
- Retains source-bound desktop/mobile A/B measurements and full-resolution projectile-lane evidence.
- Passes the complete local release corridor and independent final review.
What changed
Frame-pacing diagnosis
- The opt-in browser harness now records raw p50/p95/p99/max frame intervals and over-budget counts during representative gameplay.
- Each sample carries synchronized update, render-submission, and GPU-completed renderer cost plus textured-object, physics-body, particle, projectile, emitter, tween, effect-event, music, audio-resume, and laser context.
- Matched desktop/mobile scenarios separate baseline movement, active firing, trail suppression, audio-resume suppression, legacy trail cadence, and current trail cadence.
- The measurements bound the dominant observed delay outside measured Phaser update and the full renderer lifecycle; no broader browser, compositor, or hardware attribution is claimed.
Hot-path pressure
- Player projectile trails now emit every 150 ms instead of every 18 ms.
- Enemy projectile trails now emit every 150 ms instead of every 24 ms.
- Current-source A/B coverage requires optimized player trail events per shot to remain below 80% of legacy cadence in both browser projects.
- Audio context suspend/resume paths return immediately when no state transition is needed, avoiding repeated Promise-chain allocation during steady-state gameplay.
Readability
- Player fire retains its cyan upward lane identity.
- Enemy projectiles and trails move from low-contrast orange-red to magenta, pink, and white while preserving geometry, collision, speed, damage, cadence, lifespan, scale, and particle quantity.
- Harness-only evidence stages real pooled player and enemy projectiles after metrics are collected, then captures their production event and particle paths.
- Desktop and mobile screenshots under
tests/e2e/visual-evidence/show distinct cyan-up and magenta-down lanes across the orange nebula.
Quality evidence
- Focused desktop/mobile Playwright frame-pacing coverage passes against the release source.
- The canonical release gate passes TypeScript 7, TypeScript 6 parity, lint, unit tests, browser smoke, level validation, Knip, production build, and bundle budgets.
- Independent final review verifies PERF-01 through PERF-05 and closes all smoothness-feature findings.
- One advisory diagnosis gap remains for deterministic representative enemy pressure and uncommon simultaneous/timeout/destruction probe recovery interleavings.
Lore
Constraint: Smooth representative combat without weakening Lane-Reading, important firing feedback, authored Within-Level Pacing, or any level's Dominant Motif.
Rejected: Reduce all particles or add adaptive quality tiers | Broad visual downgrades would hide the measured trail pressure and make presentation depend on an unnecessary new runtime policy.
Rejected: Attribute every long frame to Phaser update or rendering | GPU-synchronized evidence keeps both phases sub-millisecond and supports only the bounded external delivery/presentation conclusion.
Rejected: Change projectile speed, collision, damage, or firing rhythm | The optimization belongs in redundant presentation work, not combat timing or pressure.
Confidence: high
Scope-risk: medium
Directive: Keep the frame budget quiet, the projectile lanes unmistakable, and every authored pressure beat intact.
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.
Not-tested: Production CDN propagation and long-session field telemetry remain observable only after publication; uncommon simultaneous, timeout, and destruction probe recovery paths retain advisory coverage risk.
Release 1.2.0 - modernize the flight deck and restore combat flow
Release 1.2.0 - modernize the flight deck and restore combat flow
Move Space Explorer onto a current Phaser 4 and TypeScript 7 foundation, prove its critical paths in real browsers, sharpen one WebGL hazard motif, and reduce regular-enemy durability friction without flattening the campaign's pressure language.
Highlights
- Upgrades the runtime to Phaser 4.2.1 package ESM with an explicit WebGL support contract.
- Makes TypeScript 7.0.2 authoritative for source, scripts, and tests while retaining a temporary TypeScript 6 compatibility gate for compiler-API tooling.
- Adds source-bound desktop and mobile Chromium coverage for boot, gameplay, Arcade collisions, generated textures, filters, particles, tweens, lazy scenes, and orientation behavior.
- Hardens resize, pause, audio, loading, persistence, and scene teardown boundaries against stale or partially destroyed state.
- Corrects Phaser 4 tint semantics and frame-rate-dependent movement feedback.
- Gives Prism Crossfire clearer hazard arcs and one measured, bounded WebGL glow pilot.
- Reduces fighter, bomber, and gunship base durability from 3/5/6 hits to 2/4/5 while preserving their hierarchy, encounter composition, attacks, hazards, and bosses.
- Expands the documented quality corridor with frozen installs, dual compiler checks, browser smoke tests, build, bundle, level, lint, test, and unused-code gates.
What changed
Engine and toolchain
- Phaser now loads through its package ESM export at exact version 4.2.1 and the game explicitly requires WebGL.
- TypeScript 7.0.2 owns application, test, script, and build type-checking.
- A pinned TypeScript 6.0.3 bridge remains only for temporary typescript-eslint compatibility and parity checks.
- Vite, ESLint, Knip, typescript-eslint, Bun types, and browser tooling move to their current release line.
- Bundle and isolated-test runners are typed TypeScript scripts rather than parallel JavaScript copies.
Runtime safety and correctness
- Real-browser probes exercise Arcade overlap callbacks, generated textures, active filters, ParticleEmitter objects, tweens, lazy scene routing, and unsupported-device behavior.
- Resize and scene ownership paths use explicit cleanup and transition guards.
- Audio context work tolerates delayed failures after scene destruction without leaking unhandled rejections.
- Registry and persisted state enter gameplay through normalized unknown-data boundaries.
- Player rotation and related visual behavior now use frame-time-aware progression.
- Damage, shield, boss phase, and asteroid feedback use explicit Phaser 4 fill/multiply tint modes.
- Loading presentation tracks real loader progress and only releases Menu handoff after required assets settle.
Readability and balance
- Prism Crossfire arcs carry stronger contrast without adding hazard geometry or changing safe lanes.
- A single internal Phaser 4 glow is measured against a no-glow baseline on desktop and mobile WebGL runs.
- Fighter durability moves from 3 to 2 base hits, bomber from 5 to 4, and gunship from 6 to 5.
- Scouts and swarms remain one-hit threats; asteroids remain two-hit hazards; bosses and adaptive boss scaling are unchanged.
- The retune reduces repetitive cleanup while preserving Lane-Reading, target priority, and Within-Level Pacing.
Quality evidence
- Desktop and mobile Chromium smoke coverage runs against current source.
- Retained Prism Crossfire screenshots and render-cost measurements remain under
tests/e2e/visual-evidence/. - CI mirrors the frozen local corridor: install, TypeScript 7, TypeScript 6 parity, lint, tests, browser smoke, level validation, Knip, build, and bundle guardrails.
- Focused durability coverage locks the intended base-hit hierarchy.
Lore
Constraint: Modernize the engine room and validation corridor without rewriting the campaign, flattening its dominant motifs, or turning pressure into enemy sponge.
Rejected: Raise player base damage | It would collapse one-hit enemy roles and amplify every upgrade instead of tuning only the durable regular roster.
Rejected: Reduce encounter composition or spawn cadence | The campaign's Within-Level Pacing and Lane-Reading pressure should remain authored by its existing waves.
Rejected: Treat the migration as a big-bang architecture rewrite | Focused adapters, runtime guards, and source-bound browser evidence reduce risk without replacing stable scene and system ownership.
Confidence: high
Scope-risk: high
Directive: Keep every safe lane readable, every hit trustworthy, and every regular target durable only as long as its combat role requires.
Tested: bun install --frozen-lockfile; 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.
Not-tested: Production CDN propagation and long-session telemetry remain observable only after publication.