# Classic-five route validation

This release adds `surf_beginner`, `surf_year3000`, `surf_ace`, `surf_legends`, and `surf_eclipse`. Validation has two separate purposes: independently compare imported movement against public native CSS records, and demonstrate that each complete local course can be traversed with ordinary input commands from its canonical spawn.

## External reference and limits

`fixtures/classic-five-source-metadata.json` pins the public CSS, 66t, forward-style main-course record URLs, downloaded hashes, metadata and decoder provenance. `fixtures/classic-five-telemetry-summary.json` retains start/finish bookmarks and teleport samples. The independent decoder does not import movement code.

Beginner, Year3000 and Ace use v3 native records with recorded analog magnitudes and ground flags. Legends and Eclipse use v2 records, which omit those fields. A button mask alone cannot recover analog magnitude or partial key presses, so their raw comparison assumes 400-axis input and identifies this uncertainty explicitly. The views recorded on non-landmark portal arrival overwrite the pre-portal input view; that input is also unrecoverable from the record. Last known physical view is used for those isolated ticks. Landmark portals retain the next recorded view.

Before evaluating any map, `scripts/validate-classic-five-reference.ts` declares strict single-step tolerances of **0.002 Source units** and **0.002 units/second**. These are not widened to accommodate differences. Native states supply initial conditions only in isolated diagnostic fixtures. Their next states remain external expected values. The report records first divergence, maxima, contact differences where flags exist, and all failed ticks.

Two-hop stage transitions in Year3000 and Eclipse contain intermediate entity destinations followed by actual stage spawns. They are separately audited as stage handoffs rather than counted as passing movement samples. The browser holds the portal view during that handoff; the intermediate native positions are not added as playable geometry.

The captured Beginner stage portals carry world velocity into authored destinations. Collision with the arrival enclosure subsequently removes the blocked velocity components. Ace's eight stages are a physically continuous course with native speeds well above 350 units/second across the stage boundaries. Neither behavior should be replaced with a generic stage reset. Legends' internal portal translates a landmark-relative position while retaining world velocity and view angles.

## Strict independent results

These are isolated next-tick comparisons against unchanged external records. They deliberately include failures; they are not a parity certificate. Reset-zone and timer events are excluded here and tested separately in the continuous session.

| Map | Compared ticks | Within both tolerances | Outside tolerance | First divergent native tick | Maximum position error (u) | Maximum velocity error (u/s) |
| --- | ---: | ---: | ---: | ---: | ---: | ---: |
| beginner | 3163 | 2085 | 1078 | 132 | 2208.512259 | 1412.614380 |
| year3000 | 1961 | 1383 | 578 | 208 | 0.002303 | 0.031936 |
| ace | 2787 | 2078 | 709 | 141 | 0.002058 | 0.032650 |
| legends | 2185 | 2183 | 2 | 1 | 0.957867 | 63.851815 |
| eclipse | 4277 | 4255 | 22 | 1 | 8415.554858 | 2752.319841 |

The large Beginner maxima occur at portal/finish entity transitions, including source-side ground categorization versus destination placement; the continuous witness uses a slightly different legal line through those portals. Year3000/Ace differences are much smaller, dominated by float/contact behavior (maximum velocity errors about 0.032 u/s), but still fail the predeclared strict tolerance. Their native ground flags allow a separate categorization check. Legends and Eclipse lack recorded ground flags; a zero count there means unavailable evidence. Native contact normals are unavailable in all five records.

Legends has initial settling and v2 input uncertainty. Its separate continuous witness additionally avoids an authored jail teleport intersected by the sampled record, retaining the original reset geometry. Eclipse has an additional recorded 95 u/s push effect while the captured player hull is outside the acquired BSP's authored push volume. Neither volume was shifted to fit the recording. The public replay metadata carries no BSP checksum: the acquired mirror is hash-pinned, but historical native records cannot be proven to use identical BSP bytes. Private server behavior and map-revision differences remain unresolved. Eclipse's largest isolated discrepancy is a stage-return portal touch at native tick 3735; the complete command witness avoids that touch. It is separate from the missing recorded push.

## Command-only proof

`scripts/plan-classic-five-routes.ts` reads native commands or reconstructs missing v2 input fields for offline planning. Inference against native expected states is **not** included in the independent raw reference score. The planner may adjust ordinary yaw or movement input to find a viable local line; any adaptation is declared in the associated planning fixture.

