# Independent CSS reference: Beginner, Year3000, Ace, Legends and Eclipse

Captured 6 October 2026. This document records source evidence for five original **Counter-Strike: Source** maps and the KSF **66t / forward / main-course** recordings. It is an import reference, not a claim of exact private-server parity or a whole-route test result.

## Map identity and original resources

| Map | KSF credit | KSF main course | Pinned CSS BSP SHA-1 | Decompressed bytes | Original CSS upload |
| --- | --- | --- | --- | ---: | --- |
| [surf_beginner](https://ksf.surf/maps/surf_beginner?game=66t&mode=fw) | Kiiru | Tier 1, 7 stages | `812ca2188ed4ea7578d51268020d1363ea4155fa` | 17,958,137 | [GameBanana 121714](https://gamebanana.com/mods/121714) |
| [surf_year3000](https://ksf.surf/maps/surf_year3000?game=66t&mode=fw) | ArchAngel | Tier 1, 2 stages | `f65b3d9f872ef80860f6b84f6286586830e9d163` | 17,185,800 | [GameBanana 123298](https://gamebanana.com/mods/123298) |
| [surf_ace](https://ksf.surf/maps/surf_ace?game=66t&mode=fw) | Juxtapo | Tier 1, 8 stages | `f84f89ac3f1149673d21ab0264e243f7a4cf6006` | 18,521,966 | [GameBanana 121570](https://gamebanana.com/mods/121570) |
| [surf_legends](https://ksf.surf/maps/surf_legends?game=66t&mode=fw) | SintaxError | Tier 1, linear, 4 CP | `aadafc6e05c4da062e05ff2c9bfa0d7aa087417d` | 8,897,517 | [GameBanana 122424](https://gamebanana.com/mods/122424) |
| [surf_eclipse](https://ksf.surf/maps/surf_eclipse?game=66t&mode=fw) | Paper-Cut | Tier 2, 3 stages | `d3c52f25690bd03d534f6fed5d04c52bfc345836` | 15,247,243 | [GameBanana 121976](https://gamebanana.com/mods/121976) |

The [KSF/OuiSURF mirror index](https://main.fastdl.me/maps_ksfthings.html) provides the source hashes, sizes and original upload references. `scripts/download_new_maps.py` verifies decompressed bytes and SHA-1 against `scripts/fixtures/new-maps-sources.json` before accepting the cache. The download pattern is `https://main.fastdl.me/h2/{sha1}/{map}.bsp.bz2`. All five local files passed independent size/hash verification. No CS:GO or CS2 port supplies these imports.

Public upload metadata is preserved in `fixtures/{slug}-gamebanana-source.json`, fetched from `https://gamebanana.com/apiv11/Mod/{id}/ProfilePage`. All five identify Counter-Strike: Source and `isPorted: false`. Their published licence panels list **CC BY-NC-ND 4.0**, and their checklists ask permission for redistribution, distributing modified versions or reused parts, and disallow commercial use. These notices do not establish permission for publishing a converted browser map. No author permission grant or contact is claimed here. The Year3000 upload explicitly says it is a third-party repost crediting ArchAngel, so its uploader must not be mistaken for the creator.

Additional credits: Ace's bonus is by **Syncronyze**, skybox by **komaokc**, textures by **Silkroad**. Eclipse credits Paper-Cut for the skybox/jail concept and **Turkey Eater** for jail scripting. Full original credit lists remain in the captured metadata. Ace's creator describes the release as tier 2 while current KSF classifies it tier 1; this project uses the selected KSF category. The creator also explicitly describes Ace's stages as flowing together. Eclipse's original notes specify 66 tick and say the map will not function correctly at 100 tick.

## Pinned native recordings

Every public viewer was checked for `game: css`, `zoneId: 0`, `finishType: 0` and `tickRate: 66.66666666666667`. Main pages were requested with `game=66t&mode=fw`. The matching simulation interval remains Source's float32 0.015 (`0.014999999664723873`), not 1/66. The displayed category is nominal 66t.

| Map | Runner / recorded UTC | Format | Frames | Bookmarks | Published seconds | Main start → finish frame |
| --- | --- | ---: | ---: | ---: | ---: | --- |
| Beginner | kusche / 2026-09-16 13:23:37 | v3 | 3,497 | 15 | 45.72529602050781 | 114 → 3163 |
| Year3000 | .x / 2026-09-18 21:27:33 | v3 | 2,297 | 5 | 27.537572860717773 | 127 → 1963 |
| Ace | stupid parrot / 2026-09-25 18:20:48 | v3 | 3,121 | 17 | 40.13575744628906 | 112 → 2787 |
| Legends | crashfort / 2023-05-30 09:31:57 | v2 | 2,241 | 7 | 30.314626 | 164 → 2185 |
| Eclipse | rulldar / 2021-05-22 13:57:30 | v2 | 4,577 | 7 | 61.799152 | 161 → 4281 |

Pinned files:

- Beginner: [viewer](https://ksf.surf/replays/surf_beginner/replay_css_1019_0_348352_1789565017.rec?game=66t), [native bytes](https://ksf.surf/api/replays/replay_css_1019_0_348352_1789565017.rec?game=66t), 259,828 bytes, SHA-256 `29611e4d1f2a1978adfbee3e374427cb54bb04f45c5520d20600022d92a21901`.
- Year3000: [viewer](https://ksf.surf/replays/surf_year3000/replay_css_587_0_712551_1789766853.rec?game=66t), [native bytes](https://ksf.surf/api/replays/replay_css_587_0_712551_1789766853.rec?game=66t), 168,188 bytes, SHA-256 `176d14fe1023b9b1e6719c7eae235a0d7e519eebebb5497de2991694cdfe5797`.
- Ace: [viewer](https://ksf.surf/replays/surf_ace/replay_css_1971_0_937143_1790360448.rec?game=66t), [native bytes](https://ksf.surf/api/replays/replay_css_1971_0_937143_1790360448.rec?game=66t), 233,804 bytes, SHA-256 `705ecb8e725732a0bd8ea9822090a1939ef10c07c1ff30ac2bbb354d8c928da2`.
- Legends: [viewer](https://ksf.surf/replays/surf_legends/replay_css_287_0_197328_1685439117.rec?game=66t), [native bytes](https://ksf.surf/api/replays/replay_css_287_0_197328_1685439117.rec?game=66t), 93,324 bytes, SHA-256 `b6452d9cd8a268320800901c24583c01daa4acb6175fe663360e22ad2aefc407`.
- Eclipse: [viewer](https://ksf.surf/replays/surf_eclipse/replay_css_407_0_449650_1621691850.rec?game=66t), [native bytes](https://ksf.surf/api/replays/replay_css_407_0_449650_1621691850.rec?game=66t), 186,764 bytes, SHA-256 `29739fb70f78430037ea1dd7fce515cae45fc70df3064e1a2fe53ab519f1b131`.

Beginner's fastest three downloadable records had no stationary prestart sample. A bounded search found rank 4's v3 recording with a stationary grounded launch; this supplies actual analog commands and contact flags. Legends' first downloadable record began airborne, so rank 2's stationary launch was selected. The search order/results are preserved in `fixtures/beginner-stationary-record-search.json` and `fixtures/legends-stationary-record-search.json`. Record rank is capture-time metadata, not a live ranking claim.

`scripts/decode-classic-five-replays.ts` decodes offline; `--fetch` refreshes the **pinned filenames** and rejects changed hashes/lengths. It never silently selects a new fastest record. It rejects unsupported layouts, nonfinite state/commands and invalid bookmark bounds. V3 uses 184-byte headers here (40 extension cells), 524-byte bookmarks and 72-byte frames (18 cells). V2 uses 16-byte headers and 40-byte frames. The v3 opaque extension is retained without inventing setting names. The [public KSF reader](https://ksf.surf/gokz/js/replayviewer.js) was rechecked against `fixtures/ksf-replayviewer-2026-10-05.js`: identical SHA-256 `be8222c64b99151cdd7d542e30a2735d3d110de08a5f60d3b0a3343c2f3c552d`. That downloaded code is inert reference text, never executed.

Exact frame evidence lives in:

- `fixtures/{slug}-native.rec` and `{slug}-ksf-telemetry.json`: native bytes and decoded state/commands.
- `fixtures/classic-five-source-metadata.json`: provenance, capture dates, page hashes, primary viewer context and published splits.
- `fixtures/classic-five-telemetry-summary.json`: every native landmark, speed extrema, stationary samples and position discontinuities.
- `fixtures/classic-five-native-event-windows.json`: unchanged native windows around every bookmark and portal discontinuity. This file includes stage starts, stage exits, finish states and the frames on both sides of each portal.

## Launches and stage semantics

Source coordinates are X/Y horizontal, Z up, feet origins. These stationary positions are **native runner positions**, not automatically the authored or shipped canonical spawn:

| Map | Stationary join frame | Native feet position |
| --- | ---: | --- |
| Beginner | 0 | `(-330.0436706542969,70.48346710205078,320.0313415527344)` |
| Year3000 | 0 | `(-368.2182312011719,-2821.647216796875,9095.55078125)` |
| Ace | 0 | `(-1538.6593017578125,105.21258544921875,3232.03125)` |
| Legends | 1 | `(6524.7099609375,8055.4599609375,12334.7998046875)` |
| Eclipse | 1 | `(-11076.2001953125,9883.3203125,12114.2001953125)` |

### Beginner: direct momentum-preserving portals

Stage 2–7 enter bookmarks are frames **266,548,904,1333,1826,2399**; corresponding start-zone exits are **340,637,994,1398,1905,2467**. Portals snap one frame before each enter bookmark, at **265,547,903,1332,1825,2398**, to the authored destinations below. They retain incoming world-space velocity, with ordinary gravity/contact effects afterward. They do **not** use Kitsune's zeroed horizontal arrival.

| Arrive stage | Authored destination | Exact portal feet | Yaw |
| --- | --- | --- | ---: |
| 2 | failman2 | `(2528,2240,672)` | 90 |
| 3 | failman3 | `(1456,272,928)` | 0 |
| 4 | failman4 | `(2720,5888,832)` | 180 |
| 5 | failman5 | `(-5792,-1632,2736)` | 0 |
| 6 | failman6 | `(-2320,104,2392)` | 90 |
| 7 | failman7 | `(-5312,640,2784)` | 90 |

For example, frame 265 lands at stage 2's authored origin with XY velocity `(196.1869659423828,914.3314819335938)`; frame 266 has moved to `(2530.94287109375,2253.715087890625,661.852294921875)` with the same XY velocity. Platform/wall contact later reduces speed. The finish bookmark frame 3163 is another authored teleport to `Endman_poop`, `(-5847.8798828125,7312,-656)`, yaw 270; it also retains momentum. The separate end-area antics/secret/combat features are not needed for main-course timing.

### Year3000: selected KSF route differs from original combat destinations

The chosen route reaches the western authored `trigger_teleport *36`, which targets `stage03_ct`. Native frames **800→801→802** instead show a two-step handoff: frame 801 at `(0,0,11000)` still has incoming momentum, frame 802 at **`(716,-10598.5,626)`**, yaw 90, velocity **`(0,0,-6)`**. Stage 2 enter is frame 803, start exit 908. The native arrival differs from the BSP's `stage03_ct` `(375,-10962,519)` and `stage03_t` `(727,-10962,519)`. It must be recorded as an observed KSF route override, not claimed to be the stock entity destination. Private plugin source is unavailable.

The original map also contains routes with destinations named `stage02_*`, team/combat spawn routes and jail teleports. These names alone do not define the selected KSF two-stage main course. The finish event is native frame 1963 at `(-5837.798828125,7417.9951171875,-5155.92138671875)`; this is an event sample, not a recovered private timer box.

### Ace: seamless staged route

Stage 2–8 enters occur at **328,561,895,1130,1447,1917,2328**; exits at **356,584,913,1144,1466,1930,2342**. There is **no position discontinuity** through any of these stage boundaries. Native horizontal speed remains approximately 1,150–2,617 u/s at these later exits. Applying a generic 350 start-exit cap to each would be demonstrably wrong. Stages are useful progress/recovery points in one continuous physical course.

The BSP contains authored `1z`…`8z` triggers, companion `a1`…`a7` triggers and per-stage `s1`…`s8` destinations for recovery. They need direct geometry review, not artificial portals between the continuous sections. The final portal at frame **2786** goes to authored `mapend` `(-11136,2304,9185)`, yaw 0, retaining world momentum. The finish bookmark follows at 2787. Bonus filter/boost systems operate in the separate bonus area and must not be applied globally to main-course movement.

### Legends: landmark-relative transfer

The four CP bookmarks occur at **609,1002,1234,1673**. `trigger_teleport *41` uses landmark **`course2off`** `(-9980,-5568,-12376)` and destination **`course2`** `(-9980,-5568,14240)`. The translation is exactly **`(0,0,26616)`**. Native frames **1236→1237** preserve the player's relative XY/vertical offset, view and momentum. Do not snap to the destination point or rotate velocity by its yaw. The native displacement is the end-of-tick movement plus the 26,616-unit Z translation, consistent with the separately verified landmark behavior already used by Reprise. Another authored landmark `landmark_top` exists in the start-area return route; the selected full run does not cross it.

The finish bookmark is frame 2185 at `(8157.2724609375,-9440.861328125,-2851.014892578125)`. Main-route push volumes and combat/jail entities must be reviewed independently; simply importing every push as a global effect would be incorrect.

### Eclipse: delayed arrivals with zeroed momentum

Stage 2 uses `trigger_teleport *81`, target `stage2_nomove`; stage 3 uses `*80`, target `stage3_nomove`. Native frames **1070→1071→1072** first pass through `(12854,-13627.9990234375,-15104)` with incoming momentum, then arrive at authored **`(-10299,-4048,11884)`**, yaw 0, velocity `(0,0,-6)`. The second transition **2748→2749→2750** first passes through `(11794,-13326,-15104)`, then arrives at authored **`(4870,-2395,2196)`**, yaw 90, velocity `(0,0,-6)`.

Stage enter bookmarks follow at **1073 and 2751**, exits at **1186 and 2882**. The intermediate positions are recorded handoffs and should not cause an invented swept world-space path or a visible camera trip across the map. The record establishes the delay and final states, but does not identify whether a private plugin, modified entity, or exporter causes every intermediate detail. Original failure, team/jail and movement-control chains are separate from these successful main-route arrivals.

The finish bookmark is frame 4281 at `(4665.080078125,-14856.18359375,-3805.93505859375)`, travelling upward at `1504.32666015625` Z velocity. Ending the run requires the actual course gate; it must not assume a flat floor landing.

## Movement settings and limits

All five viewers report `maxVelocity: 0`, meaning unspecified, not a zero speed limit. Ace's compiled `logic_auto` (Hammer ID 11600) explicitly requests `sv_airaccelerate 150`, `sv_maxvelocity 3500`, and `sv_enablebunnyhopping 1`. No `sv_*` output was found in the other four compiled entity audits.

Legends' selected record repeatedly reaches exactly ±3500 on X/Y/Z while total speed exceeds 3500, supporting a **component limit**, not a vector-length limit. Eclipse reaches exactly 3500 on Y. Beginner and Year3000 do not reach a component limit in the selected records; 3500 remains the shared CSS/KSF-default inference there, not a measured saturation result. These facts do not prove all private KSF settings, start-zone policies, filter behavior or current live plugin versions.

V3 analog movement and ground/teleport flags are retained for Beginner, Year3000 and Ace. Legends/Eclipse v2 lack analog magnitudes and contact flags; button-to-command reconstruction is consequently uncertain. The view sampled on a teleport frame may be the destination angle rather than the actual command angle. Report that ambiguity rather than treating contact or portal mismatches as numerical noise.

## Validation boundary

The predeclared isolated comparison tolerances are **0.002 Source units in position** and **0.002 u/s in velocity**. Expected values must come from these pinned external records. Preserve first divergence, maxima, contact mismatches and every failure; do not loosen thresholds after seeing results. The bookmark interval multiplied by nominal 0.015 differs slightly from published records (including −0.009704 seconds for Beginner and +0.010757 seconds for Ace when computing published minus bookmark time). This does not recover the private KSF sub-tick timer algorithm or exact zone boundaries.

A native recording is independent reference evidence, not by itself proof of browser surfability. The integrated map still requires unchanged collision import, legal command-only canonical-spawn witnesses, server replay verification, 30/60/144/240 FPS equivalence, and actual browser checks. Source states must never be injected into those witnesses. Route/renderer validation and their remaining gaps belong in the implementation report after those checks run.

## Trigger revision uncertainty found during route validation

Legends' native frames **1251→1252** sweep through the authored enabled jail trigger `*60` while both sampled endpoints remain outside. Frames **1317→1318** cross the authored enabled jail trigger `*43`, with the final native sample inside the volume. These are separate discrepancies: the second cannot be explained solely by a swept-versus-sampled touch difference. Both triggers target `jaildest1`, have `StartDisabled=0`, permit players and carry no filter in this pinned BSP. `fixtures/legends-planning-evidence.json` preserves native states, exact brush bounds and standing-hull crossing intervals. The file's `*43` main brush spans `(-10944,-8448,11520)` to `(-8192,-5294,11616)`; the recorded final feet are inside it.

The public KSF viewer payload contains `replayUrl`, `map`, `tickRate` and `hudContext`, but no BSP checksum/revision. The public v2 reader/file layout supplies no matching map hash either. The pinned mirror SHA-1 establishes the acquired BSP's identity; it does **not** prove that a historical server recording used those identical bytes or entity settings. No public evidence of a specific KSF removal/override was found in this bounded source review. Both authored reset triggers remain present.

Legends now has a complete **2,184-command** canonical-spawn witness accepted by the server verifier at **30.879061 seconds**, with all four checkpoints. Its 30/60/144/240 FPS schedules match exactly. `scripts/plan-legends-route.ts` reproduces it using the explicit inferred half-strafe at native frame 1123, ordinary one-tick crouches at command indices 1250 and 1316, and two bounded yaw windows (indices 1270–1330 and 1320–1440). The largest actual yaw difference is **5.589444 degrees**. The route clears both unchanged jail volumes and rejoins the downstream ramps. Its maximum continuous deviation from native is about **46.2923 units**; timing/geometry differences and v2 input inference remain explicit. This is a legal local route, not a claim to reconstruct the native run exactly.

Eclipse's route review also found native X displacement consistent with a −95 u/s base force around frames 1680–1683 outside the compiled `trigger_push *14` bounds. The acquired BSP declares speed 95, direction −X, bounds approximately `(-999,-7637,7476.63)` to `(-922,-7125,8052.63)`, while native frame 1680 is near `(-939.2366,-7005.5137,8160.8872)`. Those bounds are retained. The same absence of historical BSP fingerprints/private entity configuration prevents attributing the mismatch to a particular revision or plugin. It is not justification to enlarge an authored force volume to fit telemetry.
