# Independent CSS references for Nyx and Reprise

Captured 5 October 2026 for the local imports. Both primary KSF pages identify linear main courses in Counter-Strike: Source, forward style, 66t. The selected viewers identify `game: css`, `zoneId: 0`, `finishType: 0`, and `tickRate: 66.66666666666667`. These are external recordings, not trajectories generated by the browser implementation.

| Map | Author from KSF | Main course | Pinned BSP SHA-1 / bytes | Viewer component limit |
| --- | --- | --- | --- | ---: |
| [surf_nyx](https://ksf.surf/maps/surf_nyx?game=66t&mode=fw) | Syncronyze and Shadow Sheep | 2 checkpoints | `152ead154b26241dff136a4e0903543ce5d223ed` / 89,494,692 | 4000 |
| [surf_reprise](https://ksf.surf/maps/surf_reprise?game=66t&mode=fw) | TeMP | 3 checkpoints | `0e826d0d34c17122c4713d3176bf212ba90381d8` / 41,906,532 | 4000 |

Both decompressed BSP hashes were independently checked during entity review. Neither reviewed entity graph sets a different main-route gravity or air-acceleration cvar. The 4000 limit comes from KSF viewer metadata. Reprise additionally has exact 4000-unit X-velocity samples, while Nyx's record peaks below 4000 and cannot independently establish that cap from a plateau. Reprise exceeds 4000 in total speed, consistent with a component limit rather than a vector-length limit.

## Primary recordings and decoding

| Map / runner | Date UTC / rank at capture | Public file | Bytes / frames / bookmarks | SHA-256 |
| --- | --- | --- | --- | --- |
| Nyx / kusche | 2026-09-17 16:37:08 / 1 | [replay_css_3450_0_348352_1789663028.rec](https://ksf.surf/api/replays/replay_css_3450_0_348352_1789663028.rec?game=66t) | 231,116 / 3,171 / 5 | `d6e0bd38edbe7261131eb8ee14d752f1cbe8bd598614bc20d25e2d603bb8a849` |
| Reprise / Caff | 2023-08-20 19:20:28 / 1 | [replay_css_1995_0_340931_1692559228.rec](https://ksf.surf/api/replays/replay_css_1995_0_340931_1692559228.rec?game=66t) | 177,516 / 4,372 / 5 | `4e6e98c9bbb8aa00d02106c35300bf21e5d27fa6c1d49a3de9a50d907b6a597d` |

Nyx uses **version 3**, so treating it as the older fixed version-2 layout is incorrect. KSF's own [public replay reader](https://ksf.surf/gokz/js/replayviewer.js) documents a self-describing frame size and an extension block. The captured source is `fixtures/ksf-replayviewer-2026-10-05.js`, SHA-256 `be8222c64b99151cdd7d542e30a2735d3d110de08a5f60d3b0a3343c2f3c552d`; it was inspected as inert text and never executed.

Nyx's header specifies 18 cells per frame and 40 extension cells: 184 header bytes, then five 524-byte bookmarks, then 72-byte frames. Reprise uses a 16-byte version-2 header, the same bookmark layout, and 40-byte frames. The independently written decoder validates the exact total byte length, supported version/dimensions, source hashes, finite state values and bookmark bounds.

Version 3 retains the ten-cell version-2 prefix and adds flags, command number, command tick count, forward movement, side movement, mouse fields and upward movement. The public reader defines flag bit 0 as grounded and bit 1 as teleported. All Nyx frames have flags 0 or 1; none has the teleport bit. The optional decoded `command` fields retain the recorded magnitudes. For example, frame 10 has a forward button but **forward movement 200**, and frame 38 has side movement 200. Reconstructing every pressed direction as 400 would discard available evidence.

The extension is described by the public reader as a client-cvar snapshot, but that reader does not name its cells. Its raw bytes and cells are preserved under `extension`; no server settings are invented from their numeric values. Mouse fields are retained under the public reader's labels but are not used for movement reconstruction. Command/view sampling phase remains subject to behavioral validation: comparisons use current-frame buttons/magnitudes and following-frame view angles, matching the established version-2 convention.

Fixtures retain the existing `{source,header,bookmarks,frames}` interface, adding optional version-3 metadata. Reproduce offline with `node --import tsx scripts/decode-nyx-reprise-replays.ts`; `--fetch` refreshes only these two primary sources. Existing map fixtures are untouched. `fixtures/nyx-reprise-source-metadata.json` preserves full viewer settings and page/file hashes; `fixtures/nyx-reprise-telemetry-summary.json` contains exact landmark and discontinuity states.

## Spawns, timing and route landmarks

Nyx's authored `map_start` is `(14120,-8248,2216)`, yaw 270. The record starts stationary and grounded at `(14309.7138671875,-8314.7939453125,2072.03125)`, yaw −70.5547103881836, pitch 20.42475128173828. This is a standing position on the start deck, not the authored spawn placement. The final local spawn uses the authored X/Y and yaw at the native-supported deck height, `(14120,-8248,2072.03125)`, with zero velocity. The reason and the remaining idle-drop precision limitation are documented in `NYX-REPRISE.md`. Its bookmark target name is `allows3` throughout.

Reprise's authored `start` is `(-3360,0,14496)`, yaw 0. The first record frame is stationary at `(-3360,0,14368.03125)`, yaw 5.484618663787842, pitch 37.87740707397461. **Frame 160→161 contains a pre-start restart**: it jumps approximately 202 units back to the exact authored spawn with zero velocity, while recorded buttons still say forward. A scan that only flags travel over 256 units misses it. This reset is not reproducible from the movement-button stream; a canonical witness can begin at the authored spawn against frame 161 and replay the subsequent input. Its bookmark target names are empty.

| Map / event | Frame | Exact position |
| --- | ---: | --- |
| Nyx start | 134 | `(14121.140625,-8593.9052734375,2072.726318359375)` |
| Nyx CP1 | 995 | `(1179.7314453125,-2636.952880859375,-2254.513427734375)` |
| Nyx CP2 | 1959 | `(-6238.80078125,15311.07421875,-7130.69189453125)` |
| Nyx finish | 2837 | `(-9465.28125,-13305.673828125,-7928.17041015625)` |
| Reprise start | 334 | `(-3021.777587890625,-266.7193603515625,14373.46484375)` |
| Reprise CP1 | 1346 | `(-6202.65625,374.0009460449219,3705.84033203125)` |
| Reprise CP2 | 2040 | `(2837.515869140625,-149.08895874023438,-2335.220458984375)` |
| Reprise CP3 | 2789 | `(-921.6094360351562,10052.9755859375,8177.9033203125)` |
| Reprise finish | 4038 | `(14842.236328125,-11112.6083984375,-3097.495849609375)` |

Nyx's first-start-to-finish interval is 2703 frames × .015 = 40.545 seconds; KSF publishes 40.54841995239258. Reprise's interval is 3704 frames × .015 = 55.56 seconds; KSF publishes 55.560668. Internal published split times also differ slightly from bookmark arithmetic. Bookmark positions locate events, not private zone bounds or an exact sub-tick timer rule.

Nyx has authored `zone_map_start` (`*58`) and `zone_map_end` (`*55`), but no authored main CP triggers. Its `d_cp1`–`d_cp4`, `n_cp*` and `f_cp*` entities belong to a separately filtered bonus climb. Main CP boxes therefore need explicit local provenance. The reviewed CP1 corridor lies between world-wall X limits 256 and 2048; a local gate near Y −2656 crosses the native line at CP1. The CP2 corridor lies between Y 13824 and 16192, with a local gate near X −6208 crossing the later westbound line. These are geometry- and bookmark-supported local choices, not recovered KSF boxes.

Reprise has authored `start_zone` (`*102`), `end_zone` (`*103`), and `checkpoint_1`–`checkpoint_3` (`*106`–`*108`). The checkpoint slabs are approximately one unit thick, so their compiled convex members and swept hull contact must be retained. CP2 has a more complex compiled footprint; an enclosing box alone is insufficient.

## Nyx map effects

The main course has no recorded teleport discontinuity. Most map teleports are failure returns to `map_start`; bonus, filtered climb, top/end and other auxiliary destinations must not become unconditional main progression. The `allows3` target name identifies an entity state, not a new movement profile.

Two authored `nojump_zone` triggers use `player_speedmod` named `nojump`, spawnflags 4. Both issue `ModifySpeed 0.9999` on entry and restore 1 on exit:

- Main-route `*80`, Hammer ID 1244381: world bounds `(-4864,3584,-2879.989990234375)` to `(-3072,5120,-1280)`, preserving its eight-face compiled shape.
- Bonus-route `*61`, Hammer ID 1098600: `(1120,14784,-14560)` to `(3936,16320,-12960)`.

The public record crosses main volume `*80`. All **45** next-tick samples 1233–1277 match within the original 0.002-unit position and 0.002-unit/s velocity tolerances when the authored movement-time scale applies. Its effective binary32 interval is 0.014998499304056168; observed free-flight gravity differences are approximately −11.9988 rather than −12. The reference test also runs an unscaled negative control at frame 1250, which exceeds the same position tolerance. This recording supports the time scale; it does not independently demonstrate jump suppression because that segment does not press jump.

Nyx's 1900-unit push `*84` points along `(pitch45,yaw270)` and belongs to the separate first bonus. It is not a main-course assist. Its `logic_auto` drives lighting and rotating-button settings, not a main-route movement cvar.

## Reprise landmark transfers

These are ordinary authored `trigger_teleport` entities with a landmark, player flag 1 and no disabled state:

| Model / Hammer ID | Landmark origin | Destination origin | Translation |
| --- | --- | --- | --- |
| `*16` / 30737 | `mark1 = (-2752,-210.971,-8160)` | `dest1 = (6880,10925,10208)` | `(9632,11135.971,18368)` before binary32 rounding |
| `*27` / 38980 | `mark2 = (-11104,11168,-3071)` | `dest2 = (-544,-10400,6625)` | `(10560,-21568,9696)` |

The [Valve reference](https://github.com/ValveSoftware/source-sdk-2013/blob/b8cfb12c0e083a2ef5b2f9f9b50f3902fa034474/src/game/server/triggers.cpp#L2181) uses the player's offset from the landmark and leaves view angles unchanged. Here, independent CSS records also verify that behavior:

- **2229→2230:** `(-2727.923828125,762.0137329101562,-7433.17333984375)` becomes `(6844.1259765625,11899.919921875,10933.93359375)`. XY velocity remains exactly `(-3996.673828125,128.9822235107422)`, Z changes −53.5150146484375 → −65.5150146484375 through normal gravity, and pitch/yaw remain exactly `(18.809371948242188,177.72171020507812)`.
- **3482→3483:** `(-10923.642578125,9873.9404296875,-3059.682373046875)` becomes `(-323.060546875,-11669.099609375,6611.5986328125)`. Velocity follows ordinary recorded air input and gravity rather than zeroing; the view remains the runner's next input angle, not either destination's authored `(0,0,0)`.

Both imported transfers match native destination position exactly and velocity within 0.000123 units/s under the existing strict checks. This supports translation of the completed movement-tick position with Source-style binary32 subtraction/addition; it does not justify rotation of velocity or view, resetting to the destination origin, or sweeping timer triggers along the teleport gap. It remains evidence for these specific recorded transfers, not a universal proof of every overlapping-trigger scheduling case.

## Strict comparison results and limitations

Run `node --import tsx scripts/validate-nyx-reprise-reference.ts` to regenerate `fixtures/{nyx,reprise}-native-reference-validation.json`. Expected states come from the primary files. Comparisons use imported map effects, the existing start-exit rule and fixed tolerances **0.002 position / 0.002 velocity**. They are isolated next-tick tests, not complete command-only route proof.

| Map | Passing / compared ticks | First failure | Maximum position / velocity error |
| --- | ---: | ---: | --- |
| Nyx | 1811 / 2837 | 167 | 0.250944 / 16.732029 at frame 1035 |
| Reprise | 4034 / 4038 | 112 | 202.233739 / 260.115873 at pre-start reset frame 161 |

Nyx's v3 ground flags agree with categorization for every compared frame. Of its 1026 strict failures, 1024 have collision contacts; the first has about 0.03124 units/s velocity error at compiled ramp `bsp-0-251`. The two largest remaining deviations, frames 1035 and 1906, occur while uncrouching in air. Native horizontal acceleration is about 49.725 units/s, consistent with the crouched wish-speed crop still applying for that tick; the current simulator removes that crop sooner. This is a supported ordering diagnosis, not a physics change made during this research.

Reprise's failures are frame 112 (first keydown magnitude unavailable in v2), 161 (the pre-start reset), 767 (ramp contact, 0.200909 position / 1.157070 velocity error), and 1144 (ramp contact, 0.010959 velocity error). Both timed landmark transfers pass. All failures remain in the report; tolerances were not widened and frames were not silently excluded.

`tests/nyx-reprise-reference.test.ts` checks source pins, the v3 layout and measured half-commands, the pre-start reset, all native ground classifications, and all 45 no-jump samples with a negative control. These tests do not turn the remaining strict failures into a claim of exact native parity. Private plugin manifests, all client-cvar names, version-2 analog input, and some contact/duck-state details remain unavailable. Complete canonical-spawn command witnesses and browser checks are separate integration work.
