# Rookie, Whiteout, Citypop, Summit and Hourglass

Local CSS imports prepared on 10 October 2026. This document is not a production deployment announcement. The existing twenty collision bundles, rules and leaderboard identities remain unchanged. A subsequent player-requested visual correction restores Demise's red ramp reflections.

| Map | Author | KSF course | BSP SHA-1 |
| --- | --- | --- | --- |
| surf_rookie | Kiiru | Tier 2, 18 stages | 25f056b0825b02a26e0e5af5ca6684a5652fb51a |
| surf_whiteout | Phurix | Tier 1, 6 stages | e9637f2b8a1ba44b58359aa2bcbb52f1d7f2699c |
| surf_citypop | house / housegamer | Tier 1, linear, 2 checkpoints | 590ebfb714f89b445bff14739e37f066cd22ed54 |
| surf_summit | Juxtapo & Phurix | Tier 1, linear, 3 checkpoints | bca495c015816b91ab9007b30b10dc896606f641 |
| surf_hourglass | Masog | Tier 1, linear, 2 checkpoints | ae04ff26dc2bea7273017c87391b6786e1da27f5 |

The source registry pins BSP sizes, hashes and download URLs. `fixtures/rookie-five-source-metadata.json`, each map's captured KSF page, and `fixtures/{slug}-gamebanana-source.json` preserve course classification, original credits and licence evidence. The exact downloaded CSS BSP is used for both rendering and collision. Bonus, jail, combat and soundtrack modes are not added as playable courses.

## Course details

**Rookie:** eighteen authored stage spawns, correctly ordered timer convexes, stage failure portals and original boosters. Both independent CSS records distinguish delayed zero-velocity arrivals at stages 2, 4, 5, 7, 8, 10, 11, 12 and 16 from momentum-preserving arrivals at the other stages. Reviewed failure portals use their destination stage's handoff policy; failed-run native captures were not available to independently establish every private KSF failure policy. A map-only `pushTiming: after-movement` option reproduces Touch registration after movement: the initial free-fall tick is -12 Z velocity, followed by -42 under the 1200-unit downward push. The first moving tick after a delayed stage arrival is -18, then -48. Portal/restart boundaries clear the pending force; practice saves retain it. The complete witness includes eight ordinary idle commands after stage 17 arrival, rather than correcting the player pose to the native recording.

**Whiteout:** all authored main-course landmark portals preserve relative position, world velocity and view. Stage 4 uses its original ordinary snap destination. The connected-stage policy avoids applying a fresh 350-unit cap at each intermediate checkpoint. The initial ranked cap still applies. Left/right player-name setter volumes and filtered return portals are retained separately. Models 76/77 are name-setting convexes, not evidence of private KSF timer boxes; the local start is their deck-height bounding union. Stage 3 keeps the union of both alternative arrivals, without filling their intervening gap. The independent older recording reaches an exact 3500 component clamp, despite malformed map logic requesting 10000, so the imported cap is 3500.

**Citypop:** original start/end and two main checkpoint convexes, all reviewed main failure triggers, original geometry and materials, and the map's 5000 velocity limit. Bonus-specific base velocity/gravity/output behavior remains excluded from the main course.

**Summit:** original checkpoint hulls, including both CP1 doors, finish and failure volumes. The local start gate is aligned to the spawn deck; no authored main start trigger exists. The fifteen delayed player-name triggers and matching filtered failure teleports are executed in deterministic tick time. Treating those teleports as unconditional resets would incorrectly interrupt normal surfing. The original 0.24/0.27/0.30-second sequence was checked on an isolated native CS:S server: an added zero-delay StartTouch name marker appeared at 0.224976, `filter_fail` at 0.465027, and restoration at 0.494995 seconds. Relocation-to-contact timing is not used as the event's origin. Native traces also verify the two unusual `SOLID_BBOX` rocks: rotated studio hulls enclosed in world-axis-aligned boxes, rather than their separate VPhysics meshes. Five native point traces agree within 0.002 units. Source velocity limit: 10000.

**Hourglass:** original start, two checkpoints, finish, push zone and final portal; velocity limit 5000. The imported main course finishes through the original exit. Its v3 native records contain analog movement inputs, which the other four maps' v2 records lack. The authored first checkpoint fires earlier than the private KSF bookmark; it has not been moved to fit a replay.

Rookie and Whiteout contain eight compiled brushes with contradictory bevel intersections. The existing explicit opt-in uses the original six axial planes only for conservative broadphase bounds and retains every original collision plane. Nothing is silently dropped or replaced with simplified ramp collision. Evidence: `fixtures/rookie-five-compiled-brush-review.json`.

