# Lab Report — §KG Increment 2: The St. Petersburg → Moscow Corridor ### A second beginner ramp — low-level "kindergarten" zones, Soviet-cyberpunk cover story, honor-central **Original design lock:** 2026-07-08 · **Shipped:** `65d65c0` 2026-07-08 18:20:38 (same commit) **Pinned parent:** `65d65c0^` = **`89745ee`** (2026-07-08 17:44) · 36,758 lines **Amended:** `b2fe418` 2026-07-29 11:51 (route-drift note) · **Re-measured:** §DOC-02cw, 2026-08-22, against HEAD (38,712 lines) **Predecessor:** §KG-01 `8168f0e` 2026-07-08 17:02 — Hunt Mode + the `_monsterLevel` metric, **78 minutes earlier** **Successor:** §KG Increment 3 `d6aeefd` 2026-07-08 21:21 — the 11-quest chain > **Document class.** This is a **content/zone report**, not an engine design lock. It introduced no new > state field, no new mechanic, and no new code path — five nodes, six monsters, five terrains, eleven > road cells, and five lines of dialogue, all riding machinery that already existed. It is therefore > scored on its **census** (does the data still match the table?) and on **survival** (did the zones > outlive §WALK, §NAV-01 and §CELL-13?), not on a spec→code transliteration. --- ## ABSTRACT A fresh character begins at Birka with a seven-shard main quest that is comprehensively over their head. §KG Increment 2 adds a **second on-ramp running east**: a compact honor-central band of Soviet-cyberpunk zones along a St. Petersburg → Moscow corridor, paced so a Level-1 fighter can grind cleanly toward Level 6 with Hunt Mode biasing encounters to their level. **Re-measured 45 days after ship, the data half of this report is close to flawless.** All five nodes sit on their locked cells with their locked terrain keys, labels, NPCs and battles; all six monsters carry byte-identical stats and reproduce all six `_monsterLevel` scores to two decimal places; all five terrain pools match in content *and order*; every corpus delta the lock predicted (+5 nodes, +6 monsters, +5 terrains, +11 road cells, 5×2 dropdown options) reproduces exactly; and seven of eight line anchors resolve at offset zero on the pinned parent. **Three claims do not survive, and they are all about the road and the talking.** (1) The corridor was **not** laid with `./api.sh highway --execute` as §6, §7 and §8 assert — the ship commit lays it as a direct one-line `ROAD_RUNS` replacement, and its own message records the API path as broken; the "API-first" invariant this report self-certifies was therefore not honoured. (2) The ship's claim of *"0 new violations"* is **false for one of the four gates it names**: rebuilt ship-day trees put `check:roads` R3 at **0 at the parent and 1 at the ship** — `road cell 10,207 is impassable sea`, the Gulf of Finland, on precisely the leg §2 flagged as the sea-risk leg. Three pre-existing R2 failures held the exit code at 1 on both sides, so the new red was invisible to a pass/fail reading. (3) The five NPC signature lines shipped **inert** and stayed inert for **20 days 16 hours 45 minutes** — proven in a browser at both builds — because `NPC_DIALOGUE[node.code]` resolved to `undefined` on all five. --- ## I. INTENTION AND INSPIRATION — what this band is for **The problem.** Birka's opening is a good opening, but it is one opening. A player who bounces off the Birka Roots arc, or who simply wants to *fight* before they want to *investigate*, had nowhere obvious to go. §KG-01 had shipped Hunt Mode 78 minutes earlier and immediately exposed the gap it existed to serve: the cyberpunk ladder had no rungs below Level 4. Hunt Mode promises *"a fair or easy fight"* and the world could not supply one. **The design answer, and why it is a corridor rather than a dungeon.** A ramp should be a *place you walk through*, not a room you clear. Six road legs from The First Inn to Station 7 give the band a direction, a beginning and an end, and — because road terrain rolls no encounters — make the *travel* free so the *stopping* is the game. You choose to step off the road to fight. That is the whole loop. **The cover story, and the peel-back.** The world tells the player a lie and then withdraws it — the same technique Birka uses when "clear the vermin" turns out to be three centuries of infrastructure failure. Here, a **Mercenary Guild Recruiter** at the St. Petersburg gate is signing warm bodies for "honest work in the east." The honest work is the **Gulag Gladiator Zavod** — honor duels against decommissioned gladiator bots — and the **Skill Fabrika**, a jack-in trade school that bills in deliveries and fights. Soviet dressing throughout: *Commissar, Komsomol, Zavod* (Зaвoд, "factory/works"). **Honor is the spine.** Every zone frames combat as a *sanctioned bout* rather than a mugging. You are not knifing vermin in an alley; you are *matched* against a sparring droid with its serial number stencilled on its chestplate. Weckmann's clean-fight ethic, transplanted east: > *"These bots were gladiators before the Zavod stripped their reactors. We fight them with honor because > they fought us with it. Three duels. No poison, no ganging. You lose, you lose standing up."* > — Pit-Master Grimka, ZVD **What it adds to the game.** Three things, and the third is the one that lasted. *(a)* A **difficulty floor** — the pool occupies mLevels 1·2·2·3·3·4, and before it the weakest cyberpunk monster in the corpus was Techno-Thug at exactly 4. Hunt Mode's promise became satisfiable. *(b)* A **second act-1 geography** with five named faces, so a returning player has somewhere else to start. *(c)* A **shape** the next increment could hang eleven quests on — every §KG quest is anchored to one of these five NPCs. **What it deliberately is not.** A gate. Free-Movement is absolute: nothing here refuses a step. The corridor is *offered* to a low-level player through Hunt Mode and level-scaled pools; a Level-20 returner may walk it and be bored, and that is the correct outcome. --- ## II. METHOD (§DOC-02cw re-measurement) | Instrument | Applied as | |---|---| | Census via the real parser | `src/js/wbapi-core.js` `W.load()` on parent, ship and HEAD — never a line regex | | Anchor scoring on the pinned parent | `git show 89745ee:play.html`, all eight cited lines read directly | | Ship-day tree rebuild | `git archive 65d65c0 \| tar -x`, symlinked `node_modules`, gates run as they ran that day | | Behaviour proved in a browser | Chromium, both builds, seeded save at each of the five nodes | | Acceptance test re-run | `src/tests/integration/kg-zones.test.js` at HEAD | > The ship tree is **flat** — the `src/scripts/` and `src/js/` reorganisation is later — so an unprefixed path in > the original text is correct for its day and is not scored as an error. --- ## III. THE LOCKED DESIGN, AS SHIPPED **Projection** (`col = 180 + °lon`, `row ≈ 69.75 − °lat`). Verified live: Birka LHR `10,197`, Tallinn TLL `10,204`, Moscow SVO `14,217`, The Tungas TGS `7,217` — all four exact. | # | Code | Label | Cell (r,c) | Analogue | Terrain key | NPC anchor | Battle | |---|---|---|---|---|---|---|---| | — | TLL | The First Inn *(pre-existing)* | 10,204 | Tallinn | `inn` | Innkeeper Brynn | — | | 1 | **SPB** | Nevsky Checkpoint | 10,210 | St. Petersburg | `soviet_checkpoint` | Recruiter Volkov | none | | 2 | **KMS** | Komsomol School | 11,211 | Veliky Novgorod | `komsomol_school` | Commissar-Instructor Roshkova | none | | 3 | **ZVD** | Gulag Gladiator Zavod | 12,213 | (steppe) | `gladiator_zavod` | Pit-Master Grimka | Honor Duel — `gladiator_bot` ×1 | | 4 | **FBR** | The Skill Fabrika | 13,215 | (steppe) | `skill_fabrika` | Technician Iosif | Sim Overload — `trainer_bot_prime` ×1 | | 5 | **TVR** | Rzhev Transit Waystation | 13,216 | Tver | `soviet_transit` | Quartermaster Lena | none · `sleep:true` | | — | SVO | Station 7 (Dark) *(pre-existing)* | 14,217 | Moscow | `station_7` | — | — | **The training pool.** `_monsterLevel` (§KG-01): `score = AC + 0.35·HP + 1.5·avgHitDmg`, then `clamp(round((score − 15) / 7.2 + 1), 1, 20)`. | key | name | ac | hp | dmg | tier | score | mLevel | trophy (sell) | kill XP | |---|---|---|---|---|---|---|---|---|---| | `sparring_droid` | Sparring Droid | 9 | 5 | 1d4 | trivial | 14.50 | **1** | Cracked Servo (3) | 45 | | `komsomol_cadet` | Komsomol Cadet | 12 | 8 | 1d6+1 | trivial | 21.55 | **2** | Red Kerchief (4) | 96 | | `zavod_sparbot` | Zavod Spar-Bot | 13 | 10 | 1d6+2 | easy | 24.75 | **2** | Dented Plating (5) | 130 | | `gladiator_bot` | Rusted Gladiator Bot | 14 | 14 | 1d6+2 | easy | 27.15 | **3** | Bent Gladius (7) | 196 | | `fabrika_enforcer` | Fabrika Enforcer | 13 | 16 | 1d8+1 | easy | 26.85 | **3** | Cortex Shunt (8) | 208 | | `trainer_bot_prime` | Malfunctioning Trainer-Bot | 15 | 26 | 2d6+1 | easy | 36.10 | **4** | Prime Core (12) | 390 | **Terrain pools**, deepening west→east, at `const WORLD_DB = {@6279`; `P.commoner` (Rabid Monkey, mLevel 1) pads the two gentlest. All five verified order-exact: ``` soviet_checkpoint → sparring_droid · komsomol_cadet · commoner komsomol_school → komsomol_cadet · sparring_droid · zavod_sparbot gladiator_zavod → zavod_sparbot · gladiator_bot · trainer_bot_prime skill_fabrika → fabrika_enforcer · gladiator_bot · trainer_bot_prime soviet_transit → komsomol_cadet · zavod_sparbot · commoner ``` --- ## IV. VERIFICATION — spec → shipped → HEAD ### A. Corpus deltas (parser census, all three builds) | Quantity | Parent `89745ee` | Ship `65d65c0` | Predicted Δ | Actual Δ | HEAD | |---|---|---|---|---|---| | NODE_MAP entries | 413 | 418 | **+5** | **+5** ✓ | 416 | | NODE_COORDS entries | 413 | 418 | +5 | +5 ✓ | 416 | | MONSTER_POOL entries | 392 | 398 | **+6** | **+6** ✓ | 398 | | Trophy drop rows | — | — | +6 | +6 ✓ | present, all six | | WORLD_DB terrains | 106 | 111 | **+5** | **+5** ✓ | 111 | | Worldbuilder options | — | — | 5×2 | **10** ✓ | 10 | | ROAD_CELLS | 400 | 411 | **+11** | **+11** ✓ | 410 | The "reachability rises by exactly 5, to 418" target is **exact**. HEAD's 416 is two unrelated later removals; all five §KG nodes are still present. ### B. Anchors on the pinned parent — **7 of 8 exact at offset zero** | # | Cited | What the parent line actually holds | Verdict | |---|---|---|---| | 1 | `L3915` worldbuilder option row | `