18OE — Open for Alpha

Alpha gap summaryBugs clear — features pendinggenerated 2026-05-19
0 HIGH bugs
2 MEDIUM
0 LOW
36 missing features
7 partial
72% alpha scope complete

Bar weights: L3 step/round = 3× · L2 override = 2× · L1 data = 1×

Critical Bugs — fix before any playtesting

No HIGH bugs open.

Missing Alpha Features — not yet implemented

AreaFeature
First-round insolvency: president cash → treasury; company receives reserved 2+2; presidential cert → Open Market; president paid face value
Forced purchase — president covers shortfall; else national conversion (majors) or insolvency (minors/regionals)
Train type lock for inter-company purchases — minors may only sell to minors, regionals to regionals, majors to majors (§11.3)
Investigate `Engine::Step::Exchange` in OR step list — minor exchange abilities fire in SR only; confirm Exchange never triggers during OR and remove if vestigial
Reserved secondary shares — during Initial SR only, each player may designate one regional's secondary (25%) share as reserved; no other player may purchase it until the second SR; cancelled if regional expands to major before its first OR
Trade with another player — during own SR turn, controlling player may offer personal share trade to any other player; recipient not obligated to accept
Voluntary regional removal — player may remove one unfloated regional during Regional/Minor Phase; max 6 total
First-OR green tile exception (§11.1.9) — Phase 2 only, first OR after float: if RR cannot connect home token to any town/city via land or ferry without a sea crossing, it may lay one non-city green tile at cost of all remaining tile points; requires ≥1 tile point; cannot be exploited deliberately
All-pass price reduction — if all players consecutively pass before opening packet is sold, privates pay dividends then all items on topmost row reduce by £5; repeats; items reaching £0 must all be taken by next player
Audit OE-specific tile upgrade paths against physical manifest
N31 Lille second token slot for White Cliffs Ferry — pre-printed Lille tile needs a secondary station slot; confirm against physical map
OE19 — tile type unknown; must be identified and defined
OE20–OE22 — brown double-town path edge orientations needed
OE9–OE11 — green double-town path edge orientations needed
Verify M28 London / AA82 Constantinople / I20 Dublin / O28 Le Havre / X33 Marseille are in `yellow:` section in map.rb (edges added in 18oe_testing; section move not yet confirmed)
Verify standard tile quantities against physical tile manifest
**7.13** Minor M (CIWL) — holds 10 Pullman cars (see §11.6.2)
**8.2** Barclay, Bevan, Barclay & Tritton — owner selects one of three abilities at time of use
**8.8** Swift Metropolitan Line — from Phase 4, one controlled RR may keep one 2+2 outside train limit
Cost: token value (paying major) + token value (receiving major, same zone) + transfer fee (Normal £20 / Grand £40 / Metropolis £60)
During major's OR Transfer Tokens step: controlling player transfers one token between two majors
Selling a token: returns to charter at highest-cost open position
Basic game flow (auction → regional/minor → major phase)
Company with zero trains but holds Pullman: retain until next train acquired
Discard order: rusted trains first; Pullman voluntarily returnable to Open Market
Minor M free Pullman: if Minor M not closed at Phase 4 start, places free Pullman
Minor ability transfer
Pullman asset type — does not count against train limit; max 1 per non-national company
Pullman car revenue
Purchase from Minor M: £150 + £15 royalty; J-minor discount on price only
Purchase from Open Market: £150, no royalty; available Phase 4+
Purchase from another RR: negotiated price
Revenue bonus: +£10 × assigned train level, once per OR
Smoke spec — `Engine::Game::G18OE.new(%w[A B C D])` does not raise
Stock market movement (right/left/up/down, edge cases)
Train phase transitions (rusting, limits)

Partial Implementations — need completion

AreaFeature
**D** (Green Junction) — DTokenPlacement step; assign action during track window; any non-metro non-offboard city; Phase 5 transition already wired
**L** (Krasnaya Strela) — KrasnayaStrelaAssign step wired; train-choice before Route step; D-train doubling exception in `18oe_dtrain_doubling` (BUG-031)
**Barclay, Bevan, Barclay & Tritton** — option 3 (block DOWN): `bbbt_protect!` sets `@bbbt_protected_corp`; `sell_shares_and_change_price` override passes `movement: :none`; `finish_bbbt_sr!` clears + closes at SR end; options 1 (re-par) and 2 (reserve share) deferred to beta
**Brandt & Brandau** — `count_per_or: 2` + free tile wired; routing exclusion implemented (non-owning RRs blocked via `@bbe_hexes`); **still needed**: removal mechanic (pay terrain cost + tile point)
**Central Circle** — hex_bonus approximation (£10/£20/£40/£60 by phase via after_phase_change); SR window via extra_action:true already wired; city-as-town routing deferred to beta (BUG-032)
**Hochberg Mining** — HochbergPlacement step (rough terrain ≥ £45); routing exclusion via check_route_token override; removal mechanic pending browser test
**Swift Metropolitan Line** — SR `choose` action (Phase 4+); claim_sml_train! assigns rusted 2+2 outside train limit (buyable=false, rusted=true); num_corp_trains + must_buy_train? exclude SML train; route restriction §11.3.8 free via base check_overlap

Medium Bugs — rule violations in specific cases

IDRule violatedSymptom
BUG-034Minor E/F standalone 33% terrain discount not implementedWhen an RR owning E or F builds on matching terrain *outside* their zone (no zone discount applies), they receive 0% discount instead of 33%. The zone-augmentat
BUG-033HMLC routing exclusion hook needs validationUnknown until browser testing. `check_route_token` is called once per route; `route.paths` iteration should catch Hochberg hexes for non-owner RRs. If the hook

Low Bugs — cosmetic / edge-case

No LOW bugs open.