## Validation and limits

All five have complete ordinary-command witnesses from canonical spawn, accepted by the same server verifier as player uploads. No poses, velocities, contact flags or practice travel are injected into these witnesses. Every state, contact, event, split and time matches at 30, 60, 144 and 240 FPS schedules. Reports: `fixtures/{slug}-command-validation.json`; commands: `public/replays/{slug}-complete.json`; reproducible plans: `fixtures/{slug}-canonical-plan.json`.

All 27 practice destinations settle for 150 neutral ticks with no fall/reset and remain explicitly unranked. Four additional ordinary-command tests reach Rookie stages 10/18 and Whiteout stages 5/6, deliberately stop steering, and fall into the original return portals. Each returns exactly once to its current stage, retains its command history and checkpoints, and continues its valid timer through 600 ticks with no secondary reset. The focused tests additionally cover filtered returns, pending-force restart/save behavior, delayed output expiry and native rock traces. Browser results, including full Watch playback, real keyboard/Pointer Lock, every staged practice destination, map switching and three menu widths, are written to `fixtures/browser-new-map-results-rookie-whiteout-citypop-summit-hourglass.json`. Only a report with `completed: true` certifies that browser pass.

The independent native comparisons retain the predeclared 0.002 position and velocity tolerances. Two pinned CSS66t forward main-course recordings are decoded for each map. Their full source hashes, authors and URLs are embedded in `fixtures/{slug}[-alternate]-ksf-telemetry.json`; the ten result files are `*-native-reference-validation.json`. These are isolated next-tick comparisons, not a claim of continuous native parity. They explicitly retain failures, uncertain analog inputs in v2, categorization differences, private timing differences and two-hop stage placeholders. Rookie's large maximum errors occur at stage/portal phase differences; Citypop's capture includes a pre-run manual restart; Hourglass demonstrates a native start-push speed above Surfd's retained ranked cap. Complete local traversal does not erase these differences or prove every possible native route.

Physics remains float32 with 0.015-second ticks. The compatibility certificate compares **101,272 ticks across 26 complete prior runs**, including every existing map, with the frozen pre-import source. All old state, contacts, timing and events match exactly. All twenty existing board IDs, geometry hashes and ranked configs are preserved. New maps get ordinary new identities. No database rows or live records are changed. Evidence: `fixtures/rookie-five-compatibility-results.json`, the hash-pinned prior catalog/source/certificate, and `scripts/certify-rookie-five-compatibility.ts`.

## Original artwork and remaining rendering limits

The initial visual audit verified **508 decoded source images** and **400 native compressed textures**, with original model transforms, skins, baked lightmaps, displacement blending, cubemaps and sky transforms. Pixel/block integrity did not catch all appearance errors: player testing identified missing prop lighting/fades and reflection masks. Real renderer screenshots supply the menu previews; native poses used as review cameras are explicitly not movement evidence. `fixtures/rookie-five-visuals/` contains source asset audits, camera positions and renderer statistics.

### Player-reported lighting corrections

- **Whiteout:** static-prop v10 has a 32-bit flags field at byte 64; byte 31 is padding. The visual importer now reads the real flags without changing historical collision metadata. The 234 authored distance-fading props retain their min/max distances, including the ten tunnel transition fades. Fading uses per-instance camera distance and alpha blending. The white surface at the far end of each tunnel is an original UnlitGeneric panel, retained deliberately. The tunnel entrance should expose the intervening concrete walls instead of being covered by the nearby fade model at all distances.
- **Whiteout ramp:** prop 194 (`s2_ramp3b.mdl`) explicitly disables baked vertex lighting and has no VHV file. Its previous fallback was full white. It now uses the original LDR leaf ambient cube at the model's authored illumination position, interpolated from fifteen samples in leaf 2313 and evaluated against world-space vertex normals. Existing VHV data is preserved. This ambient fallback is an independent approximation of Source's runtime lightcache; dynamic lights and exact native lightcache interpolation are not claimed.
- **Citypop:** load the original linear RGB `$envmapmask` images, and apply the authored reflection contrast, saturation and Fresnel parameters. The ramp's red tint remains `[0.75, 0, 0]`; its reflectivity mask controls where that tint appears. Five additional original images/native texture alternatives are included. Reflection masks are covered by pack completeness and source pixel/block validation.
- **Summit / Hourglass:** their baked lighting is present. Apply an explicit diffuse-light visibility adjustment: exposure 1.35, with shadow lifts 0.12 and 0.10 respectively. The lift fades out as illumination reaches one. This is deliberate browser visibility tuning, not Source HDR autoexposure parity. Sky, unlit surfaces and reflections are excluded; the original textures/lightmaps are unchanged.

