Imported from StevenLi-phoenix/unity-space-reentry (
AGENTS.md). Install upstream withnpx skills add StevenLi-phoenix/unity-space-reentry. Copyright stays with the author.
EMBER / Return to Earth
Project: Reentry/, Unity 6000.6.0f1 + URP 17.6. Blender 5.2 source in art/Ember.blend; reproducible art/build_assets.py exports Resources/Ember.fbx. Blender is the Steam installation under ~/Library/Application Support/Steam/steamapps/common/Blender/Blender.app.
Plan before changes, back up existing files, test every feature. Do not read secrets or print credentials. Do not modify sibling game repositories.
FlightModel.cs is pure deterministic logic. FlightTests.Run validates three winning routes, constant-policy losses, thermal/energy/range outcomes, bounds and determinism before every build. Fixed physical step is .05 seconds. FlightModel integrates SI spherical-Earth equations; only display time is compressed (8x entry, 25x glide). Preserve the user-accepted core.
ReentryWorld handles visuals; ReentryHud uses static TMP SDF fonts to avoid dynamic glyph corruption. ReentryAudio generates its own PCM. ReentryGame handles input and menus. Runtime has no AI/network dependency.
Run bash scripts/build.sh Desktop or Web; logs /tmp/ember-build.log. Native --qa captures title, entry, approach and debrief to /tmp/ember-.png without modifying best scores. Run node --test scripts/.test.mjs for the WebGL validator. Verify actual screenshots and runtime logs as well as build success.
itch.io project: stevenli-phoenix-work/ember-reentry, numeric ID 5032527. Chrome Work native controls work; the other Chrome profile's browser extension timed out. Do not assume setValue persists rich text: use native paste and verify saved content. Verify actual playable live upload separately from creating the page.
Polish: Blender exports smoothed material groups and a LandingGear hierarchy. Hull/Carbon 1024px albedo and normal maps are generated by art/material_maps.py and prepared as PBR materials by BuildReentry. ReentryPlasma integrates gas through a closed raymarch volume. _FlowTime and atmosphere parameters must be exposed ShaderLab Properties and reside in UnityPerMaterial. CoastalTerrain provides a permanent curved approach landscape; disable the old Reclaimed coastal base renderer. AssetChecks validates geometry, shader parameters, textures, sound headroom, nose direction and runway dimensions.
FlightPresentation holds tested HUD decisions: actual climb/descent, forecast comparison, horizon visibility, and UI pointer gating. --visual-qa captures plasma/ground/final fixtures; --qa is the full flight. Inspect both. Keep camera centered on the runway at low altitude. docs/VISUAL-AUDIT.md records the 85/100 follow-up.
Airframe / landing polish: VehicleAnimation binds the Blender ElevonL/R, BodyFlap, RudderL/R, GearL/R/N, GearDoorL/R/N and Wheel* pivots. Preserve animated descendants when joining export meshes. Gear rotates about hinges; never scale it. EnvironmentLighting supplies altitude-blended sky/Earth reflection cubemaps with diffuse mip levels. Hull/CarbonSurface PNG alpha controls smoothness and must import as linear data.
LandingSequence is pure presentation after the accepted 500m gate: 6x approach, 3x rollout, 70m/s touchdown, 1.9m/s² braking. FlightModel remains unchanged. Debrief waits for LandingComplete. LandingTests cover continuity, ordering, runway containment, wheel travel and zero-speed stop. --landing-qa captures flare/touchdown/rollout/stopped without saving scores. LandingEffects adds contact shadow and tire smoke; ReentryAudio adds cached tire contact and speed-driven rumble.
Successful debrief: SuccessDebrief owns the brighter welcome-home layout, a short VictoryGraphic burst and exact score reveal. Failure debrief retains its original diagnostic layout. DebriefPresentation.ScoreAt is tested for bounded, monotonic counting and instant reduced-motion display. The cached ReentryAudio.Victory cue only plays when the completed successful rollout opens its debrief; mute is respected. --landing-qa now captures /tmp/ember-v2-victory.png; combine with --reduced-motion for the static fixture, and use --failure-qa for failure layout regression. Keep the success controls under the celebration canvas, and stop updating hidden flight instruments during debrief. Inspect small text at full resolution when checking screenshots.
Publishing: GitHub StevenLi-phoenix/unity-space-reentry. Main runs C# and Node regression checks, builds WebGL with GameCI, validates the bundle and publishes ember-reentry:html5. Version tags run all checks and build WebGL, Universal macOS, Windows x64 and Linux x64 players for GitHub Releases with SHA256SUMS. PlayerSettings.bundleVersion is the version source; never hardcode it in BuildReentry. Desktop remains ARM64 local QA; MacOS is the Universal release. scripts/package-release.sh validates complete players and preserves executable permissions. Repository secrets: UNITY_LICENSE, UNITY_EMAIL, UNITY_PASSWORD, BUTLER_API_KEY. Never log values.
GameCI outputs are root-owned on the hosted runner. Packaging must read and validate execute bits, never chmod the source files as the runner user. macOS binary is named by productName (EMBER - Return to Earth), not the app directory name.
Unity 6000.6 WebGL twice exited 137 immediately after restoring the full Library on a fresh GitHub runner. Cold builds succeeded. Workflows intentionally do not cache Library across runners; reintroduce a narrowly scoped cache only after verifying a second cloud build with restored contents.
Published 1.1.2: GitHub Releases has WebGL, Universal macOS, Windows x64, Linux x64 and SHA256SUMS. docs/RELEASE-VERIFICATION.md and delivery-verification.json record the successful cloud runs and exact decoded CDN payload matches. itch.io upload 19326974 serves build 1998816 from final CI commit 94e9dc5. Its CDN serves decompressed Unity resources, so compare decoded payloads rather than gzip bytes. Chrome Work native typeText reliably persists rich HTML; setValue can alter the visible editor without persisting its internal state. Always reload and verify anonymous page content. The embed is 960x600 with fullscreen and sidebar screenshots.