The canonical run uses the imported map's normal spawn. If needed, `appendCanonicalApproach` walks to a stationary reference start using ordinary movement commands while the timer remains ready. It never assigns a player pose or velocity. The exported replay contains only the canonical initial state and tick commands. The server's `verifyReplay` independently reconstructs the full run and requires ordered checkpoints, a finish, no reset, no practice state, and no invalid timer.

Every saved witness is simulated again under 30, 60, 144 and 240 FPS render schedules. Position, velocity, contacts, events and timing must be bit-identical at every tick. This establishes fixed-step scheduling and route playability, not exact CSS parity or human performance.

## Complete course results

All five canonical witnesses pass server replay verification, ordered progression, finish detection and the four render schedules. Every tick has identical state, contacts, events and time across schedules; first divergent tick is null. These are local command-witness times, not KSF record times.

| Map | Commands | Verified local time | Splits | Surf-contact ticks | 30/60/144/240 FPS |
| --- | ---: | ---: | ---: | ---: | --- |
| beginner | 3,801 | 45.657589 s | 6 | 1049 | Pass |
| year3000 | 1,962 | 27.533349 s | 1 | 579 | Pass |
| ace | 3,441 | 40.122375 s | 7 | 675 | Pass |
| legends | 2,184 | 30.879061 s | 4 | 276 | Pass |
| eclipse | 4,342 | 62.734865 s | 2 | 1201 | Pass |

Each report pins the geometry, literal replay and current physics-source hashes. Separate browser evidence validates the actual built application; these offline results do not substitute for browser QA.

## Witness adaptations and scope

- Beginner: ordinary 643-command walk from canonical spawn to the stationary native start, then two smooth yaw windows (maximum adjustments about 0.054° and 0.115°). These avoid problematic source/arrival contacts without changing the map or controller.
- Year3000: recorded v3 analog commands and view angles from its canonical stationary spawn, with no route adjustments.
- Ace: ordinary 654-command walk inside the start zone, then unmodified v3 native input through all eight continuous stages.
- Legends: inferred v2 analog input plus two declared crouch ticks and bounded yaw windows; the authored landmark portal and jail reset remain active. Details and literal deterministic windows are in scripts/plan-legends-route.ts.
- Eclipse: inferred v2 analog input and deliberate surf-line/timing changes through stage two to compensate for the unverified recorded push. The input history records each bounded yaw window and held-input extension. Stage one and stage three use native-derived commands. The final ramp holds D at yaw 90° until Y=-4650, then uses gentle ordinary A/D turns toward the portal. The offline planner generates those literal inputs; it is never part of the runtime player controller. The actual stage-three handoff occurs at command 2814, followed by the independently checked 1528-command stage-three segment. The full canonical replay, rather than the stage-only diagnostic, establishes completion.

The importer also distinguishes Eclipse's authored damage-only trigger model 53 from a teleport. The native route crosses this volume without resetting; treating all damage as an immediate return to start had fabricated a reset barrier. The volume remains in source metadata, and only its unconditional-reset interpretation is excluded for this map. The exact private server damage/immunity setting remains unknown.

All 21 advertised practice locations are tested through actual practice travel and 100 idle commands: no initial solid overlap, no reset, grounded at rest, and normal timing invalidated. These practice checks are separate from canonical ranked-route proofs.

## Reproduction

```sh
npx tsx scripts/decode-classic-five-replays.ts
npx tsx scripts/validate-classic-five-reference.ts
npx tsx scripts/validate-classic-five-practice.ts
npx tsx scripts/plan-classic-five-routes.ts beginner --canonical
npx tsx scripts/plan-classic-five-routes.ts year3000 --canonical
npx tsx scripts/plan-classic-five-routes.ts ace --canonical
npx tsx scripts/plan-classic-five-routes.ts legends --canonical
npx tsx scripts/plan-classic-five-routes.ts eclipse --canonical
# Optional: regenerate the final Eclipse flight using the saved legal prefix
npx tsx scripts/plan-eclipse-final-flight.ts
npx tsx scripts/validate-new-maps.ts beginner year3000 ace legends eclipse
```

Per-map command validation lives in `fixtures/{slug}-command-validation.json`; raw native next-tick comparisons live in `fixtures/{slug}-native-reference-validation.json`. Complete watch routes live in `public/replays/{slug}-complete.json`.