**Demise:** its twelve red ramp materials have an authored red-tinted cubemap and no base texture. Source's [VertexLitGeneric/UnlitGeneric helper](https://github.com/ValveSoftware/source-sdk-2013/blob/master/src/materialsystem/stdshaders/vertexlitgeneric_dx9_helper.cpp) uses black diffuse colour for an environment-only material; our white texture fallback overwhelmed the reflection. The visual metadata now explicitly selects reflection-only rendering for these twelve materials and five equivalent crystal interiors. Original cubemap images and tint `[1, 0.1, 0.1]` are retained. Materials with a declared but missing base texture, and the separate unsupported animated emissive passes, are not changed. Add `demise` to `CAPTURE_MAPS` for its thirteen route views.

These features are optional metadata, enabled only for the affected imports. No existing map receives the brightness adjustment or new reflection shaping. No geometry, trigger, physics, replay or leaderboard identity changes are involved. `scripts/rookie_five_visuals.py` reproduces the corrections; `tests/test_rookie_five_lighting.py` checks pinned source flags, the missing VHV, ambient orientation, source masks and map scope. `scripts/capture-map-lighting-review.ts` captures 64 route/reference views, including near/far tunnels and the bright ramp; `CAPTURE_DECODED=1` exercises the fallback texture path. The two reviewed camera reports are `fixtures/rookie-five-visuals/lighting-native.json` and `lighting-decoded.json`.

Format and material references: Valve's public [gamebspfile.h](https://github.com/ValveSoftware/source-sdk-2013/blob/master/src/public/gamebspfile.h), [bspfile.h](https://github.com/ValveSoftware/source-sdk-2013/blob/master/src/public/bspfile.h), and [LightmappedGeneric shader](https://github.com/ValveSoftware/source-sdk-2013/blob/master/src/materialsystem/stdshaders/lightmappedgeneric_ps2_3_x.h). Binary readers and browser rendering implementation are independently authored.

Two source resources are absent from both the BSP and installed CSS fallback: Whiteout's `dev_glow/glow_yellow_008.vtf` and Summit's `models/props_fortifications/orangecone001_normal.vtf`. Citypop's beech tree requests skin 1 with only one family; Summit's tree12 requests skin 3 with only three families. The explicit `--invalid-skin-policy default` exports those decorative models with skin 0 and records that native skin fallback appearance is unverified. No generated replacement artwork was used. Source shader, water, animation, sprite and dynamic-entity limitations of the existing renderer still apply; this is not a pixel-perfect Source renderer.

## Reproduction

Use `scripts/import_new_maps.py <slug> --game-dir <installed CSS>` for collision and `scripts/import_boreas_visuals.py <BSP> --slug <slug> --map-id surf_<slug> --author <author> --game-dir <installed CSS> --texture-format lossless-webp --compressed-textures` for visuals. Add `--invalid-skin-policy default` only for the two documented decorative-skin cases. The reviewed map profiles are in `scripts/rookie_five_profiles.py`.

`scripts/check-rookie-five-imports.py --game-dir <installed CSS>` independently rebuilds all five imports in a temporary review folder and requires byte-for-byte equality with the shipped collision assets.

Run `scripts/save-rookie-five-route.ts <slug>` to reproduce each full command witness; `scripts/validate-classic-five-reference.ts <slug> <slug>:alternate` to reproduce external comparisons; `scripts/validate_new_map_visuals.py --slugs rookie,whiteout,citypop,summit,hourglass --game-dir <installed CSS>` for texture integrity. Native probe scripts/transcripts are in `fixtures/rookie-five-native/`; they require an isolated native test server and never run in production.

After source review, `scripts/certify-rookie-five-compatibility.ts --check` checks the current certificate. Run the TypeScript test suite and production build, then start `scripts/preview-rookie-five.ts`: the isolated preview serves port 4197 and the renderer audit serves 5197, with online credentials disabled. Run `scripts/browser-rookie-five-qa.ts` against the built local preview; `scripts/browser-rookie-five-offline-qa.ts` additionally checks the actual local API and map loading without mocks. `scripts/validate-rookie-five-release.ts` verifies final shipped hashes and completed evidence. Keep cloud promotion and EU/NA room-catalog propagation as a separate authorized release.
