# Nyx and Reprise command playability

Both complete fixtures begin at the imported map's canonical spawn and finish through ordinary forward/side/jump/duck/view commands. The trusted server verifier accepts them. No exported fixture injects a player position, velocity, contact state, checkpoint, or time. These are automated route witnesses, not human performances or claims of exact CSS/KSF parity.

| Map | Canonical commands | Timed result | Ordered checkpoint splits | Surf contact ticks |
| --- | ---: | ---: | --- | ---: |
| surf_nyx | 3,480 | 40.548546 s | 12.906594 / 27.367472 s | 1,024 |
| surf_reprise | 3,877 | 55.555266 s | 15.182544 / 25.584387 / 36.821427 s | 681 |

For each fixture, 30, 60, 144, and 240 FPS schedules produce identical player state, full movement results including contacts/segments, timer state, and events at every physics tick. Reports are `fixtures/nyx-command-validation.json` and `fixtures/reprise-command-validation.json`; their source, geometry, replay, and trajectory hashes identify the tested inputs. Fixtures are `public/replays/nyx-complete.json` and `public/replays/reprise-complete.json`.

## Independent source and route construction

Nyx uses kusche's public CSS 66t forward main-course record, 40.548419952 s, dated 2026-09-17, from [the KSF native viewer](https://ksf.surf/replays/surf_nyx/replay_css_3450_0_348352_1789663028.rec?game=66t). Its independently decoded v3 frames contain actual forward/side command magnitudes. The stationary first point is `(14309.7138671875,-8314.7939453125,2072.03125)`. A 643-command ground approach reaches that point from the unchanged imported canonical spawn, then 2,837 route commands complete the map. The approach uses normal walking and small analog taps; it does not start the timer.

Nyx's authored airborne `map_start` is `(14120,-8248,2216)`, yaw 270. The imported local canonical spawn retains X/Y/yaw and settles Z to the real deck surface `2072.03125`. This is explicitly a local spawn policy: the authored drop exposes a known difference between the double-precision collision endpoint and stored float32 position, causing an idle reset near the deck. The native first frame independently confirms the grounded deck height. No shared collision algorithm was changed to hide this limitation.

Unmodified Nyx v3 inputs first differ by more than 0.002 velocity units at frame 167 (about 0.03123 u/s), then a contact timing difference at frame 986 grows into a route failure. Two smooth, bounded yaw adjustment windows, native command indexes 850–970 and 1120–1310, make the imported route complete. The largest control knot is 0.182159 degrees. Actual forward/side magnitudes, jumps, duck inputs, and pitch remain native. Final route comparison has maximum position error 2.756160 units and maximum velocity error 16.732095 u/s; this planned witness is not a native parity result. It crosses both local CP gates and finish on the corresponding native bookmark frames 995, 1959, and 2837.

Reprise uses Caff's public CSS 66t forward main-course record, 55.560668 s, dated 2023-08-20, from [the KSF native viewer](https://ksf.surf/replays/surf_reprise/replay_css_1995_0_340931_1692559228.rec?game=66t). Native frame 161 is a pre-run restart to the exact authored canonical origin `(-3360,0,14496)` with zero velocity. The witness starts at the real canonical spawn and uses commands from that frame onward. It excludes the earlier recorded preparation rather than replaying a restart or changing the spawn.

Reprise v2 contains buttons and angles but no analog movement magnitudes. Initial reconstruction uses held movement magnitude 400, buttons from frame i, and view angles from frame i+1. Offline planning changes 23 side commands to zero to keep the complete legal trajectory near native targets through sensitive contacts. These are declared route-planning decisions, not recovered proof of the unrecorded native magnitudes. Maximum position error against aligned native samples is 3.620679 units; maximum velocity error is 72.461018 u/s. The canonical route crosses start/CP1/CP2/portal1/CP3/portal2/finish on ticks 173/1185/1879/2069/2628/3322/3877. Native frames are those tick numbers plus 161.

## Entity and collision review

The source BSP SHA-1 pins are Nyx `152ead154b26241dff136a4e0903543ce5d223ed` and Reprise `0e826d0d34c17122c4713d3176bf212ba90381d8`. `scripts/audit-nyx-reprise.py` reproduces `fixtures/nyx-reprise-entity-review.json` from those files.

- Nyx has authored start/end triggers `*58`/`*55`, and main fail teleports `*12`–`*27` target `map_start`. Its main-route no-jump trigger `*80` invokes `player_speedmod` flag 4 with movement scale 0.9999. The other no-jump trigger `*61` belongs to bonus 2. There are no authored named main CP triggers; imported CP boxes are local corridor gates informed by independent native bookmarks, not private KSF zone data.
- Nyx's 798 solid static props include the curved surf ramps. Every solid static prop has a packed PHY. Its 21 solid dynamic `portalinner2` props surround post-finish/bonus gateways. Filtered bonus checkpoint teleport logic is not enabled as main-course behavior. The lone push is in bonus 1, and no main-route cvar-changing entity was found.
- Reprise's `*16` and `*27` are main-route landmark teleports. They translate the end-of-movement position by destination minus landmark with Source float32 vector operations, preserving world velocity and view angles. Native crossings 2229→2230 and 3482→3483 independently support these semantics. Timer sweeps stop at portal touch and never cross the inter-destination gap.
- Reprise has authored start/end triggers `*102`/`*103` and thin CP triggers `*106`/`*107`/`*108`. All five authored gravity triggers set multiplier 1. Its only push belongs to bonus 2. Targetless teleport `*88` has spawnflags 0 and is inert. The BSP omits packed PHY files for three stock foliage models; the importer must retain its mounted-resource/missing-shape accounting rather than infer extra collision from visible foliage.

## Reproduction and compatibility

Run `npx tsx scripts/plan-nyx-reprise.ts nyx --canonical` and `npx tsx scripts/plan-nyx-reprise.ts reprise --join-frame 161 --canonical` to reproduce the saved command plans, canonical verification, and four schedule comparisons. `--native-only` runs unmodified input reconstruction as a diagnostic. `plan-nyx-reprise-inputs.ts` and `plan-nyx-reprise-optimize.ts` record planning changes in each map's `*-planned-commands.json`; candidate prefix clones only accelerate offline search, and each exported witness is rerun from canonical spawn.

The optional landmark branch was reviewed as inactive on the prior seven maps. `scripts/certify-legacy-physics.ts --write --reviewed-linear-noop` repeated all three original full routes under both legacy and current ranked profiles against pinned Git commit `28d009d1e42f9986c97fe22cb4151402fe4315c4`: 20,556 ticks matched byte for byte. The renewed certificate preserves their leaderboard identities while publishing actual current source hash `077f4293b446b922f602fee61592a6e5acf87f82c8bbfee5181bfddafdb5cbf7`. `scripts/validate-landmark-compatibility.ts` additionally matched the pre-change trajectory hashes for Demise 3,244, Kitsune 6,333, Aircontrol 3,312, and Lux 2,827 canonical commands. It records this evidence in `fixtures/nyx-reprise-prior-map-compatibility.json` without replacing the prior reports.

Repository TypeScript checking passed after these planner additions. Native comparison limitations, local timer boundaries, and declared command adjustments remain separate from command playability and render-schedule determinism.
