VECTORHEAVY

VectorHeavy · Air Traffic Control Simulator

The Fidelity Ledger

Where VectorHeavy matches real FAA guidance and where it does not. Every rule below is checked against the orders, including the ones the game still gets wrong. Kept alongside the code and updated when either changes.

Why this page exists

I check the game's rules against the orders and write down what I find, including the places it falls short. If you control for a living, this tells you where the model stops, so you can trust that nothing outside those lines is faked. If you are studying for the ATSA, it tells you which behaviors are safe to learn from and which are game-shaped shortcuts.

Rules first, then data. I would rather have a made-up airport flying correct procedures than a real one flying wrong ones. Every simplification here was a choice, and the test each one has to pass is whether it teaches you something false about how the system works. If it does, it is a bug and it belongs in the last column.

Primary sources: FAA Order JO 7110.65 (current edition, BB), 14 CFR 91.117, and the AIM. Paragraph numbers follow the current 7110.65 and are stable across recent editions unless noted. This page audits the code as it stands; it does not change it.

VectorHeavy is not affiliated with, sponsored by, or endorsed by the FAA. Procedure and airport data are derived from publicly available FAA products.

Verdict key:


1. Radar separation minima

Game behaviorReal rule + citeVerdict
Flat 3.0 nm lateral minimum everywhere in the radar environment.7110.65 5-5-4: 3 nm when less than 40 nm from the antenna; 5 nm at 40 nm or more. Terminal work is almost entirely inside 40 nm, so 3 nm is the terminal number.SIMPLIFIED-OK. The whole playfield is terminal airspace inside 40 nm, so the 5-nm en-route band never applies on-scope. Right number for the modeled environment.
No 2.5 nm reduced minimum on final.7110.65 5-5-4 (reduced-separation-on-final): 2.5 nm is authorized between aircraft established on the final approach course within 10 nm of the runway, when specific site/aircraft conditions are met.NEEDS-REFINEMENT (Academy / v0.3). We are conservative, we hold 3 nm where the real world sometimes allows 2.5. That never creates a false "safe" call, but it under-rewards tight final sequencing, a core controller skill. Suggested fix: allow 2.5 nm between two established-on-final arrivals inside 10 nm, gated behind an Academy toggle so casual play keeps the simpler rule.
1000 ft vertical minimum.7110.65 5-5-4: 1,000 ft vertical below FL410.FAITHFUL. Our band tops out at ~17,000 ft, so the 2,000-ft RVSM-ceiling case never arises.
Diverging-course exemption: a pair whose present gap is opening is not flagged. The sign of the closure rate gates both the tower exemption and the CA predictor.7110.65 5-5-7 (Passing or Diverging): separation may be discontinued when courses diverge by 15° or more and targets have passed / will not touch.NEEDS-REFINEMENT (v0.3). Real 5-5-7 keys on a 15° angular divergence plus a passed-targets test. A closure-rate sign is not that test: it is stricter in some geometries and looser in others, and the loose half is what decides this row. Two nearly-parallel tracks with a tiny opening rate pass our test and would fail the order's, so the game exempts a pair the rule would not. Suggested fix: replace the raw closure sign with the 15°-divergence-plus-target-resolution test the order actually uses.

2. Wake turbulence: in-trail (radar)

Game behaviorReal rule + citeVerdict
Four weight classes (small / large / heavy / super) with an in-trail matrix: heavy-behind-heavy 4, large-behind-heavy 5, small-behind-heavy 6 nm; behind a Super 6/7/8 nm (heavy/large/small); everything else falls back to 3. Behind a LARGE leader the wake case is an ADVISORY, not an enforced minimum: a small inside 4 nm in-trail of a large draws a one-shot "caution wake turbulence" advisory, never a conflict/deal.Current standard is Consolidated Wake Turbulence (CWT), folded into 7110.65 5-5-4, a nine-category (A–I) pairwise system (Super, Upper/Lower Heavy, B757, Upper/Lower Large, Upper/Lower Small). Representative radar minima: behind Super 5–8 nm; behind Heavy 4–5 nm; small behind B757 4 nm. 7110.65 2-1-20 / AIM 7-4 make "CAUTION WAKE TURBULENCE" the controller's standing advisory tool in the terminal environment.SIMPLIFIED-OK. The matrix is the legacy distance scheme, not current CWT. The enforced values (behind heavy/super) sit inside the real CWT envelope, so no enforced call the game makes is unsafe. Small-behind-large as an advisory is a deliberate terminal-environment call: in tower/approach ops that pair is routinely handled with the wake CAUTION advisory (2-1-20) and visual/time separation rather than a radar deal, and ending a session over a Skyhawk 3.5 nm behind a 737 taught a false severity. The advisory keeps the hazard visible without faking an operational error. Behind heavy/super stays enforced, those are the accident-history cases. NEEDS-REFINEMENT (v0.3): B757 special case + CWT A–I migration (the B757 case would return small-behind-757 to an enforced 4 nm).
Wake in-trail requires the same 1000-ft band and a ±45° in-trail cone behind the generator.CWT wake application is for a following aircraft directly behind and at/below the leader on the same track/approach.SIMPLIFIED-OK. A 45° cone plus a 1000-ft band is a reasonable geometric proxy for "directly behind, same or lower altitude." Real application is also distance/altitude-below sensitive in ways we don't model, but the abstraction is honest.

3. Wake turbulence: same-runway departure intervals (TIME)

Game behaviorReal rule + citeVerdict
Modeled. When a heavy departs (rotates) off a runway end, that end carries a 120-second wake departure interval: a following takeoff from the same end is rejected ("unable, wake turbulence") until it elapses. The rule is non-waivable. Clicking TKOF during the interval issues the clearance, the pilot refuses, and a countdown ("wake interval: 1:23 remaining") shows the wait. LUAW is allowed during the interval (you may position the aircraft; the readback appends "expect one minute twenty for wake"). Blocked departures show a "WAKE m:ss" note on the strip. The gate is universal, the pattern/AI world respects it too, and it runs from the generator's rotation.7110.65 3-9-6/3-9-7 & AIM 7-4: 2 minutes for a small departing behind a heavy (full-length, same runway); 3 minutes for a small behind a heavy/large from an intersection or opposite-direction on the same runway, and that 3-minute intersection interval may not be waived. Behind a Super, 4 minutes.FAITHFUL (shipped 2026-07-06), one documented under-model. The 2-minute full-length behind-a-heavy interval, the case our single-runway/parallel model actually reaches in normal play, is modeled exactly, non-waivable, from wheels-up. The Super class now exists (§2) and carries its own non-waivable same-runway departure interval. The bounds are listed below the table: deliberate simplifications, none of them teaching a false rule in reachable play. A student can no longer learn from VectorHeavy that you may roll a Skyhawk right behind a departing 767.

Documented bounds (§3).


4. Successive / simultaneous departure release

Game behaviorReal rule + citeVerdict
Parallel-pair departures fly a 15° divergent initial climb (left runway 15° left, right runway 15° right) until 3,000 ft AGL or 5 nm, then own-nav.7110.65 5-8-3: between successive departures off the same runway or parallels < 2,500 ft apart, 1 nm separation is authorized if courses diverge by 15° or more immediately after departure (the divergent turn must commence no later than 2 nm from the departure end).FAITHFUL in spirit, well-modeled. The 15° divergence number is exactly right and is the mechanism controllers actually rely on. We model the geometry (aircraft physically splitting) rather than the 1-nm reduced-separation credit, which is the right call for a visual game. One soft edge: our divergence completes by 3,000 AGL / 5 nm, whereas the rule's trigger is the turn commencing within 2 nm. Close enough that no false lesson is taught.
The tower visual-separation exemption: a non-converging pair with either aircraft in the initial-climb/short-final "tower regime" (below 1,500 AGL, within 4 nm) is exempt from the flat 3-nm radar rule.Tower separates by visual separation (7110.65 Ch. 7) and same-runway rules (3-9-6) on and near the runway, not by radar 3-nm/1000-ft. Two parallels rotating together, or an arrival to one runway while a departure rolls the parallel, are routine.SIMPLIFIED-OK / FAITHFUL intent. The concept is right, radar minima do not own the runway environment, implemented as a bounded exemption rather than a full visual-separation model. The convergence guard keeps a genuine low-altitude head-on a violation, which is the right safety floor. The 1,500-AGL / 4-nm ring is a game constant, not a published boundary; that's an honest abstraction of "the tower's airspace."

4A. Parallel-final exemption (simultaneous/dependent parallel approaches)

Several modeled fields land parallel runways: KSEA feeds three N/S parallels (16L/16C/16R, sub-1-nm apart, the center-to-outer spacing is on the order of 800 ft), and KSTL runs 30L/30R about 1,300 ft apart. The flat 3-nm/1,000-ft radar minimum is the radar-environment IFR standard for a single stream. Aircraft established on different parallel localizers are not separated by that rule: they are separated by the approach operation itself (simultaneous independent approaches, or dependent staggered approaches at close spacing), where the runway geometry plus the localizer discipline is the protection.

Holding two correctly-established parallel arrivals to the raw radar rule is wrong: at KSEA every established neighbor sits inside 3 nm of the next, so the whole final complex paints red and a sustained false "loss of separation" can end a session no player action could have prevented.

So a pair is exempt from the radar LOS rule when both aircraft are established on the final approach course of different parallel runways of the same flow: distinct runway ends, courses parallel within ~1°, each still inside a tight established corridor (~0.5 nm cross-track of its own centerline) and inside the approach segment (from the ~12-nm gate out to the threshold). The exemption drops the flat lateral and the flat vertical (the operation separates the pair on both axes) and the wake in-trail requirement (the cross-final wake matrix is not the governing rule between two independent localizers). While either aircraft is not established (converging, JOINing, or being vectored), full minima apply, so two ships at the same altitude still cannot be blitzed toward parallel finals; they must be established (or vertically split) first. The backstop is automatic: a ship that departs its corridor loses established status and the full minima (flat + wake) re-apply and catch the geometry.

This applies identically on both clearance paths: the legacy one-step landing clearance, and the two-clearance approach flow (CA then L), where the aircraft holds the onApproach phase from the approach clearance all the way to the numbers. Establishment is read from whichever latch the aircraft carries, so the exemption, the corridor backstop, and the "not established means full minima" rule all behave the same either way.

Game behaviorReal rule + citeVerdict
What we model: two aircraft established on different parallel localizers of the same flow are exempt from the 3-nm/1,000-ft rule and the wake matrix. Establishment is a live corridor + segment test, not just a latch, so leaving the lane re-applies minima. Unestablished convergence toward parallel finals is held to full minima.7110.65 5-9 (parallel/simultaneous approaches): simultaneous independent approaches (with monitoring) are authorized to parallels spaced per the runway geometry; dependent approaches to closely spaced parallels use a diagonal stagger. In both, aircraft established on separate finals are separated by the approach authorization, not radar minima applied across the two finals.FAITHFUL intent, bounded v0. The authorization concept plus the established-corridor discipline is right, and it is the mechanism controllers rely on. The corridor width (0.5 nm), segment length (12 nm), and 1° course tolerance are game constants, not published boundaries, an honest abstraction of "established on this localizer."
What we do NOT model: the dependent ops 1.5-nm diagonal stagger, the NTZ (no-transgression zone) and its PRM/monitor controller, and any per-airport runway-spacing switch between independent and dependent rules. We apply one "both established on parallel finals = exempt" rule at every parallel field.7110.65 5-9-7 / PRM: dependent approaches require the diagonal spacing; simultaneous close-parallel (PRM) ops require an NTZ and a dedicated monitor controller who can break an aircraft off a converging path.DOCUMENTED SIMPLIFICATION. We neither reward the diagonal stagger nor simulate the NTZ monitor. This is safe because the exemption only applies while both aircraft are genuinely in their corridors; a transgression (a ship crossing toward its neighbor) drops establishment and the ordinary minima re-arm, which is the game's stand-in for the monitor break-off. CWT letter-pair wake and the reduced-2.5-on-final credit (§2, §1) remain on the refinement backlog.

5. Same-runway separation (tower, arrivals/departures)

Game behaviorReal rule + citeVerdict
An arrival inside 2 nm final with the runway occupied (a departure rolling/lined-up, or another arrival in rollout) goes around on its own.7110.65 3-9-6: a departure may not begin roll, and an arrival is not "separated," until the preceding aircraft has crossed the runway end / turned, or the preceding arrival is clear of the runway. Landmark-distance alternative: airborne + 3,000 ft (Cat I), 4,500 ft (Cat II), 6,000 ft (Cat III).SIMPLIFIED-OK. We enforce the outcome the rule protects (don't put two aircraft on one runway) via a pilot go-around, rather than the controller-side "don't clear it in the first place" gate. The 2-nm trigger is a game constant, not the rule's actual "clear of the runway" test. NEEDS-REFINEMENT (v0.3): model the anticipated-separation gate (allow a landing clearance when the preceding departure will be airborne-and-past by threshold), and the Cat I/II/III landmark distances, so the player is rewarded for tight-but-legal single-runway sequencing instead of only being punished by the go-around.
The occupied-runway go-around protects crossing and intersecting pavement, not just the same runway end: an arrival, or a pattern option / touch-and-go, goes around when a departure is rolling (or an arrival is in rollout) on any runway whose pavement its runway crosses (KSTL 6/24 × 12R/30L, KJEF 9/27 × 12/30). The protected set is computed from threshold geometry, flow-agnostic, and shared with the soak touchdown-protection law so the two can never drift.7110.65 3-9-6 / 3-9-4: separation on intersecting runways protects the intersection, a roll on one runway owns the pavement another runway crosses; an arrival may not touch down through it.FAITHFUL. The protected pavement is derived from the real runway geometry, so a landing (or a touch-and-go) onto a runway a departure is rolling across triggers the go-around, exactly like a same-end conflict. Line up and wait stays same-end only (holding in position at a crossing runway's end is not on this runway's pavement, an anticipating-separation call, 3-9-4). Intersection-departure wake and LUAW on crossing runways remain unmodeled (§3, §6).

5A. VFR separation regime (see-and-avoid)

VectorHeavy's traffic is a mix of IFR airline/GA and VFR aircraft (light singles in the pattern, VFR full-stop arrivals, VFR departures). The 3 nm / 1,000 ft radar minimum is the IFR-to-IFR standard. A VFR aircraft is see-and-avoid: it is responsible for its own separation from other traffic, receives traffic advisories and safety alerts rather than radar minima, and the controller cannot even assign it an altitude (an altitude command answers "unable, VFR"). Holding a VFR pair to the IFR 3 nm / 1,000 ft rule is wrong: it ended sessions for a "loss of separation" the player had no tool to prevent. Pairs involving VFR therefore use a lighter proximity regime, and a pair of pilot-owned VFR tracks is resolved by their autonomous see-and-avoid rather than charged to the controller.

The regime covers closed-traffic pattern aircraft for their whole circuit, not only on the arrival legs: a ship flying upwind, crosswind, downwind, base, or final at a small field remains part of the live traffic picture. An inbound VFR pilot automatically reports the airport in sight inside a modeled 12 nm visual range; only then does L become available. Outside Class B the controller assigns the runway and landing/option clearance, while the pilot chooses the visual path, distance, spacing, pattern entry, and heading; extend downwind and option/full-stop sequencing remain available pattern tools. A pilot may approximately use a published final course as a convenient geometric reference, but it receives no RNAV/ILS clearance and does not comply with procedure fixes, markers, or altitude restrictions. Class B is the heading-vector exception. VFR never accepts controller altitude, speed, or fix routing. Once L is accepted it is a durable landing goal: the pilot may fly away or around to create a realistic final and does not claim the clearance was missing. Pilot-owned VFR tracks continuously predict nearby traffic, but select and hold one maneuver through a commitment and clear-confirmation window instead of changing heading every tick. A controller heading or hold removes the autonomous-pair exemption; wake turbulence always remains authoritative. A runway conflict or controller go-around can still break off the attempt.

Game behaviorReal rule + citeVerdict
A pair with either aircraft VFR does not use 3 nm / 1,000 ft. Instead the proximity ladder is 1.5 nm AND 500 ft, with 0.5 nm AND 300 ft as the tuned near-midair floor. When both VFR tracks are pilot-owned, their see-and-avoid state machine owns prediction and resolution, so the pair produces no controller CA, red LOS, deduction, or session ending. If a controller heading/hold owns either lateral path, the proximity ladder becomes accountable again.AIM 4-4-1, 5-5-2; 7110.65 2-1-6 (safety alert), 5-5-1: VFR aircraft in Class C/D/E are separated by see-and-avoid; ATC provides traffic advisories and, when the controller is aware of a hazard, a safety alert, not radar separation minima. IFR-to-VFR target-resolution/500 ft service applies in Class C (500 ft/target resolution) and Class B (1.5 nm / 500 ft); Class D is runway separation + advisories.FAITHFUL-with-bounds. Modeling autonomous VFR-VFR spacing as pilot responsibility avoids teaching that the player must somehow vector aircraft they do not control. The ownership handoff makes a player-created conflict accountable. The 1.5 nm / 500 ft alert mirrors the Class B IFR-vs-VFR number, and the 0.5 nm / 300 ft NMAC is a tuned game floor, not a published boundary. Bounds: the game uses exact traffic state as a proxy for sight and does not model visibility/occlusion or drawn shelf geometry.
Wake separation still applies behind a heavy for a VFR pair, the wake in-trail matrix (§2) is evaluated regardless of VFR status and is never relaxed by the proximity regime, in both the live check and the predictor. A light single trailing a heavy is flagged at the wake distance and scored as a wake deal, not a VFR safety event.AIM 7-4, 7110.65 5-5-4 (CWT): wake turbulence is physics, not a procedural minimum, it does not care whether the trailing aircraft is IFR or VFR. A light aircraft behind a heavy is the textbook wake-encounter accident.FAITHFUL. Keeping the wake matrix authoritative for VFR pairs is correct, and it is the one place a VFR pair is held to a distance, because the hazard is real regardless of flight rules. The tower visual-separation exemption (§4) still takes precedence where it applies.

6. Line up and wait (LUAW)

Game behaviorReal rule + citeVerdict
LUAW (W command) is unrestricted: any holding-short departure can be told to line up and wait on any runway end, day or night, with no traffic-advisory requirement.7110.65 3-9-4: when an aircraft is authorized LUAW, inform it of traffic within 6 flying miles requesting the same runway (full-stop/T&G/option/low approach). Do not LUAW when the intersection isn't visible from the tower; night-intersection LUAW needs specific approval and a departure-only runway; no simultaneous LUAW on intersecting runways.NEEDS-REFINEMENT (v0.3 / Academy). We model none of the 3-9-4 constraints. In the current single-runway/parallel airports the "intersecting runways" and "intersection visibility" cases rarely bite, but the 6-nm traffic advisory is a routine, teachable requirement we skip. Suggested fix: require/emit the "traffic N-mile final" advisory when LUAW is issued with an arrival inside 6 nm, and (once intersecting-runway airports exist) reject simultaneous LUAW on crossing runways.

7. Speed

Game behaviorReal rule + citeVerdict
An arrival enters the TRACON at its type's descent speed, not at 250 kt: transport jets at 280 kt, turboprops and pistons at their own (lower) ceiling. Below 10,000 ft every type flies 250 or its own ceiling, whichever is less.14 CFR 91.117(a) caps 250 kt indicated below 10,000 ft MSL and imposes no limit above it; transport descent schedules above 10,000 run ~280-300 KIAS (B737 ~280/.78, A320 ~300/.78), which is the band the published STAR crossings are drawn around.FAITHFUL. Applying the sub-10,000 limit above 10,000 was the defect: it made a charted 280-kt crossing (KSTL LORLE3, GETUP 280) unmeetable by construction. 280 is the conservative end of the real band. Airspeed is modeled as a single number in a no-wind world, so IAS/TAS/Mach are not distinguished and the descent schedule does not change with altitude.
An aircraft descending toward 10,000 ft starts slowing early enough to be at 250 kt when it gets there, rather than beginning the reduction on arrival.91.117(a) requires the aircraft to be at or below 250 kt below 10,000, which means the reduction is planned before the threshold, not started at it.FAITHFUL. The lead point is computed from the aircraft's own modeled sink rate and longitudinal capability, so it arrives at the threshold on speed instead of several hundred feet low and still fast.
Assigning > 250 kt below 10,000 ft is refused ("unable, two five zero below one zero thousand"), except a declared emergency.14 CFR 91.117(a): 250 kt max indicated below 10,000 ft MSL.FAITHFUL. Correct threshold, correct value, correct emergency carve-out.
200 kt BENEATH a Class B shelf is now modelled, on both sides of the radio. An aircraft flying its OWN profile in the airspace underlying a published Class B volume is held to 200 kt, and an assigned speed above 200 there is refused ("unable, two zero zero beneath the Bravo"). Inside Class B there is no 200-kt rule and the game does not apply one. The test is a point-in-volume query against the same published polygons the scope draws (§16): laterally inside a Class B shelf's footprint, below that shelf's published floor.14 CFR 91.117(c), verbatim: "No person may operate an aircraft in the airspace underlying a Class B airspace area designated for an airport or in a VFR corridor designated through such a Class B airspace area, at an indicated airspeed of more than 200 knots (230 mph)." 91.117(b) states in as many words that it "does not apply to any operations within a Class B airspace area", which must comply with (a).FAITHFUL. The refusal to ASSIGN is the part that carries the real lesson: (a) reads "unless otherwise authorized by the Administrator" and (b) reads "unless otherwise authorized or required by ATC", but (c) carries no authorization clause at all — so it is the one speed limit in the section a controller cannot lift, and the game refuses rather than clamping. Emergencies are exempt on the same 91.3 footing the 250-kt rule already uses; 91.117(d) (minimum safe airspeed) is honoured by never clamping below the type's approach-speed floor. Bounds below.
200 kt in a Class C/D surface area is computed but not yet flown. The rule's geometry is modelled and asserted (airspaceSpeedLimit returns it, with its ATC carve-out set correctly, and the assignment path already honours that carve-out) — but the aircraft's own profile is not yet clamped inside the ring.14 CFR 91.117(b): "Unless otherwise authorized or required by ATC, no person may operate an aircraft at or below 2,500 feet above the surface within 4 nautical miles of the primary airport of a Class C or Class D airspace area at an indicated airspeed of more than 200 knots (230 mph)."NEEDS-REFINEMENT (next batch), and the reason is disclosed rather than smoothed over. Switching the clamp on is correct and slows own-profile jets through the ring at the Class C/D fields. That changed traffic picture reproducibly surfaces a pre-existing limit cycle in the VFR pilot-built visual setup — a cleared-to-land light twin at KCOU whose visual setup is torn down and rebuilt by each see-and-avoid maneuver, circling for the rest of the session and never landing. That is a defect in the visual-setup subsystem, not in the speed rule, and shipping a correct speed rule that manufactures a stuck aircraft would trade one false lesson for a worse one. The rule is written, the geometry is asserted by a soak law, and it turns on when that cycle is fixed.
A cleared-to-land arrival's assigned speed releases to its own approach speed inside 5 nm final; the player can no longer usefully assign speed there.7110.65 5-7-1: do not assign speed adjustments inside the final approach fix, or a point 5 nm from the runway, whichever is closer.FAITHFUL. Our 5-nm release is exactly the controller-side "hands off the speed" boundary the order draws.
No minimum-speed floor within 20 nm (170 kt turbojet / 150 kt turboprop) modeled as a controller constraint; instead each type has an approach-speed floor for assignment.7110.65 5-7-3: don't assign less than 170 kt (turbojet) / 150 kt (turboprop/recip) within 20 nm of the threshold.SIMPLIFIED-OK. Our per-type minimum-assignable-speed accomplishes the same protective effect (you can't slow a jet to a stall) via a cleaner mechanism. The specific 170/150-within-20-nm numbers aren't surfaced, but no false lesson results.

Documented bounds (§7, the airspace-class speed rules).


8. Altitude floors: MVA / MIA

Game behaviorReal rule + citeVerdict
Not modeled. Altitude assignment is clamped to a per-airport band floor, a flat number, with no terrain/obstruction floor and no minimum vectoring altitude.7110.65 5-6-3 / 5-6-1: aircraft must be kept at or above the MVA/MIA except on approach; MVA charts are terrain- and obstruction-derived and vary by sector.SIMPLIFIED-OK (documented major omission). Terrain separation is a whole subsystem requiring an MVA grid. Our flat band floor is a placeholder, not a claim that terrain is safe. NEEDS-REFINEMENT (v0.3+): an MVA polygon layer + a low-altitude alert (MSAW analog). Until then, VectorHeavy should not be read as teaching terrain avoidance at all, flagged prominently for ATSA-prep users. See §19: at KLAS this omission is the defining fact about the field, and it is disclosed there in full.

9. Approach vs landing clearance; missed approach

Game behaviorReal rule + citeVerdict
Two-step (batch 4) with a one-step shortcut. CA arms the published approach ("cleared ILS runway X approach", with "maintain … until established" when vectoring), then the tower's L clears the landing separately (§14). The legacy single-step L (accepted within ±60° of runway heading and ≤ 3,000 ft AGL) is preserved as a casual shortcut.Real ops are two-step: approach control issues the approach clearance ("cleared ILS runway X"), which authorizes the published missed approach (7110.65 4-8-1); the tower separately issues "cleared to land" (Ch. 3). "Maintain [alt] until established" and intercept phraseology precede it.FAITHFUL (batch 4), with a SIMPLIFIED-OK shortcut. The real two-clearance model ships in normal play (see §14 for the full row set), including the 4-8-1 vector-to-intercept phrasing and the go-around when the landing clearance never comes. The one-step L stays as the documented tower shortcut so casual play and the tutorial are untouched.
Go-around (controller A or pilot-initiated) climbs to field + 3,000 ft on runway heading and awaits vectors.A real missed approach flies the charted MAP for that specific approach (a published track/altitude/hold), not a generic runway-heading climb.SIMPLIFIED-OK. Runway-heading-climb-to-3,000-then-vectors is how a radar-vectored missed approach is often handled in practice ("climb runway heading, maintain 3,000, expect vectors"), so it isn't false, it just isn't the charted MAP. Per-approach charted missed approaches are a v0.3 depth item. Phraseology "go around, go around" is faithful.

10. Holding

Game behaviorReal rule + citeVerdict
H/H <fix> puts the aircraft in an orbit (circular loiter) at the fix or present position; readback "hold at FIX as published". The code itself calls the orbit a v1 approximation.AIM 5-3-8: a holding pattern is a racetrack, standard right turns, a specified inbound course, 1-minute legs at/below 14,000 ft (1½ min above), with direct / parallel / teardrop entries determined by arrival geometry.SIMPLIFIED-OK, self-acknowledged. An orbit holds the aircraft in the same airspace, which is the operational point of a hold and what the game needs. It teaches nothing about racetrack geometry, entries, or leg timing. NEEDS-REFINEMENT (v0.3): a real racetrack with a published/assigned inbound course and standard right turns; entry selection is an Academy-depth nicety. Readback "as published" is faithful phrasing.

11. Handoffs / point-outs

Game behaviorReal rule + citeVerdict
Departures become handoff-eligible at their exit fix and above a field-relative floor (~5,000 ft at KSTL); F completes to "contact [Center] [freq], good day." Arrivals hand to ground after rollout. Auto-completes late if ignored.Real handoffs are a coordination action (7110.65 Ch. 5-4): transferring radar identification to the receiving controller, with radar contact/point-out protocols, not a simple frequency-change-at-a-fix.SIMPLIFIED-OK. In a single-controller game there is no adjacent human sector to coordinate with, so "hand off at the exit fix" collapses correctly to a frequency change. The phraseology ("contact Denver Center one three four point five, good day"; "turn left when able, contact ground point niner") is faithful, including reading back the frequency. Point-outs have no meaning without a second controller, correctly absent.

12. ATIS

Game behaviorReal rule + citeVerdict
ATIS letter advances A→B→C… every ~12–18 min; altimeter nudges slightly; controller broadcasts "Attention all aircraft, information Bravo is current, altimeter…" and one pilot acks.7110.65 2-9-3: a new ATIS code is issued on the hour or when conditions change; pilots report the current code on initial contact so the controller may omit items already in the ATIS; sequential letter progression is standard.FAITHFUL (texture-level). The rollover mechanic (sequential letters, altimeter change, "information X is current" broadcast) is right, and pilots acking the code is real. Where it's simplified: our roll is on a timer rather than weather-change-driven (weather isn't modeled yet), and pilots don't yet report the code on check-in to let the controller omit items. NEEDS-REFINEMENT (v0.2): drive the roll off actual wind/weather changes once the weather layer lands, and add code-on-checkin.

13. Phraseology spot-check

Game behaviorReal rule / conventionVerdict
Digits spoken individually; "niner" for 9; headings always three digits ("two seven zero", "zero niner five"); airspeed and frequencies digit-by-digit; frequency "point".7110.65 2-4-x radio phraseology / ICAO digit table.FAITHFUL. Correct across headings, speeds, runways, frequencies.
Altitude grouping: "one one thousand" for 11,000; "niner thousand"; "one zero thousand five hundred".7110.65 altitude phraseology: thousands spoken as individual digits + "thousand" + hundreds.FAITHFUL. This is the correct grouping, and a common thing sims get wrong ("eleven thousand").
Deliberately omits "over" on routine VHF exchanges (a documented decision).Correct, domestic VHF ATC does not say "over" on routine transmissions.FAITHFUL. "Over" would make a controller wince.
Uses "three"/"five", not the stricter "tree"/"fife" (documented; reserved for an Academy strict mode).ICAO/7110.65 strict pronunciation is "tree"/"fife".SIMPLIFIED-OK. A conscious readability choice for general players, with the strict forms parked behind Academy mode. Not wrong for a US-domestic casual read; a purist would prefer the option.
Instruction/readback structure: controller callsign-first, full wording; pilot callsign-last, compressed but full value on required items (heading/alt/speed/runway/hold); advisory items get terse seeded acks.7110.65 2-4-3 (readback of required items) and standard exchange structure.FAITHFUL. The callsign-first/last split and the "required items always read back in full, advisories may be terse" rule are right, including reading back hold-short/runway assignments.
Turn instructions: a plain heading (C 270) is spoken "turn left/right heading two seven zero" with the direction of the shorter arc, and the aircraft flies that arc; a commanded direction (CL/CR) speaks and flies the commanded way even when the other arc is shorter. Holds keep standard right turns.7110.65 2-6-2 / 5-6-2: heading instructions specify the turn direction; a pilot given a bare "fly heading" turns the shorter way; a commanded "turn left/right heading …" is flown as commanded (the controller's tool to swing an aircraft the long way around). AIM 5-3-8: standard holding turns are right.FAITHFUL. Default shortest-way, commanded-direction override, and right-turn holds are modeled as three distinct behaviors.
Heavy appends "Heavy" and the A380 class appends "Super" in all phraseology; GA leads with type ("Skyhawk four five two one bravo").7110.65 2-4-20 (heavy/super suffix); GA type-prefix convention.FAITHFUL. Both the "Heavy" and "Super" weight suffixes are spoken; GA type-prefix is correct.
Optional pilot wording uses four registers: relaxed GA VFR, casual but procedural GA IFR, polished passenger airline, and terse, rough-edged freight. Recurring check-ins, visual reports, maneuver advisories, pattern requests, frequency requests, and intention reports rotate without replacement inside their banks.Real radio delivery varies by operation and crew; mandatory readback content remains governed by 7110.65.SIMPLIFIED-OK. Register is authored game texture, not a claim about every real pilot. It never removes an assigned heading, altitude, speed, runway, hold, or approach item from a required readback.
No explicit hold-short readback enforcement beyond content: the game voices the assignment but doesn't require the pilot to read back "hold short of runway X" as a graded item.7110.65 2-4-3 / runway-safety guidance: hold-short instructions are a mandatory readback item.NEEDS-REFINEMENT (Academy). The pilot lines contain the runway, but a hearback/readback-verification mechanic (does the player catch a wrong readback?) doesn't exist yet. Flagged for the Academy hearback feature.
Facility auto-acknowledgments. An IFR check-in at a radar facility draws an automatic "[callsign], [facility], radar contact" in the facility voice a few seconds later, carrying the current altimeter for an arrival. At a tower, and after another decision-expected call such as ready for departure, request lower, unable restriction, or a VFR request, the prompt non-radar acknowledgment is "[callsign], standby". Pilot advisories such as a go-around, maneuvering report, negative visual contact, emergency update, or post-landing status receive "[callsign], roger". The line is cancelled when the player transmits first. Pilot readbacks and expected execution reports are terminal and do not trigger an acknowledgment loop.7110.65 5-3-3 (radar identification / "radar contact"); 2-9 (altimeter on initial contact); "standby" and "roger" are standard acknowledgments.FAITHFUL. Pilot-initiated calls receive a response without falsely claiming radar identification or inventing a clearance. The acknowledgment makes no sequencing decision for the player and never substitutes for an eventual clearance. These lines are radio/UX only: side-effect-free to flight behavior, score, and spawn randomness.

14. Published procedures: descend-via STARs (batch 2), climb-via SIDs (batch 3), two-clearance approaches (batch 4)

VectorHeavy flies published RNAV STARs with descend-via. A share of IFR arrivals at a field that has STARs (KSTL/KATL/KDEN/KSEA/KPDX) check in already established on a real charted arrival ("descending via the AARCH TWO arrival"), fly its leg sequence to the runway transition, and manage their own altitude/speed to the charted crossing restrictions until the controller takes them off it. The data comes from the CIFP cycle. The engine never invents a fix or a restriction.

VectorHeavy behaviorReal ruleVerdict
STAR assignment. A seeded share of IFR arrivals spawn ON a published STAR whose enroute-transition entry best matches the origin bearing, with the runway transition for the expected flow runway. An arrival only takes a STAR whose entry lies within a bearing tolerance of its origin gate, so at a field whose STARs serve one direction (TUL's single NE VINTA3) every other arrival honestly enters direct instead of being repositioned onto a procedure that contradicts its origin. They enter at the TRACON boundary already compliant, descending via the profile.STARs are the standard arrival structure; a flight is on its filed STAR when handed to approach, already having met the enroute crossings on Center.FAITHFUL (batch 2). The arrival appears on a real named procedure consistent with where it came from, established descending-via, the picture a TRACON controller inherits.
Lateral compliance. The aircraft flies the flattened leg sequence (enroute → common → runway transition) as TF/CF/DF/IF legs; the selected arrival's remaining procedure path draws as the dashed route line; the strip shows the STAR (e.g. AARCH2·30L).RNAV lateral navigation flies the charted legs to each fix in turn.FAITHFUL, with the batch-1 RF bound. RF (radius-to-fix arc) legs are flown as a straight track to the terminating fix, no arc geometry yet. Every other leg is faithful.
Vertical, descend-via. On a descend-via clearance the aircraft manages its own altitude to meet at / atOrAbove / atOrBelow / between crossings, interpolating on a ~2.9° glide between restrictions, and honors published speed caps on their own schedule (next row). Check-in and re-clear phraseology follow 7110.65 4-5-7 ("descending via the CARDS TWO arrival").AIM 5-4-1 / 7110.65 4-5-7: on a descend via clearance the pilot descends at their discretion to comply with every published altitude and speed restriction on the arrival.FAITHFUL (batch 2). The aircraft meets each in-band charted crossing within a game tolerance; the check-in/readback wording is the real 4-5-7 phrasing.
Controller interplay. A heading vector takes the aircraft off the arrival laterally (the lateral leg-following suspends); an altitude assignment takes it off the descend-via vertically ("descend and maintain" cancels the vertical) while the published speeds keep binding; a speed assignment or RS amends those. DV ("descend via the arrival") and R ("resume own navigation") re-clear it onto the profile when it is still rejoinable to the lateral path.Real ops: a vector cancels the lateral portion of the arrival; "descend and maintain" cancels the vertical descend-via but not the charted speeds, which need an explicit amendment ("delete speed restrictions"); the controller re-clears "descend via the … arrival" to put the pilot back on the profile.FAITHFUL (batch 2). The two-axis take-off/put-back-on is the actual skill the position trains, modeled on the real cancel/re-clear semantics. The speed axis is genuinely independent: a descended ship still crosses its fixes at the published numbers until you amend them.
Speed, descend-via. A published crossing speed binds when the aircraft reaches the point it must begin slowing to make it, not when the previous fix sequences behind. The lead distance is computed from the current speed, the target speed and the type's own longitudinal capability (~1.2 kt/s for a jet), plus planning margin, so a jet's 280→210 reduction starts about 6 nm out, roughly the controller's 1 nm per 10 kt rule of thumb. A speed already crossed stays in force until ATC amends it, including after a "descend and maintain" takes the vertical axis.AIM 5-4-1 / 7110.65 4-5-7: the pilot descends at their discretion to comply with every published altitude and speed restriction; charted speeds remain mandatory until ATC amends or deletes them, and a descent clearance cancels the vertical portion only.FAITHFUL. Previously the reduction bound the instant the previous fix went behind, so a ship crossing GETUP (280) slowed at once for ENNEE (210) 27 nm ahead. The deceleration rate is the sim's own airframe envelope rather than a per-type published figure, so the exact lead distance is a model, not a manufacturer number, and it is deliberately conservative: the aircraft is stabilized at the crossing rather than still slowing through it.
The STAR-to-vectors seam. When the charted legs end (typically a ~5,000-ft crossing near the FAF), the descend-via is complete: the aircraft levels at its last charted altitude and holds course; the controller then issues normal descent + vectors to final. If left level too long the pilot nags ("level 5,000, request lower"). It does not auto-descend to the runway.The published portion ends where radar vectors to final begin; below the last fix the controller owns the descent and the turn-on.FAITHFUL by design. The seam is the gameplay. The game deliberately does not fly the aircraft to touchdown for you.
Unmeetable restriction honesty. If a late re-clear (a high vector then DV) makes a crossing geometrically impossible, the pilot calls "unable [fix] restriction" once and levels rather than silently busting it.A pilot who cannot meet a restriction must advise ATC and will not fabricate compliance.FAITHFUL. Never a silent bust; the miss is announced and recorded.

Documented bounds (batch 2).

The departure side: published SIDs with climb-via (batch 3)

VectorHeavy also flies published SIDs with climb-via. A seeded share of IFR airline departures at the SID fields (KSTL/KATL/KDEN/KSEA/KPDX) file a real charted departure consistent with their exit fix / destination bearing; the takeoff readback carries "climbing via the COLLE SIX departure", and off the runway the aircraft flies the TRACON portion of the procedure. Same data doctrine: never an invented fix or restriction.

VectorHeavy behaviorReal ruleVerdict
SID assignment. A seeded share of IFR airline departures spawn holding short with a filed SID whose runway transition serves their assigned departure end and whose outermost TRACON leg best matches the filed exit fix's bearing. A re-taxi re-fits the SID to the new end, or honestly drops it.Departures at these fields are cleared via an RNAV SID in the route clearance before taxi.FAITHFUL (batch 3). The departure holds short already carrying its real named procedure ("ready for departure, COLLE6 departure"), the picture the local controller inherits.
Divergent initial climb → join (coexistence). Off the rotation the departure flies the divergent initial climb exactly as before (the parallel-departure LOS fix: left runway ~15° left, right ~15° right, until ~3,000 AGL / 5 nm), and only then joins the SID lateral path at the nearest sensible leg. Wake departure intervals (§3) are untouched.Real RNAV SIDs open with a climb on heading to an altitude, then direct a fix; parallel departures diverge immediately.FAITHFUL, with the join simplification. The charted climb-on-heading legs (VA/VI/VM) are dropped by the CIFP pipeline; the tower's divergent climb stands in for them, then the join. Documented bound.
Lateral compliance. The aircraft flies the flattened TRACON legs (runway transition → common → enroute, truncated at the exit-fix ring) as TF/CF/DF/IF (RF as track); the selected departure's remaining path draws as the dashed route line; the strip shows COLLE6→SAGME.RNAV lateral navigation flies the charted legs to each fix in turn.FAITHFUL, with the batch-1 RF bound.
Vertical, climb-via. The departure manages its own climb to the charted in-band restrictions: it levels at an upcoming ceiling until the fix is crossed (e.g. KDEN's at or below 10,000), meets floors in stride, and honors published speed caps on top of the 250-below-10k rule.AIM 5-2-9 / 7110.65 climb-via: the pilot climbs at their discretion to comply with every published altitude and speed restriction on the SID.FAITHFUL (batch 3) within the band; the readback/own-nav call is the real "climbing via the [name] departure" phrasing.
Controller interplay. A heading vector takes the departure off the SID laterally; an altitude assignment ("climb and maintain") cancels the climb-via vertically. CV ("climb via the [name] departure") re-clears it; R rejoins the SID when rejoinable, else resumes the filed direct-to-exit.Real ops: a vector cancels the lateral portion; "climb and maintain" cancels the climb-via; the controller re-clears "climb via SID" to restore it.FAITHFUL (batch 3). The same two-axis cancel/re-clear skill as the arrival side, on the real semantics. GRAMMAR: CV is a distinct command; DV stays arrival-only.
The seat seam, handoff. Past the last TRACON leg the departure proceeds direct its filed exit fix and the existing handoff machinery ends the story: eligible at the fix ≥ the handoff floor, F to Center. The SID's enroute legs and its charted top altitude above the band are Center's, satisfied downstream after the handoff, never silently busted.The TRACON owns the departure from rotation to the boundary; Center owns the rest of the SID.FAITHFUL by design (MODEL-THE-SEAT). Out-of-band is the other frequency's job, satisfied downstream, the same doctrine as the arrival side's satisfied-upstream.
Unmeetable restriction honesty. If a late re-clear makes a restriction geometrically impossible (already above a downstream ceiling, a climb-via never descends, or a floor needing a steeper-than-performance gradient), the pilot calls "unable [fix] restriction" once and climbs per performance.A pilot who cannot meet a restriction must advise ATC.FAITHFUL. Never a silent bust; announced and recorded.

Documented bounds (batch 3).

The two-clearance model, approach + landing clearances (batch 4)

VectorHeavy separates the approach clearance from the landing clearance, the core realism upgrade of the era. An approach clearance ("cleared ILS runway 30L approach", 7110.65 4-8-1) arms the approach; the tower's "cleared to land" is a distinct gate. A visual approach follows the "report field in sight" exchange. The family (ILS/LOC/RNAV) comes verbatim from the CIFP plates; RNAV(GPS) fields (KJEF/KSPI/KCOU) finally fly their real finals.

VectorHeavy behaviorReal ruleVerdict
Approach clearance (CA). Arms the best published approach for the runway (ILS > LOC > RNAV). The aircraft enters the approach phase, intercepts the final approach course and descends the glidepath pilot-managed, WITHOUT further altitude commands, exactly like a descend-via but on final. Issued bare when the aircraft is already established, else with the "fly heading …, maintain … until established" preamble.7110.65 4-8-1: approach control issues the approach clearance ("cleared ILS runway X"), which authorizes the published approach; "maintain [alt] until established" and intercept phraseology precede it when vectoring to final.FAITHFUL (batch 4). The two-step approach-then-land model the §9 row flagged as NEEDS-REFINEMENT now ships in normal play, with the real 4-8-1 vector-to-intercept phrasing.
Landing clearance stays separate (L). An aircraft on an approach clearance still needs the tower's L before the threshold; L transitions it to the normal landing phase (no re-check of alignment/altitude, it is already established). Without L by short final the pilot goes around ("going around, no landing clearance"), the existing uncleared-go-around machinery wired to the two-clearance radio.The tower separately issues "cleared to land" (Ch. 3); an aircraft established on the approach without a landing clearance executes the missed approach.FAITHFUL (batch 4). Approach authorization and landing authorization are genuinely distinct gates, and the missing landing clearance produces the correct go-around, never a silent uncleared touchdown.
Backward-compatible tower shortcut. An L issued to an aircraft NOT on an approach clearance behaves exactly as before batch 4, one-step to the landing phase and down to touchdown.Real ops are two-step, but a blended tower/approach single-controller game may collapse them for casual play.SIMPLIFIED-OK (by design). The one-step L is preserved as the documented "tower shortcut" so casual play and the tutorial are untouched; the two-clearance flow is opt-in on top.
Visual approach (PF → field in sight → VA). The controller points out the field ("airport twelve o'clock, one zero miles, report it in sight"); the pilot reports the field in sight after a seeded delay/probability by distance; then a visual approach clears pilot-managed own navigation + descent to the field, reusing the VFR self-descent picture. It still needs L.AIM 5-4-23 / 7110.65 7-4: a visual approach requires the pilot to have the airport (or preceding traffic) in sight; the pilot then provides own navigation to the runway; a landing clearance is still required.FAITHFUL (batch 4). The field-in-sight exchange gates the visual, and it stays honest, own navigation to final, still needing the landing clearance. VFR traffic (already see-and-avoid) needs none of this, correctly excluded.
Interplay. A heading vector OR an altitude assignment CANCELS the approach clearance (an approach couples both axes), the aircraft levels / flies the vector and the pilot notes "canceling the approach"; re-clear with CA/VA. R resumes the filed/STAR routing as shipped.Real ops: a vector or an altitude change off the published profile cancels the approach clearance; the controller re-clears the approach to restore it.FAITHFUL (batch 4). The same take-off/put-back-on skill as the DV/CV arrival and departure sides, on one coupled clearance rather than two independent axes.

Documented bounds (batch 4).


15. Radio voices: a platform capability note

This one is not an FAA-rules matter, it is a bound on where the game's audio runs, and it belongs here for the same reason the rest of the page does: so you know exactly where the model stops.

The radio speaks the full exchange, the controller's transmission and the pilot's readback, through a neural voice model that runs entirely on your own device. It loads and speaks on desktop browsers: Chrome, Firefox, and desktop Safari. It is not available on iPhone or iPad. On those devices the radio plays text-only: every controller call and pilot readback shows on the radio strip as text, the same full exchange the voices would speak.

Game behaviorWhat it isVerdict
The neural radio voices load and speak on desktop browsers. They are not available on iPhone or iPad; on those devices every call and readback shows on the radio strip as text.A platform capability bound, not a rule simplification: the strip carries the whole real exchange either way, so the thing being practiced, reading the transmission and the readback, is intact. It changes how the exchange is delivered on those devices, not the phraseology or the procedure.PLATFORM CAPABILITY (not a rules verdict). Honest disclosure of where the voice layer runs. No FAA rule is simplified and no false lesson is taught: the words on the strip are the same 7110.65 exchange the voices carry on desktop.

15A. Shared regional geography

Every river and lake in the game is now generated from the USGS National Hydrography Dataset. None is hand-drawn, and none comes from a world-scale cartographic dataset any more. Nine canonical features, the Ohio, Missouri, Mississippi, Illinois, Arkansas, Kansas (Kaw), Columbia and Willamette rivers and Hillsdale Lake, are rendered by one generator (scripts/hydrography/genRivers.ts) from committed NHD extracts pinned by SHA256 in reference/usgs-sources/MANIFEST.md. Every field that shows a feature projects that one centerline through its own FAA ARP, so one physical river lands in one world place on every scope.

Rivers come from NHD "Flowline - Large Scale" (layer 6) and lakes from "Waterbody - Large Scale" (layer 12), queried by GNIS name. Public domain, cited as USGS. Nothing is fetched at build time or at runtime.

Game behaviorWhat it isVerdict
River and lake routes are the NHD geometry, decimated: every drawn vertex is a real NHD vertex, chained into one ordered path and thinned with Douglas-Peucker at a tolerance recorded in each module's header. Nothing is invented, moved or averaged.USGS NHD high-resolution flowlines and waterbodies, public domain.PUBLISHED FACT, with a disclosed simplification. The tolerance and the vertex-spacing floor are judgement calls and each generated module states its own, so a reader can see the trace is sourced-and-approximated rather than sourced-and-exact.
Display widths are a single value per river, 0.2 nm (Arkansas) to 0.55 nm (Mississippi), several times the real channel. The Kaw draws as a thin line with no width at all.Nothing. NHD carries published widths for some reaches; they are not used.OUR DISCRETION. Bands are exaggerated so a river reads at scope scale. The USGS citation covers the route and does not extend to the width.
What each river was before, for the record: the Ohio and the Peoria reach of the Illinois came from Natural Earth 1:10m, a world-scale product; the Missouri, Mississippi, Arkansas, Kaw, Hillsdale Lake and the Alton reach of the Illinois were hand-authored from map context. The hand-drawn Missouri's own header recorded residuals up to ~9 nm.CORRECTED. Measured against published landmarks the sourced traces are 0.15 to 1.3 nm out where the hand-drawn ones were 0.7 to 18 nm. The change moved the most-played field's most-seen geometry and is recorded in the changelog rather than slipped in.

"Illinois" and "Illinois River" used to be two names for one river in two modules. NHD returns it as one connected chain of all 347 named segments from the Kankakee confluence to the Mississippi at Grafton, so it is now one canonical feature serving all six fields that draw it.

Still hand-drawn, deliberately, because no neighbouring scope reaches them and they are not claimed as sourced: a handful of small local features (KIXD's Clinton Lake, KICT's Cheney Reservoir and Little Arkansas, KTUL's Keystone and Oologah lakes, KSTL's Meramec, KSEA's water underlay, KDEN's South Platte). They remain OUR DISCRETION and are the natural next batch for this pipeline.

KPIA's official FAA field profile also identifies Army National Guard Chinook operations. Those helicopters are not represented: the sim has no rotorcraft flight or runway-use model, and substituting fixed-wing behavior would teach the wrong traffic picture. The documented 182d Airlift Wing C-130 operation is represented with the FAA's real C130 designator; its game performance figures, Reach callsign use, route choices and traffic weight are OUR DISCRETION.


16. Airspace class: the drawn boundary (the AIRSPACE map layers)

VectorHeavy draws the published Class B / C / D boundaries on the scope as selectable map layers — the field's own designation and its neighbours' surface areas, each toggled separately, both on by default — and the same geometry decides who ATC may vector. This section is about what that claims and what it does not.

What a real display does. A terminal radar display (STARS) draws its static background from configurable video maps (FAA Order JO 7910.1, Aeronautical Information Services Video Map Products), and those maps are selectable layers the controller turns on and off per position. Airspace boundaries are among the mapped features. So a toggleable airspace overlay is authentic in form. What we have not confirmed with a working controller is the real-world default state at a given facility, or exactly which boundary features a given facility's map set carries. Ours defaults ON; that is the founder's call, flagged here as a discretion call, not a claim about any facility.

Where the geometry comes from. The FAA Aeronautical Information Services "Class Airspace" dataset — the FAA's own published boundary geometry, the same data the agency charts Class B/C/D from (ais-faa.opendata.arcgis.com/datasets/class-airspace). The pipeline is scripts/airspace/fetch-airspace.ts (npm run gen:airspace), which emits src/data/airspace/<icao>.ts. Nothing in that directory is authored by hand.

The attributes were cross-checked against an independent primary source. For St. Louis, the Federal Register legal description (83 FR 14392, 2018-04-05, Amendment of Class B Airspace Description; St. Louis, MO, incorporated into FAA Order JO 7400.11) lists Areas A–M with floors SFC / 1,700 / 2,000 / 2,500 / 3,000 / 3,500 / 3,500 / 4,500 / 4,500 / 5,000 / 5,000 / 5,000 under a uniform 8,000 MSL ceiling. The dataset returns exactly those areas with exactly those limits, and the drawn Area A ring measures 6.00 nm from the published Point of Origin (38°45'10"N, 90°21'39"W) — the published 6-NM radius.

Coverage: every modelled field, real geometry, none invented.

FieldIts own designation, as drawnNeighbouring surface areas also drawn
KJLNClass D cylinderNone within the modelled scope
KSDFClass C, 3 areasKCVG (B), KFTK and KLOU (D)
KSTLClass B, 12 charted areasKALN, KBLV, KCPS, KSUS (D)
KSUSClass D cylinder beneath the St. Louis Class BKALN, KBLV, KCPS (D), KSTL (B)
KALNClass D cylinder beneath the St. Louis Class BKBLV, KCPS, KSUS (D), KSTL (B)
KBLVClass D with two charted extensions beneath the St. Louis Class BKALN, KCPS, KSUS (D), KSTL (B)
KCPSClass D cylinder beneath the St. Louis Class BKALN, KBLV, KSUS (D), KSTL (B)
KMCIClass B, 4 areasKFOE, KIXD, KMKC, KOJC, KSTJ, KTOP (D)
KATLClass B, 15 areasKFTY, KLZU, KMGE, KPDK, KRYY (D)
KDENClass B, 14 areasKAPA, KBJC, KBKF, KCFO (D)
KSEAClass B, 20 areasKBFI, KGRF, KOLM, KPAE, KRNT, KTCM, KTIW (D)
KPDXClass C, 6 areasKHIO, KSLE, KTTD, KUAO (D)
KLASClass B, 20 charted areas (A-T, uniform 10,000 MSL ceiling)KHND, KINS, KVGT (D)
KICTClass C, 2 areasKBEC, KHUT, KIAB (D)
KTULClass C, 2 areasKRVS (D)
KSGFClass C, 2 areasKBBG (D)
KBBGClass D cylinderKASG and KROG (D), KSGF (C)
KBMIClass D cylinderKCMI, KPIA, KSPI (C), KDEC (D)
KPIAClass C, 3 areasKBMI (D), KMLI and KSPI (C)
KSTJClass D cylinderKMCI (B), KMKC and KTOP (D)
KMDHClass D cylinderKBLV, KCGI, KMWA and KPAH (D), KSTL (B)
KMWAClass D cylinderKCGI, KMDH and KPAH (D), KSTL (B)
KFOEClass D cylinderKMCI (B), KIXD, KOJC and KTOP (D)
KSLNClass D cylinderKFRI and KHUT (D)
KTOPClass D cylinderKMCI (B), KFOE, KIXD, KOJC and KSTJ (D)
KMHKClass D cylinderKFRI and KSLN (D)
KHUTClass D cylinderKBEC and KIAB (D), KICT (C), KSLN (D)
KSWOClass D cylinderKEND and KWDG (D), KOKC and KTIK (C), KPWA (D)
KWDGClass D cylinderKEND and KSWO (D)
KTBNClass D cylinderNone within scope
KSPIClass C, 2 areasKBMI, KDEC (D), KPIA (C)
KIXDClass D cylinderKMCI (B), KFOE, KMKC, KOJC, KTOP (D)
KOJCClass D cylinderKMCI (B), KFOE, KIXD, KMKC, KTOP (D)
KMKCClass D cylinderKMCI (B), KIXD, KOJC, KSTJ (D)
KJEFClass D cylinderKCOU (D)
KCOUClass D cylinderKJEF (D)
KGCKClass D cylinderNone
KBECClass D cylinderKHUT and KIAB (D), KICT (C)
KRVSClass D cylinderKTUL (C)

Every shape above is the published shape. No field draws an approximated ring, and no field with unsourced geometry draws anything — that case does not arise today, but the data module is built so it degrades to drawing nothing rather than to drawing a guess.

Game behaviorReal rule / sourceVerdict
The scope draws the published Class B/C/D boundary rings for the field and its neighbours, from FAA AIS geometry, with each shelf's published floor and ceiling shown in the chart's hundreds-of-feet convention ("80/17" = 8,000 MSL down to 1,700 MSL, "SFC" spelled out). Class is carried by the line's dash pattern (B solid, C long-dash, D short-dash), a neighbouring field's surface area is labelled by ident and class ("SUS D").The boundaries and their limits are published on the sectional/TAC and in 14 CFR 71 as incorporated by FAA Order JO 7400.11 (current edition); the geometry file is the FAA's own AIS product.FAITHFUL (geometry + limits). The drawn shape and every altitude number are the published values, not a model. The overlay never rounds a limit and never smooths a boundary into a circle it is not.
The one simplification: vertex decimation. The source polygons densify every arc to thousands of points; each ring is decimated (Douglas-Peucker) at 0.04 nm.SIMPLIFIED-OK (drawing resolution). 0.04 nm is under half a screen pixel at the scope's widest zoom, so the drawn line is the published line at the resolution a screen can express. It is a rendering budget, not a change to the boundary.
Class E and G are not drawn. Class E surface areas exist at several neighbouring fields (e.g. KLWC, KTOP) and are omitted.AIM 3-2-6 (Class E).DOCUMENTED OMISSION. The dataset publishes these with an unbounded upper limit, and the game models no Class E behaviour at all, so drawing them would put a boundary on the scope that means nothing in this simulation. Omitted deliberately, not missed.
One class per field. Where the dataset carries more than one class designation for the same field (Seattle-Tacoma publishes a "Class D1" surface polygon alongside its Class B areas), only the field's highest class is drawn.DOCUMENTED DISCRETION. The chart shows the higher class as that field's surface area. Rather than paint a Class D ring inside a Class B and imply a rule we cannot explain, we draw the governing class. Flagged for a controller's word.
The drawn boundary BEHAVES. VFR control authority is resolved by a point-in-volume test against these exact polygons (src/game/airspace.ts): 2D point-in-polygon plus the published floor/ceiling band, both in the aircraft's own reference (every limit in the dataset is SFC or MSL, and aircraft altitude is ft MSL, so no conversion is invented). Overlapping volumes resolve to the most controlling class (B > C > D > none). A VFR is vectorable only while it is inside a Class B volume — over the field, or out under a shelf that still has a Class B floor beneath it. Laterally clear of the shelves, or below the floor of the one above it, the same aircraft is in Class E/G and is as pilot-owned as a VFR at a Class D field. A VFR inside a neighbouring field's Class D surface area resolves to D, not to the host field's B.§5A + the contract's own standard: "a Class B ring on the scope with a VFR inside it behaving like Class D would be the overlay lying to the player."FAITHFUL (the coupling). The line drawn and the line tested are one array of vertices; there is no second, approximate boundary anywhere in the code. Soak law vfr-airspace-containment stages a VFR outside and inside the published volume at every modelled field and asserts the authority follows the containing class, and reverting the rule to the old per-field scalar makes it fire at every Class B field.
What is still keyed to the FACILITY, on purpose. airport.airspaceClass survives as the field's published designation and is still what the ATIS-era prose and the airport data files carry. Two behavioural uses remain field-level and are not bugs: (a) the altitude and speed refusals to VFR (applyAltitude / applySpeed) reject at every field including Class B, so they never consult a class at all; (b) the containment test falls back to the scalar for a field with no sourced geometry — the honest degradation for a field we have not charted. Every modelled field carries geometry, so (b) is unexercised today.DOCUMENTED SCOPE. (a) is a pre-existing, separately disclosed simplification (§5A: we do not model VFR altitude assignment inside Class B even though a real Class B controller may assign one). Coupling the boundary did not fix it and does not claim to.
CLEARANCE TO ENTER Class B is modelled, as an exchange. A VFR whose intended track would put it inside a published Class B volume calls for a clearance on the radio. The controller answers CB — "cleared to enter (name) Bravo airspace" — or RB — "remain outside (name) Bravo airspace". Both are durable state on the flight. Uncleared, the pilot does not enter: it holds outside (a present-position orbit) and re-asks every couple of minutes until it is cleared or the controller refuses again. A clearance releases that hold and the flight continues to the field. Two aircraft are never asked: one already inside the Bravo when the model first sees it (it departed the primary field under a tower clearance, or was inherited on turnover), and one working an emergency.14 CFR 91.131(a)(1): no person may operate within Class B unless "the operator has received an ATC clearance from the ATC facility having jurisdiction for that area". AIM 3-2-3 restates it for VFR and is explicit that two-way radio contact is not a clearance. Controller phraseology is 7110.65 7-9-2 (VFR AIRCRAFT IN CLASS B AIRSPACE): "CLEARED THROUGH/TO ENTER/OUT OF BRAVO AIRSPACE" and "REMAIN OUTSIDE BRAVO AIRSPACE. (When necessary, reason and/or additional instructions.)", with approval or denial "based on workload, operational limitations and traffic conditions", and, for a held aircraft, "inform the pilot when to expect further clearance".FAITHFUL (the exchange), with the pilot half stated plainly. The controller's required content is the order's wording, not a paraphrase. The pilot's wording is our discretion (7110.65 is a controller order and does not script the pilot); its behaviour is the regulation: 91.131 binds the pilot, so an uncleared VFR holding outside is the model, and the game does not simulate a routinely-busting pilot. The consequence a player feels is therefore not a penalty but a stuck arrival — an unanswered Bravo request is traffic that never reaches your runway. Timing numbers are ours and listed in the bounds below. Soak law classb-entry-clearance stages a VFR flown straight at the Bravo at all five Class B fields and asserts both arms (uncleared never enters and does ask; cleared does get in); deleting the hold-outside action makes it fire at every one.
An UNAUTHORIZED entry is an ADVISORY, not a deal. If a VFR ever ends up inside Class B with no clearance, it draws one "airspace advisory: … entered the Class B without a clearance", once, and nothing else: no score deduction, no operational error, no session ending.14 CFR 91.131 binds the pilot in command; an unauthorized entry is a pilot deviation, not a controller operational error. §2's small-behind-large wake case is the existing precedent for "visible hazard, advisory severity".SIMPLIFIED-OK, and the severity is the argument. The game reserves score deductions for events the CONTROLLER owns — a deal, a VFR proximity event where separation responsibility was live, a go-around caused by runway occupancy. Charging the player for a pilot's airspace bust would teach that an unanswered request is a controller error, which is false. Equally, letting it pass silently would leave a rule that never speaks, so it speaks. Note the honest consequence of the pilot model: because an uncleared pilot holds out, this advisory is close to unreachable in normal play — it exists so the claim is testable and so no future path that produces one is silent.
Two layers, one geometry. The host field's own designation (airspace) and the neighbouring fields' surface areas (airspaceNeighbours) are separately selectable, both on by default; around a busy Class B the satellite Class D rings are the densest part of the picture. Visibility is a client display preference (vectorheavy.mapLayers), read live by the renderer, exactly like the camera, the track-line length or the theme. It never enters sim state, the command log, the deterministic tape, or replay.Video-map sets are per-position selections (FAA Order JO 7910.1), and splitting adjacent-facility boundaries from the position's own is a selection a real map set can express. The default-on choice for the neighbour layer is the founder's call, flagged like the parent layer's.FAITHFUL by construction (display). Turning a layer off hides a line and changes nothing else: the behaviour test reads the data module, never the switches, so a VFR outside the Class B is refused a vector whether or not the boundary is drawn. A session recorded with the layers on and replayed with them off is bit-identical; test:determinism and test:replay cover this because the layers touch nothing they read.

Documented bounds (§16).


17. The departure model: SID mix, radar vectors, and the TRACON bubble

This section documents a model we researched and built, not a rule we can cite. Where a row says OUR DISCRETION it means exactly that: we chose a number that produces an honest-feeling operation and we are stating it plainly so a working controller can tell us it is wrong. None of the numbers in this section are presented as published FAA fact. The parts that ARE evidence are labelled.

What it replaced. Every outbound aircraft used to fly to a pre-determined exit node and then call for a frequency change. Two things were wrong with that. First, the node was picked from every named fix in the airport data, including fixes that exist only because they sit on a published STAR — so at KSTL a westbound departure filed SNYDR (7.6 nm, 254°), a point on an arrival descent, and the same fix carried an inbound and an outbound at once. Second, the exit node was the only way out, so "reach the fix" and "leave my airspace" were the same event, and the entire middle of a departure's life — the part where a controller actually works — did not exist.

17.1 Per-field SID mix

Game behaviorBasisVerdict
The share of eligible, bearing-compatible IFR airline departures cleared via a published SID is a per-field number (traffic.sidShare), not one global constant.Real-world SID usage is a property of the facility: its published procedure set, its runway ends, and the character of its traffic. A flat rate across a mega-hub and a GA reliever cannot be right at both.SIMPLIFIED-OK. The shape (per-field, not global) is the honest part. The values are below.
FieldSIDs in cycle 2607GA sharesidShareBasis
KATL171%0.97OUR DISCRETION. The busiest airline operation modelled, a full RNAV SID set, and essentially no GA: the departure bank is jets off a published procedure. Highest value in the game.
KSTL175%0.95OUR DISCRETION. Published SIDs serve every departure end; the founder's working assumption for a major field is ~95%.
KSUS488%0.78OUR DISCRETION. A GA-dominant business reliever beneath the St. Louis Bravo with four published departure families. Bearing compatibility still rejects procedures aimed away from the filed gate.
KALN485%0.72OUR DISCRETION. A GA/corporate reliever beneath the St. Louis Bravo with the same four published departure families. The lower value reflects the field's smaller current operation; bearing compatibility still gates assignment.
KBLV418%0.75OUR DISCRETION. Scott's official safety briefing says IFR departures normally receive radar vectors or SIDs. The value gives the published procedures substantial use without pretending every military or Allegiant departure files one.
KCPS482%0.70OUR DISCRETION. A corporate/GA St. Louis satellite with four published departure families; IFR corporate traffic commonly receives one, while the GA-majority operation often leaves on vectors.
KDEN203%0.95OUR DISCRETION. Largest published SID set in the game, hub airline bank.
KLAS107%0.95OUR DISCRETION. A full RNAV SID set serving every departure end at a top-ten field; the same reasoning as KSTL/KDEN.
KSEA83%0.95OUR DISCRETION. Fewer procedures, but that is a compass-coverage fact, not a usage fact, and the engine's own bearing gate already declines a SID that leads away from the filed gate, so the share stays high and the coverage limit is handled where it belongs.
KPDX54%0.90OUR DISCRETION. CIFP 2607 supplies five usable departure families after the vector-only PTLD2 is excluded. The high share represents a procedure-led airline field; bearing compatibility still rejects a procedure aimed away from the filed gate.
KMCI63%0.92OUR DISCRETION. A real hub, slightly below the mega-hubs, mirroring its starShare.
KSDF74%0.92OUR DISCRETION. CIFP 2607 carries a full seven-procedure departure set. The high share reflects the airline and Worldport freight operation; bearing compatibility still rejects a procedure that leads away from the filed gate.
KMKC677%0.55OUR DISCRETION. A downtown reliever inside the Class B that shares the metro's published SIDs, so a departing jet commonly gets one — but the operation is GA-dominant and a plain vector departure is routine.
KOJC693%0.55OUR DISCRETION. Satellite reliever on the shared metro SIDs; same reasoning as KMKC.
KIXD688%0.55OUR DISCRETION. As KOJC.
KICT030%0EVIDENCE. The CIFP 2607 extraction carries no usable SID for this field, so there is no procedure to clear anyone via. Every IFR departure is radar vectors.
KTUL016%0EVIDENCE. As KICT.
KSGF061%0EVIDENCE. As KICT; the GA share is the airport master plan's published base-year operations mix.
KBBG084%0EVIDENCE for the procedure count; OUR DISCRETION for traffic shares. CIFP 2607 carries no SID. No current scheduled airline service could be sourced; the modeled board is resort-bound GA and fractional business traffic, with exact shares tuned for play.
KBMI058%0EVIDENCE for the procedure count. CIFP 2607 carries no SID; the GA share is OUR DISCRETION because the airport publishes no current movement split.
KPIA042%0EVIDENCE for the procedure count; OUR DISCRETION for GA share. CIFP 2607 carries ten approaches but no usable SID. The airport identifies commercial, cargo, military, corporate, GA and training traffic but publishes no current movement-share table.
KSTJ662%0.72EVIDENCE for the procedure count; OUR DISCRETION for traffic shares. CIFP 2607 carries the six Kansas City departure families. Rosecrans' official sources identify a mixed municipal and C-130 tactical-training operation but publish no current movement split or procedure-use rate.
KJLN / KJEF / KCOU / KSPI / KFOE038–87%0EVIDENCE. As KICT.
KSLN072%0EVIDENCE for the procedure count; OUR DISCRETION for GA share. CIFP 2607 carries six approaches but no usable SID. The airport publishes more than 75,000 annual operations across airline, corporate, military and training activity but no current category split.
KJEF / KCOU / KSPI / KTOP068–92%0EVIDENCE. As KICT.
KMHK168%0.65EVIDENCE for the procedure count; OUR DISCRETION for GA share and usage. CIFP 2607 carries the WILSY3 departure. The official airport publishes daily American service but no current movement-share or SID-usage table.
KHUT090%0EVIDENCE for the procedure count; OUR DISCRETION for GA share. CIFP 2607 carries eight approaches but no usable SID. No current movement-category split was sourced.
KGCK082%0EVIDENCE for the procedure count; OUR DISCRETION for GA share. CIFP 2607 carries six approaches but no usable SID. The City identifies scheduled passenger, cargo, corporate, training, air-ambulance and military traffic but publishes no current movement-share table.
KBEC090%0EVIDENCE for the procedure count; OUR DISCRETION for GA share. CIFP 2607 carries two approaches and no SID. The FAA identifies extensive training activity, but no current movement split is public.
KRVS085%0EVIDENCE for the procedure count; OUR DISCRETION for GA share. CIFP 2607 carries one STAR and four approaches, but Tulsa One has no usable encoded legs. The exact GA movement share is not public.
KSWO094%0EVIDENCE. CIFP 2607 carries no SID. FAA operational data reports 94% general aviation, and FAA remarks identify student operations.
KWDG032%0EVIDENCE for the procedure count and GA share. CIFP 2607 carries no SID. FAA operations data reports 66% military, 32% general aviation and 2% air taxi. The sim uses the sourced BE40 designator as the nearest available T-1 training-aircraft type and Reach as a generic military radio identity; that callsign abstraction is OUR DISCRETION.
KTBN045%0EVIDENCE for the procedure count; OUR DISCRETION for GA share and military mix. CIFP 2607 carries no SID. Current official sources establish Contour service and joint civil/Army use, but publish no movement split. Reach-tagged C-130 traffic is a generic military abstraction, not a claim about a locally based unit.
KMDH090%0EVIDENCE for the procedure count and training character; OUR DISCRETION for traffic shares. CIFP 2607 carries no SID, and FAA remarks identify high student-training activity. No current movement split is published.
KMWA068%0EVIDENCE for the procedure count and current Contour service; OUR DISCRETION for traffic shares. CIFP 2607 carries no SID. The airport advertises daily Contour flights to Chicago but publishes no current movement split.
KJEF / KCOU / KSPI068–87%0EVIDENCE. As KICT.

Bounds. The share governs airline/freight departures only. GA departures carry no SID at any field — that is the batch-3 eligibility bound carried forward, and it is a documented under-model: real bizjet traffic off KOJC or KIXD does fly the published procedures. Freight is not special: a cargo flight is an IFR airline departure and takes exactly the same path through this model.

17.2 Non-SID IFR departures fly radar vectors

Game behaviorReal practiceVerdict
An IFR departure that does not get a SID is not routed anywhere. It is issued an initial heading with its takeoff clearance — spoken, never silent ("turn left heading two five zero, runway three zero left, cleared for takeoff") — and it flies that heading until the controller does something about it. It reports the heading and its climb on the first radio call ("heading two eight zero, climbing one two thousand") instead of "proceeding direct" anything. It is never auto-routed to a fix, and it can never reach an arrival fix, because it is not navigating to a fix at all.Assigned-heading departures off a runway, worked by the controller, are the ordinary alternative to a published procedure. The clearance form follows 7110.65 3-9-9 (turn direction + heading + runway + cleared for takeoff), the same phraseology the parallel-divergence assignment already used.FAITHFUL in form; the heading itself is OUR DISCRETION. The heading is derived as the runway heading turned toward the filed direction of flight, capped at 40°, in whole 5° steps, with a small seeded jitter so the picture varies session to session. That is a plausible departure vector, not a published one.
A parallel-departure divergence (§4) still overrides the filed vector when one is justified.The divergence is the separation-critical assignment.FAITHFUL. The safety assignment wins; the model does not compete with it.
"Resume own navigation" (R) restores BOTH axes — the filed lateral route and the filed altitude — and ends the vector state. Laterally it rejoins the SID if one is filed and rejoinable, else proceeds direct the filed gate, else (no gate filed) flies the filed course to the destination."Resume own navigation" hands the aircraft back its filed flight plan, which is a route and a profile, not just a route.FAITHFUL. Previously R wrote only the lateral target and left the vertical axis to be picked up a tick later by the own-nav pass; it now writes the filed altitude directly, so the instruction is complete and immediate on both axes.

17.3 Departures never route through arrival fixes

Game behaviorBasisVerdict
A field's departure-eligible fixes are its named fixes minus every fix that appears in any published STAR or approach there. A departure's filed gate is drawn only from that pool, and only when it lies within 50° of the destination bearing. A field whose entire fix ring is arrival structure (KTUL: every named fix is on the STAR or an approach except one) honestly files no gate at all — the flight is filed direct destination and flown on vectors.EVIDENCE for the exclusion: it is a test against the FAA's own CIFP data. If the agency charts a fix as arrival structure, a departure does not file it. The 50° tolerance is OUR DISCRETION.FAITHFUL. The guarantee is structural, not a check: an arrival fix is not in the pool a departure draws from, so it cannot be selected. At KSTL this removes SNYDR, CHIKN, MELVY, STAAN and AUGST from the departure pool — which are exactly the close-in fixes that made the bug look like a "nearest fix" problem.
Legs of a published SID are exempt from this rule.A real charted departure that routes over a navaid an approach also uses (the on-field STL VORTAC on KSTL's OZARK EIGHT) is the published route.FAITHFUL. Flagging CIFP data as a defect would be asserting against the source.

17.4 The TRACON bubble handoff

Game behaviorBasisVerdict
A departure becomes handoff-eligible when it leaves the modelled TRACON volume, not when it reaches a node. IFR: outside the lateral radius OR above the ceiling. VFR/GA: distance only.The player's airspace is a volume; leaving it is what ends the story. Splitting "reach the gate" from "leave the airspace" is what creates the worked middle of a departure.SIMPLIFIED-OK. A cylinder is a deliberate abstraction of delegated TRACON airspace, which in reality is a shelved, sectorised shape. §16's drawn Class B/C/D geometry is a different thing and is not coupled to this.
Radius: the outermost arrival spawn gate plus 2 nm, floored at 15 nm (KSTL 43.8, KDEN 46.1, KATL 43.0, KTUL 44.5, KJEF 15.0).OUR DISCRETION. Derived from the field's own geometry rather than invented: that ring is already the game's boundary, since arrivals are handed to the player crossing it. One consistent volume instead of two unrelated conventions.DISCRETION, disclosed.
Ceiling: field elevation + 10,000 ft, clamped to 1,000 ft below the airport's altitude band so there is always an assignable altitude above it. It is defined and evaluated above field elevation, never as a raw MSL number.OUR DISCRETION for the 10,000 figure. The field-relative property is not discretionary: KDEN's field sits at 5,434 ft MSL, so a raw-MSL ceiling would be meaningless there. The resulting ceilings are KSTL 10,605 / KDEN 15,434 / KATL 11,000 / KJEF 10,549 MSL.DISCRETION for the value; correct by construction for the frame.
The player can always climb an aircraft through the ceiling. The altitude menu offers 1,000-ft stops to the band ceiling; the bubble ceiling is clamped to sit at least one stop below it. Verified at every modelled field (the tightest is KATL, where 12,000 is the one assignable altitude above the 11,000 ceiling).A ceiling the player cannot reach would be a rule that exists only to be broken by the engine.FAITHFUL to its own claim.
VFR exits by distance only.A VFR ship tops out around field + 2,500–3,000 ft, far below any sensible ceiling, so an altitude criterion could never fire for it. Including one would be a rule that reads as real and never is.FAITHFUL.
Nothing is stranded. A departure that has flown its filed gate continues outbound on the filed course rather than re-targeting a fix it is already on, so it always reaches the boundary.Without this a departure chases its gate, passes it, turns back, and orbits forever — which is what happens the moment the gate stops being the handoff trigger.FAITHFUL. Asserted by a soak law, mutation-tested.

Bounds (§17).


18. The comms compression ladder

How a pilot readback gets shorter when the frequency gets hard. Implemented in src/game/compression.ts; enforced by commsCompressionLaw in scripts/soak.ts.

The authority for this section is docs/research-ntsb-comms-patterns.md — ~45 primary sources, being NTSB dockets plus five FAA/Volpe/CAMI voice-tape studies (~250 hours of routine frequency tape with denominators, so the rates below are true rates rather than incident-biased ones). Its §6 BUILD SPEC is the specification this was built to.

It supersedes docs/doctrine-heimlich-reply-comms-model.md where the two disagree. That is the fidelity doctrine working as intended: a retrieved primary source beats recollection, including a working expert's. Rich Heimlich gave us the right shape — compression is real, it is measured in transmission length, borders drop and the core survives — and the wrong order. His example ladder ("Turn left 40 degrees for weather""Turn left 40 degrees""Left 40") sheds the reason clause first. The transcripts show the reason clause is the most durable token in the utterance. We did not implement his ordering.

Game behaviorReal rule + citeVerdict
Rung 1 — advisory/informational payload drops first, at essentially 100%: the wake-interval advisory, "equipment standing by", "traffic permitting", the number-and-follow traffic call. ~1 in 4 is replaced by a token ("copy all") rather than vanishing.Austin tower, NTSB DCA23FA149, 13 clearance/readback pairs: RVR values retained 0/12 (3 replaced by a token, 9 dropped silently), traffic advisories 0/2. Corroborated at JFK, NTSB AIR-24-01 §1.1 (wake advisory + crossing-traffic advisory both dropped, the instruction retained), and independently by the ground-control tape finding that what degrades is the restriction, not the movement instruction.FAITHFUL. This is the best-evidenced rung on the ladder and it was missing from the expert model entirely.
The command verb, runway, heading value and callsign are EVIDENCED-RETAINED and cannot be stripped from a clearance at any rung. A clearance is hard-capped at rung 3 (advisory payload + glue words) by construction.DCA23FA149: command verb 13/13, runway 13/13, heading 11/11, callsign 12/13. Zero cases of command-dropped/value-retained anywhere in the incursion corpus.FAITHFUL. Enforced twice over: capped in effectiveLevel(), and asserted for every clearance at every rung by the soak law, which carries a mutation control that fails if the cap ever stops working.
Rung 3 — glue/function words erode ("hold short of" → "short of", "as published" → ∅, "proceed direct" → "direct"). Applied to clearances too, because it never removes a value or a command verb.JFK AIR-24-01: a taxi-and-hold-short readback in which the function words eroded while the restriction concept and both values survived. That is glue erosion, not loss of the command.FAITHFUL.
Rungs 2 and 4 — readback structure and anchor word drop, SERVICE messages only. "down to eight thousand" → "eight thousand"; "Left heading zero eight zero" → "Left zero eight zero". Never on a clearance.Prinzo 2006 (5 TRACONs, 52 hr, 12,148 messages, 723 coded readback errors): omission is 63.76% of all errors; anchor-word omission 18.95%, of which 12.45 points are HEADING specifically. En-route altitude/heading readbacks lose the verb near-universally even in routine cruise, while tower clearances never do — message type, not workload.FAITHFUL. The direction word survives the anchor drop, which is what produces the observed "Left 40" form.
Rung 5 — number loss is TRUNCATION, not deletion. The magnitude prefix goes and the distinguishing tail digits survive: heading "zero eight zero" → "eight zero"; speed "one eight zero knots" → "eighty on the speed". Altitudes are never truncated.Prinzo 2006: number-element omission 24.62% of coded errors, of which ~11.20 points are SPEED. On which elements are fragile, two studies agree that altitude is the safest (1.18% / 0.4% error) and frequency and crossing restrictions the most dangerous (altitude restriction 18.57%) — so the naive assumption that altitude readbacks are the risky ones is inverted here.FAITHFUL. Speed truncates to the observed "eighty on the speed" form specifically because it names its own topic and therefore stays unambiguous; bare unit deletion is not what the corpus shows and we do not do it.
Rungs 6 and 7 — callsign prefix dropped (airline name gone, numbers kept), then bare "Roger". Mid-exchange turns only; never on an exchange opener, never on a clearance.Prinzo 2006: the dominant partial callsign form is no prefix, all numbers at 16.0%; no callsign at all 6–7.6% of responses in normal operations but *27–28% of erroneous readbacks. Cardosi 1996 tower local: 27% bare "roger", which Cardosi calls "often necessary on congested frequencies during extremely busy traffic periods". SWA1380 (DCA18MA142): callsign present on every exchange-opener, absent on every* mid-exchange turn — governed by turn position, not stress level.FAITHFUL, with one modelling note: this is DRIFT, not sanctioned abbreviation. It is the structural inverse of the legal AIM 4-2-4 abbreviation (which keeps the prefix and drops the leading digits) and it crosses 7110.65 2-4-3. We model it as a degradation signal, not as a register.
Rung 8 — the transmission simply does not happen, on frequency changes only.Cardosi 2016 (ZKC): 8% of frequency changes drew no pilot response and required the controller to re-call. Two ZDV controllers in DCA10IA001 independently stated that air carriers commonly do not acknowledge frequency changes at all.FAITHFUL. Silence is a modelled state, not the absence of one.
The BASELINE form mix is an ENVIRONMENT CONSTANT, not a load effect. A tower frequency sounds dramatically more compressed than a TRACON at identical traffic. Drawn from a per-environment distribution over the rungs before any pressure is applied.Measured, from routine-operations tape with denominators: tower local 28% full / 37% partial / 27% ack-only / 7% mike-click+none (Cardosi 1996, 48–49 hr, 10 towers, 8,444 messages); TRACON 82.7% / 7.9% / 4.0% / 3.8% (Prinzo 2006, 52 hr, 5 facilities, 11,159 paired).FAITHFUL to the two measured distributions. Wired to the field's published facilityKind.
The driver is TIME AVAILABLE first, criticality second, load third. Contact Load is deliberately a secondary modifier.Research §6.1, and the reason is empirical: Austin's worst degradation occurs at identical workload to its perfect clearances, and the three emergency transcripts rank by time-to-ground, not severity (US1549 3.5 min vs SWA1380 17 min).FAITHFUL in structure and precedence. The threshold values are ours — see the discretion list below.
Courtesy is a switch, not a rung. Present while there is time; gone at once when there is not.SWA1380 (17 min available): "sir" and "please" alive to ~90 s from touchdown. US1549 (3.5 min): zero courtesy tokens after the bird strike.FAITHFUL in mechanism. The 5-minute boundary between those two anchors is ours.
Under a live conflict or CA the ladder runs NEGATIVE: the frequency gets longer and more explicit, not shorter. Three expansion rungs. −1 the flight is addressed by its full callsign, no AIM 4-2-4 abbreviation, weight class included. −2 a live landing clearance the instruction does not itself touch is restated ("…, you are still cleared to land runway one two right") instead of left as an implicit back-reference; on the pilot side, any clause of the clearance the readback did not echo is restated. −3 on a runway clearance, for a runway the sim has verified clear, the explicit negative statement is spoken in the corpus's own words: "…, there is no one on runway one two right but you".Research §6.3: under conflict compression_level "does not just fall to 0 — it goes negative, i.e. transmissions expand past baseline: full callsign, and for air carriers including the weight class; full clearance restated rather than referenced; an explicit negative statement where doubt exists ('there is no one on that runway but you')."FAITHFUL. Expansion is primarily controller-side — what the game puts in the player's mouth — because all three evidenced constructions are, in the transcripts they come from, things a controller says. That is consistent with §4.3 (which makes compression pilot-side because the controller is the scripted party) and with §6.3a, where the controller's own curve is the inverse of the crew's and includes "re-lengthens". The crew keeps rungs −1 and −2. Every expansion path is additive by construction — nothing on this half of the ladder can delete a word — which is why it is also applied to locked transmissions that may never compress. Enforced by commsExpansionLaw in scripts/soak.ts with four mutation controls, including a false-reassurance control: with no verified-clear runway the negative statement must not appear at all. Where the boundary between the rungs falls, and the choice to make expansion controller-led, are OUR DISCRETION.
The ladder is applied only to the pilot readback, never to the controller instruction.Research §4.3: compression is asymmetric by role. Controller phraseology is templated, recorded and QA'd; the pressure lands on the party with no script.FAITHFUL.
Non-command pilot transmissions (check-ins, position reports, unprompted calls) do not yet compress — only the command/readback exchange does.NEEDS-REFINEMENT (v0.3). The exchange path is where the evidence is densest and where the player hears it, so it shipped first. Suggested fix: extend the tap to the sim's onReadback emissions.
The controller's own compression curve is not modelled at all.Research §6.3a: the observed controller rule is the opposite of the crew's — the controller lengthens when the crew is answering, shortens when the crew is saturated, and re-lengthens into a dead channel when the crew goes silent. And the controller degrades MORE than the crew, with more disfluency, not less.NEEDS-REFINEMENT (v0.3). In VectorHeavy the player is the controller, so this is a question about what the game puts in the player's mouth, not a simple port of the ladder.
The emergency arc ships with both ends. ONSET SILENCE: a 7700 crew does not transmit for a seeded 20–35 s after the event — the aeroplane is squawking and flying, and the mayday has not happened yet. DECLARATION (already locked against compression) → EXCHANGE PHASE (the ladder, depth set by time available) → TERMINAL SILENCE: inside a seeded 60–90 s of the ground the crew stops transmitting for good, and the player keeps broadcasting into a dead channel. Seconds-to-ground is the nearer of the declared fuel deadline and range-to-threshold over ground speed, the latter only once the flight is genuinely committed to an approach.Research §6.12a, the arc as a state machine: "1. ONSET SILENCE 20–35 s. Two unanswered routine clearances. The crew is flying, not talking. … 4. TERMINAL SILENCE. Short-fuse events END in nothing. US1549's last crew transmission was 75.7 s before touchdown — ~36% of the whole emergency. The controller keeps broadcasting into a dead channel."FAITHFUL to the arc's shape, and to its doctrine line: do not end an emergency with ever-shorter transmissions, end it with silence. SILENCE IS A COMMS STATE, NOT A CONTROL STATE, and that is structural rather than promised: the three fields involved are written by the emergency tick and read only by the presentation layer, so the command, steering and separation paths cannot see them. A silent aircraft accepts and flies every instruction. It is not NORDO (7600), which is a different modelled silence (§6.13) that really does refuse commands, on its own separate path. Legibility: the strip and the data block read NO TX for the duration, the help panel explains it, and the AAR names it as a contributing factor. emergencyArcLaw in scripts/soak.ts drives a real arc at all 13 fields and issues a heading to the aircraft inside both silences, requiring it to accept and physically turn; three mutation controls cover NORDO confusion, a resolved emergency and the detector's own ability to fire. The onset range is the observed one; the 60–90 s terminal band is OUR DISCRETION — the corpus gives one anchor, not a curve.

Explicitly OUR DISCRETION in this model

Listed separately because these would fail an authenticity audit if presented as sourced, and the three-bucket rule requires them to be named:

Named as UNESTABLISHED by the research, and therefore not modelled

The research doc searched for these and found no usable source. We have not invented numbers to fill the gaps:


19. Terrain is not modelled, and at KLAS that is the headline

§8 records the general omission: there is no terrain grid, no MVA/MIA, no MSAW, and the altitude floor at every field is a flat number rather than a terrain-derived one. That row has been in this ledger since the beginning and it applies everywhere. This section exists because at one modelled field the omission stops being a footnote and becomes the single most misleading thing on the scope, and burying it inside a general row would be the kind of quiet smoothing this page exists to refuse.

KLAS — Harry Reid International, Las Vegas. The field sits on the floor of the Las Vegas Valley, a bowl. The Spring Mountains rise to the west, with Charleston Peak at 11,916 ft — roughly 9,700 ft above the field and inside 25 nm of it. Frenchman and Sunrise Mountains stand immediately east of the airport at around 4,000 ft. The McCullough Range closes the south and the Sheep Range the north. Terrain is not scenery here; it is the thing that determines where aircraft may be put, which arrivals exist, how high the minimum vectoring altitudes are in each sector, and why the published chart set has no instrument approach at all to runways 08L or 08R. The FAA's own capacity profile for the field names it twice as an operational constraint — "high terrain to the west", and "military airspace, high terrain, and proximity to other airports reduce arrival and departure flows at LAS."

None of that is in the model. Concretely, at KLAS as at every other field:

What this means for a prep-oriented player, stated plainly: VectorHeavy's KLAS must not be read as teaching Las Vegas terrain avoidance, Las Vegas MVAs, or terrain-driven vectoring judgement of any kind. A controller who knows Vegas will notice the mountains are missing within a minute, and they are right to. Sequencing, separation, phraseology, the published procedures and the runway crossing this field is built around are all modelled and are all worth practising. The vertical picture is not. Treat every altitude you assign here as a number in a game, because in this model that is exactly what it is.

We are stating this rather than fixing it because the fix is a real subsystem (§8's roadmap item: an MVA polygon layer plus a low-altitude alert), and shipping a field this terrain-defined behind a quiet footnote would have been the dishonest option. The disclosure is the price of the field.

The same omission matters at KTBN in the Ozarks. Forney Field's surrounding ridges are not drawn, and the game has no terrain surface, MVA grid, or MSAW. The runway, Class D and procedure geometry are sourced; their presence must not be read as a claim that an off-procedure vector is terrain-safe. The omission is also operationally important at KBBG. FAA airport remarks explicitly warn of hills and uneven terrain near Branson and note that terrain avoidance may activate on final. Those hills, terrain alerts, MVAs and MSAW are not modeled. The sourced runway, Class D and procedures must not be read as a claim that an off-procedure vector is terrain-safe.

The omission is operationally important at KPDX as well. The Cascades and the Columbia River Gorge shape the real Portland terminal environment, but the game draws only the sourced river routes. It has no terrain surface, MVA/MIA grid, MSAW or low-altitude alert. KPDX's published procedures and runway flows are modelled; an off-procedure vector must not be read as terrain-safe.

KPDX's exact airline weights, 4% GA share, twelve-aircraft cap, spawn cadence, ramp and 90% STAR/SID assignment rates are OUR DISCRETION. The Port of Portland's 2025 statistics and current nonstop roster establish the carrier and market basis, not those game coefficients. Its east/west runway flows are published FAA capacity-profile facts. The Columbia and Willamette centerlines are USGS NHD facts; their displayed widths are OUR DISCRETION.

Game behaviorReal environmentVerdict
KLAS is modelled with no terrain, no MVA/MIA, no MSAW; the vertical band is a flat 5,000–14,000 ft MSL derived from field elevation.7110.65 5-6-3 (aircraft at or above the MVA/MIA); the Las Vegas basin is ringed by terrain from ~4,000 ft immediately east to 11,916 ft ~25 nm west.DOCUMENTED MAJOR OMISSION, named at the field where it matters most. Nothing the game does here is presented as terrain-safe — but nothing stops you either, so the honesty has to come from this page. NEEDS-REFINEMENT (v0.3+, tracked with §8).
The same omission is disclosed on the field's own lobby page and in its changelog entry, not only here.FAITHFUL to the disclosure doctrine. A player who never opens the fidelity ledger still gets told before they sit down.

20. Aircraft types: what the FAA publishes, and what we made up

Every aircraft on the scope resolves through one table (src/data/aircraftTypes. generated.ts). That table decides the wake category, the slowest speed a pilot will accept, how long the aircraft holds the runway on rollout, how fast it can descend and change speed, and how many souls it reports on a 7700. It used to be hand-authored, and hand-authoring it cost us the worst honesty failure on this page.

The failure. Airline fleet lists and ga.types lists name type codes as bare strings, and nothing checked those strings against the table. Nine codes were referenced and never defined: A319 and A220 (KICT, KTUL), B739 (KATL, KDEN, KSEA, and the center's overflight mix), C25A/C25B/C25C (KICT, KIXD, KMKC, KOJC, KTUL), DH8D (KSEA), E170 (KMCI) and TBM9 (KICT, KIXD, KMKC, KTUL). Every lookup in that module falls back on a miss — wake class to large, approach-speed floor to 160 kt, landing distance to 5,000 ft, souls to 100–175 — so those aircraft flew as generic large jets. A nine-seat Citation CJ2 and a single-engine TBM held large-class wake separation, refused any speed below 160 kt, occupied the runway for a widebody's rollout, and could report 163 souls on board. This was live in production. It is fixed, and the fix is a pipeline rather than nine more hand-authored rows.

The source. The table is now generated from FAA Order JO 7360.1K, "Aircraft Type Designators" (date issued 2025-04-10, effective 2025-06-12; cancels JO 7360.1J), a US Government work in the public domain, retrieved from faa.gov and pinned by SHA256 in reference/faa-sources/MANIFEST.md. Appendix A of that order is the authoritative list of designators approved for use in the NAS, and it carries per designator the aircraft class, engine number-type / FAA weight class, ICAO wake turbulence category, Consolidated Wake Turbulence (CWT) category, Same Runway Separation category, LAHSO group, and every MANUFACTURER, Model that decodes to it. All 2,691 designators are transcribed verbatim into reference/faa-sources/jo7360-1k-appendix-a.tsv, which is committed — the pipeline is reproducible without re-downloading the PDF.

WhatProvenance
The designator itself (icao)SOURCED. A code that is not in the order cannot enter the table.
Make and modelSOURCED, verbatim. Each entry names the one MANUFACTURER, Model row it represents and the generator fails if that exact string is absent from the source row, so make/model cannot drift.
ICAO WTC and CWT categorySOURCED, verbatim.
Wake class (small/large/heavy/super)DERIVED from the sourced CWT by one documented rule: A → super; B/C/D → heavy; E/F/G → large; H/I → small. This is a collapse of the FAA's real nine-category scheme (see §2), not a judgement per aircraft.
Variant (the common trade name: "Q400", "Citation CJ2")OUR DISCRETION. The order prints registry model strings, not marketing names.
Radio type word ("Skyhawk", "King Air")OUR DISCRETION. Not a field of this order.
Approach speeds, scope-speed envelope, climb modifier, landing distance, souls on boardOUR DISCRETION, and this is the important row. JO 7360.1 is a designator registry: it publishes no speeds, no landing distances and no climb rates. These figures are tuned game parameters, chosen to be plausible for the type's class and internally consistent across the table. They are not published type performance and are not presented as such anywhere in the game, this page, or the generated file. Every figure that was already shipping is carried over unchanged, so building the pipeline did not silently re-tune any aircraft that was already flying.
Which designators the table carries (108 of 2,691)OUR DISCRETION. Rule: everything any field references, plus the common US commercial fleet, plus the common US GA/business fleet. The 56 breadth types are marked future: true and spawn nowhere; they exist so a new field pulls its mix from a real list instead of inventing a code, which is exactly how the nine phantoms happened.

KBLV adds four sourced air-mobility designators to the live table: K35R (KC-135R), C17, C5M and LJ35 (the C-21 family). Their identities and wake categories come from FAA Order JO 7360.1K. Their game speeds, climb modifiers, landing distances and soul ranges remain OUR DISCRETION, under the same rule as every other type.

KPIA adds the sourced C130 designator for the 182d Airlift Wing operation at Peoria; its identity and wake category come from the same FAA order, its performance figures are game tuning like every other type.

Two codes we had been using were not designators at all. The check caught them the moment it existed: E175 is not in the order (the ERJ-170-200 US regionals fly is E75L, long wing; E75S is the short wing), and PA28 is not in the order (the fixed-gear Cherokee/Archer/Warrior family is P28A). Both were corrected everywhere they appeared.

What the source confirmed rather than contradicted. The CWT mapping reproduces every wake class the hand-authored table carried, including the awkward ones: the Gulfstream IV is CWT G and therefore large while the other business jets are H/I and therefore small, which the old table had reasoned its way to by MTOW. The hand work was right; it just had no gate.

Game behaviorReal environmentVerdict
Type identity and wake category are generated from JO 7360.1K Appendix A and re-verified against the committed extract by npm run validate:types on every run.JO 7360.1 is the order that governs which type designators may be used in the NAS, and it is the FAA's own carrier for CWT and SRS category.FAITHFUL. This is the same doctrine as the CIFP and Class Airspace pipelines: never hand-author what has a real source.
Performance figures (approach speed floor, landing distance, climb modifier, souls) are ours.No FAA publication carries these per designator; real figures live in each type's AFM.DISCLOSED DISCRETION. They are tuned for play, they are labelled as tuned in the data file itself, and no screen in the game claims otherwise. NEEDS-REFINEMENT: sourcing real Vref and landing-distance figures per type from published AFM data would upgrade this row; until that is done with a retrievable source, these stay marked as ours.
A type code referenced by a fleet but missing from the table can no longer exist, and a type in the table that is not a real designator can no longer exist.FAITHFUL, and it is the gate that was missing. Both directions are hard failures in validate:types, and both were mutation-tested: injecting a bogus fleet code, a wrong manufacturer, a wrong wake class, and a non-designator type each fail the build.
The sim's four wake classes are still a collapse of the FAA's nine CWT categories.7110.65 5-5-4 CWT, categories A–I.SIMPLIFIED-OK, unchanged from §2 — but the collapse is now performed on the sourced CWT letter rather than on a hand judgement, and every entry keeps its CWT letter so the full A–I migration on the §2 backlog is now a data-free change.

21. Which airports are towered, and which Center owns them

The lobby groups every playable field under an ARTCC, and each Center section carries a "N of TOTAL" brick-progress note. Until now both halves of that claim were hand-typed: the field-to-Center mapping in src/data/centers.ts, and the total in docs/ZKC_BRICK.md, assembled by reading one airport's Chart Supplement at a time. The method was sound and nothing checked it.

What it cost. The hand-built ZKC roster said 26 civil towered fields. The FAA's own data says 33. Nothing in it was wrong — every one of the 26 is a real ZKC towered field, and every exclusion it argued (KLWC, KUIN, KAAO, KFLV all untowered; KOKC/KDSM/KOMA/KXNA/KDEC and the rest in neighbouring Centers) matches the FAA exactly. It was wrong by omission: seven fields were never enumerated, so they were never checked. Two of them (KPIA Peoria, KBMI Bloomington-Normal) sit inside Chicago Center's published boundary while Kansas City is the responsible Center — the exact case a by-eye boundary read cannot get right. One more (KBEC, Beech Factory) was excluded as "private use" when the FAA records it as privately owned but public use.

The fix. src/data/toweredAirports.generated.ts is generated from the FAA NASR 28 Day Subscription (effective 2026-07-09; pinned by size and SHA256 in reference/faa-sources/MANIFEST.md §7, committed extract at reference/faa-sources/nasr-2026-07-09-towered.tsv). Tower status is NASR's TWR_TYPE_CODE; the Center is NASR's responsible ARTCC, the value the Chart Supplement prints. 712 US towered airports across 25 ARTCCs, per-Center brick rosters derived rather than counted.

Game claimReal environmentVerdict
Every playable field is towered, and is grouped under the Center the FAA says is responsible for it. Both are hard-checked by npm run validate:towered on every run.NASR is the FAA's own 28-day airport data distribution; the responsible-ARTCC field is what the Chart Supplement prints.FAITHFUL. No airport, tower status or ARTCC assignment in the roster was typed by a person. The gate was mutation-tested: a field mapped to the wrong Center, a field in the registry that the FAA does not tower, a hand-edited generated roster, a wrong field elevation, and a Center id that is not a real ARTCC each fail the build.
A Center's brick total is the count of public-use towered fields the FAA assigns to it."Towered" and "public use" are both published NASR fields, not judgements.FAITHFUL as data. Which of those fields belong in a game brick is still our doctrine call (military fields are counted separately and deferred), and it is disclosed as such in docs/ZKC_BRICK.md.
ARTCC ownership is treated as one value per airport.Ownership can change by altitude stratum at a Center seam, and NASR itself publishes both a boundary and a responsible ARTCC, noting they "may not be" the same — they differ at 21 of the 712 towered fields.SIMPLIFIED, and now measured. The roster carries both values, so the seam cases are visible instead of hedged. The game models terminal airspace, where the responsible Center is the one that matters.
Tower-only versus own-radar-room ("APP seat") is read from the FAA facility type.NASR distinguishes ATCT from ATCT-TRACON / ATCT-RAPCON / ATCT-RATCF / ATCT-A/C.FAITHFUL, and it corrected us. The hand roster had KSTJ as tower-only (it is a RAPCON) and KSPI as its own approach seat (it is a tower whose approach control is furnished by St. Louis TRACON).
Field elevations in the airport modules match the FAA's published value.NASR publishes surveyed field elevation to a tenth of a foot.NEEDS-REFINEMENT, one field. 20 of 21 built fields match within the ±1 ft rounding band. KSTL carries 605 ft; the FAA publishes 617.3 ft — 12 ft low, and it feeds the TRACON floor/ceiling derivation. It is an explicit, printed waiver in validate:towered, not a silent tolerance, and it fails the build the moment the number is fixed without removing the waiver.

The gate was checking fifteen fields out of seventeen, and said PASS. validate:towered kept its own hand-typed array of airport modules while the registry carried seventeen. KSUS and KSGF were not in it, so their field elevations had never once been compared against NASR; validate:types carried the identical fifteen-entry array, so those two fields' airline fleet and ga.types lists had never been checked against the type table either. Both rosters are now derived from scripts/airportRoster.ts, and on their first run the two newly covered fields passed: KSUS 463 ft vs NASR 463.3, KSGF 1268 ft vs NASR 1268.3, both inside the ±1 ft rounding band, and neither field references a type the order does not define. Nothing was wrong; nothing had been looked at. The recurrence law is in validate:registry, and it now forbids the pattern rather than policing a list of files: any file under scripts/ that enumerates airport modules by hand fails the build unless it is registered as an explicit exception with a reason and a closed code list.


21b. What the public pages claim about the real world

The per-airport pages at /airports/<icao>/ carry hand-authored prose. validate:landing-copy holds every sentence about our data to that data, and it is honest in its own header about the half it cannot reach: a claim about the real airport that our data does not carry is invisible to it. Those claims are this section's job, and the standard is the same three buckets as everywhere else — a PUBLISHED FACT carries a citation, OUR DISCRETION says so, and UNKNOWN is never asserted.

A sweep on 2026-07-28 found seven real-world claims in the seventeen blurbs. Three are derivable from NASR (document 7, already pinned by SHA256 in reference/faa-sources/MANIFEST.md; the copy the derivation was run against hashed identical to the pin). Four could not be sourced to any primary FAA document and were cut, not softened into a vaguer number.

Claim on the pageFieldSourceStatus
"eight runways, more than any other public-use airport in the United States"KORDNASR 2026-07-09, APT_RWY.csv joined to APT_BASE.csv. Counting hard-surface (CONC/ASPH/PEM) runways at open, US, airport-type, public-use facilities: ORD 8, DFW 7, DEN/BOS/DTW 6, ATL/IAH 5.SOURCED. Was "more than any airport in the world"; NASR is a US dataset and publishes nothing about the world, so the claim is now exactly as wide as its source.
"16R/34L is the longest runway at any public-use airport in the United States, at sixteen thousand feet"KDENNASR 2026-07-09, APT_RWY.csv. DEN 16R/34L 16,000 ft is the longest runway in the entire US landing-facility set, public or private (next: Edwards AFB 05R/23L, 15,024 ft).SOURCED. Was "in North America"; NASR does not cover Canada or Mexico. The claim is now narrower than the truth may be, which is the right direction.
"fourteen thousand eight hundred and thirty-five feet, the second-longest paved runway at any public-use airport in the United States"KLASNASR 2026-07-09, APT_RWY.csv. Hard-surface runways at US public-use airports: DEN 16,000; LAS 08L/26R 14,835; JFK 13R/31L 14,511. (Four 15,000 ft entries rank between them and are seaplane water lanes, not paved runways.)SOURCED. Was "one of the longest civil runways in North America" — an unfalsifiable phrase over a region the source does not cover. It is now a rank with a denominator.
"roughly four hundred real operations a day"KSUSNONE FOUND. NASR's airport record does carry annual-operations fields (layout apt_rf.txt, elements A100–A105 plus the 12-month ending date), and in this cycle every one of the 19,436 airport records has them blank — measured, not assumed. The tower counts that would settle it live in ATADS/OPSNET, which serves reports from an interactive query endpoint with no citable, hashable published document behind it.CUT. The closer now makes the same point without a quantity. A number recalled rather than retrieved is the failure this ledger exists to prevent, and it would have been worse than silence.
"the busiest airport in the world by passenger traffic"KATLACI World, 2025 final global rankings, released 2026-07-15: ATL 1st with 106,302,208 passengers, ahead of Dubai (95.2M) and Tokyo Haneda (91.7M). Airports Council International is the airport trade association that collects the traffic returns; it is not an FAA product, and it is cited here as ACI, not as FAA.SOURCED, restored, and narrowed to PASSENGERS. It had been cut for want of an FAA source. Restored on the founder's call that a cited non-FAA primary is honest under the three-bucket rule. The scope matters: see the KORD row below, because "busiest" means something different to a controller.
"works more aircraft movements than any other airport in the world"KORDACI World, same 2025 release: ORD 1st by aircraft movements with 857,392, up 10.5% on 2024, in ACI's words "displacing Hartsfield-Jackson Atlanta."SOURCED. This is the ranking that actually bears on this game: we control aircraft, not passengers, so movements is the controller's meaning of "busiest". Writing an unqualified "busiest in the world" on ATL would have handed O'Hare's real claim to the wrong field. Both claims are now stated in the metric they are true in.
"the largest commercial aviation maintenance facility in the world"KTULNONE FOUND. No FAA publication ranks maintenance facilities.CUT. The base is still named; the superlative is gone.
"the level-4 tower serving Springfield"KSPINONE FOUND. NASR publishes facility type (ATCT vs ATCT-TRACON, §21 above), not the FAA's facility level.CUT. The facility type it does publish was already correct and is unchanged.

Three further sentences were examined and deliberately left: Wichita's "Air Capital of the World" and Tulsa's "Green Country" are civic nicknames rather than assertions, and Kansas City Downtown's "the metro's original airport" and New Century's "the old Olathe Naval Air Station" are historical background carrying no quantity. They are recorded here so the next sweep knows they were judged rather than missed.

A second sweep on 2026-07-28, with KALN, KBLV, KBMI, KCPS and KPIA, added one claim that is deliberately NOT a published fact and is labelled here instead of being cut.

Claim on the pageFieldSourceStatus
"Belleville regulars will tell you the field occasionally stops for a VIP movement, a Cabinet aircraft or Air Force Two" (landing page closer, and the lobby card's "now and then everything waits on a VIP movement")KBLVNONE, and none is claimed. This is the founder's own first-hand observation from flying out of Belleville, not an FAA publication. No FAA document describes the behaviour, and none was looked for after the fact to dress it up.OUR DISCRETION, disclosed. It is written as what locals say, never as an FAA-sourced procedure, and the sentence next to it says the game does not simulate it. VectorHeavy models no VIP or priority-movement mechanic at any field; this is field character, not behaviour.
Which of the two parallels carries the Air Force base and which the civil terminalKBLVNONE FOUND. NASR names the joint facility and its tower operator but does not assign a runway to an operator.UNKNOWN, and unasserted. An earlier draft of both the page copy and flowsProvenance assigned them by compass side. No primary document on hand supports it, so the assignment is gone from the data comment and was never shipped in the copy. The joint civil/military status itself is NASR-published and stays.

This is a human sweep, and it does not become a gate. No token matcher can tell a sourced world claim from an invented one, and shipping something that looked like a gate would be worse than the honest gap.

21c. FAA facility levels (data carried, nothing driven by it yet)

src/data/registry.ts now carries faaLevel on each airport: the real FAA air traffic facility level, 4 through 12, the scale that ranks a facility by traffic count and complexity and sets its controllers' pay band. It exists for the career ladder in docs/CAREER.md, which wants real rungs rather than an invented difficulty number.

Nothing in the game reads this field today. The lobby's STEADY / BUSY / HEAVY tags are still the only difficulty grouping a player sees, and they are our own three-bucket UI shorthand, not the FAA scale. This section exists so that a sourced-but-unused field is disclosed as such rather than discovered later.

Game claimReal environmentVerdict
Eighteen of the forty modelled fields carry an FAA facility level, 4 through 12.The FAA assigns a level to each of its facilities; the levels behind KATL, KORD and KDEN are 12, and the lowest on our roster are KSPI and KPIA at 4.PUBLISHED FACT, secondary source, corroborated. The levels come from 123atc.com, which is not an FAA publication. Before any of them was written into the data, all eighteen were checked against a primary source that publishes only coarse bands: the FAA Air Traffic Controller Workforce Plan groups facilities into 4-9 and 10-12. Eighteen of eighteen fall inside the band the FAA's own plan puts them in. validate:registry re-runs that check on every gate run, so the agreement cannot rot quietly.
The other twenty-two modelled fields carry no level at all.Facility levels are assigned only to FAA-staffed facilities. Contract towers and military fields are not levelled; they are described by contractor and union, or by service branch.PUBLISHED FACT, and the absence is the fact. The same source's sibling rosters for contract towers and DoD facilities carry no level column at all, which is what established this. A gate demanding a level everywhere would be demanding a number that does not exist, so the registry gate requires only that any level PRESENT is an integer 4 through 12.
The career ladder's beginner rung is the set of fields with NO FAA level.The FAA levels only its own staffed facilities, and its Contract Tower Program covers towers that do not meet the cost-benefit case for FAA staffing, which are largely the low-activity ones.OUR DESIGN, on a real signal. The absence of a level is genuine FAA-sourced information and it does correlate with low activity, but the FAA does not call these fields rookie, entry level, or anything else; it says nothing about them at all. Reading "unlevelled" as "beginner" is our inference and is labelled as ours wherever it appears. 17 of the 40 fields qualify, all of them tower-only seats, which is also the order a real developmental checks out: local control first, radar later.
Five unlevelled fields are deliberately NOT on the beginner rung.KBLV (Scott AFB), KSTJ (Air National Guard, C-130), KFOE, KSLN and KWDG (Vance training traffic) are military or joint-use. They carry no level because the Department of Defense is not on the FAA scale.DISCLOSED GAP, and it is named rather than smoothed over. These five are unlevelled because of who staffs them, not because they are quiet, and a pilot-training field can be one of the busiest towers in the country. All five are tagged BUSY on the card the player reads, so filing them under "beginner" would contradict the game's own label. They sit in an explicit UNPLACED set: neither on the FAA scale nor on the rookie rung. Where they belong is an open question, and validate:registry pins the set so a sixth field cannot drift into that limbo unnoticed.
A field's level is its TOWER's level.At the largest fields the approach control is a separate facility with its own level: KATL's tower and the A80 TRACON are both level 12, but they are two facilities.DISCLOSED SIMPLIFICATION, and it is not load-bearing yet. Our seats can combine tower and approach where the real field splits them across facilities, so a single number per airport is already an abstraction. It is recorded here now, before the career ladder leans on it, because that is when the choice has to be visible.

21. The shift clock: what time it is on your scope

Every shift opens at a local time, and the turnover briefing reads it out ("0614 local, morning shift"). Pilots greet you against it, and handoff sign-offs follow it. That clock keeps running on sim time, so a long session really does walk out of the morning push and into the afternoon.

Where the time comes from depends on the mode, and the game says so.

What the game doesWhyVerdict
Sandbox and Arcade open at YOUR local time. The browser's own clock is read once, when the session starts, and that is the time on the scope. Sit down at 2140 and you are working an evening shift.It is the only clock actually available — the game runs entirely in your browser after it loads, and the server it came from is on UTC, which is nobody's evening. It is also the honest one: "it is evening here and evening in the game" is what a shift is supposed to feel like.OUR DISCRETION, and it is a game-feel choice rather than a fidelity claim. No real facility's schedule is being modelled; you are being handed the position at the time you sat down.
Ranked opens at a time drawn from the session seed. Not your clock. The shift line on the briefing says so in as many words.A leaderboard is only comparable if everyone faces the same spread of shift times. A 0300 mid is part of the challenge, and it has to be drawable by every player, not only by whoever happens to be awake at 0300.DISCLOSED. The briefing tells you the time is coming from the seed, because a 0300 shift while it is two in the afternoon where you are sitting otherwise reads as a bug.
The distribution ranked draws from is weighted — morning and afternoon pushes common, the overnight mid rare.Facilities are busiest in the pushes; a random uniform hour would put you on a 0300 mid a quarter of the time.OUR DISCRETION. The weights are game-design coefficients (like the Contact Load bands), not a claimed FAA watch schedule. Nothing in the game presents them as one.
The overnight band greets with "good morning".After midnight the calendar day has turned, so a check-in that opens "good morning" is the ordinary read.DISCLOSED DISCRETION. Rich Heimlich named morning / day / evening; the overnight case is our judgement call, and it is the only band whose greeting is a choice rather than obvious.

None of this weakens the determinism guarantee, and that is structural. The real clock is read exactly once, in the host, before the sim exists; the resulting minute is passed into the sim as an input and recorded on the proof tape, so a replay of an evening sandbox session is still an evening session years later. Nothing under src/game/ may read a wall clock at all — a gate greps for it and fails the build. Tapes recorded before the clock became a session input replay exactly as they always have, because their recorded time is the seed derivation, and a tape old enough to omit it falls back to that derivation. Both directions are mutation-tested in scripts/replayDeterminism.ts.

21a. How a shift ENDS: position relief

The clock's bookend. A shift opens with a colleague handing you the position; it now also closes with you handing it to the next controller (END SHIFT).

What the game doesWhyVerdict
A shift has no fixed length. Relief is available at will, from the first minute, and the shift's score is the score at the moment you hand over.Open play. The alternative — a fixed shift you cannot leave early — would be closer to a real watch schedule, but it would make the game a timer rather than a position.OUR DISCRETION, and a game-design choice, not a claim about any facility's schedule. Real watch lengths, position rotations and the two-hour-on rhythm are not modelled.
Relief is allowed mid-crisis, with traffic on frequency and a conflict live. The review says what the next controller inherited.Real relief happens when it happens. Controllers do get relieved in the middle of something, and handing your replacement a mess is a real event with a real briefing.FAITHFUL in kind, not in procedure. A real relief briefing is a checklist-driven verbal handover (7210.3 position relief briefing); the game has no such exchange yet — see docs/spec-relief-and-duration-board.md.
Stopping while you are ahead is a legitimate strategy, and nothing prevents it.The score board rewards knowing when to stop; the duration board rewards staying. The two pull in opposite directions, so the tension is the design rather than something to police.OUR DISCRETION. No real-world analogue is being claimed.
Closing the tab records nothing. Not a score, not a duration.It is not an ending; it is an absence of one. There is now a deliberate way to finish, so declining to use it is a choice.OUR DISCRETION.
The duration board ranks the longest shift WORKED, and a shift must sustain at least 6 completed operations per hour (and at least 2 in total) to be on it. The board says so on its face. Every ending still counts, and nothing is filtered for HOW it ended."Longest shift worked" and "longest tab left open" are different claims, and the board makes the first one. This is not the anti-gaming machinery ruled out for the score board — there is still no minimum shift length, no cooldown and no anti-banking rule, and relief stays available from the first minute. It is a statement of what the number means. It exists because it was measured: with no commands issued, busy fields end an idle shift on their own (KORD 20/20 within two hours, median 11m41s), but low-demand fields do not — KJEF/KCOU/KIXD/KMKC/KSGF/KSPI/KOJC all have seeds that run 12 sim hours with traffic flat at 6–8 aircraft and no conflict ever maturing.OUR DISCRETION, both numbers. They are game-design coefficients, not any published productivity standard, and no facility's expected throughput is being claimed. Calibration is stated rather than asserted: the genuine 46-minute KSTL record (23 operations) needs 4.6 and clears by 5.0x, while every measured idle shift has 0 operations and fails at every length. Even the quietest modelled field offers 95–164 aircraft/hour, so a quiet field is not disadvantaged by the rate. Enforced on the client and re-derived on the server from the ledger's own operation count, so a hand-crafted submission cannot assert it. The sim's underlying behaviour — unmanaged traffic saturating and then settling instead of escalating — is the deeper issue and is not fixed by this; it is filed as docs/ticket-unmanaged-traffic-escalation.md.

22. Regional geography is one world, not one sketch per scope

KMHK consumes the same canonical Kansas River centerline used by the Kansas City-area fields and projects it from Manhattan's FAA ARP; no field-specific river was drawn. The current canonical source trace ends east of Manhattan inside the widest KMHK scope, so the validator reports that visible endpoint. That is a DOCUMENTED SOURCE-EXTENT LIMITATION rather than permission to invent the missing upstream reach.

The St. Louis fields overlap. A bend in the Mississippi seen from Lambert must occupy the same real-world location when seen from St. Louis Regional, Spirit, Downtown, or Scott. Redrawing a river independently for each airport can look plausible in isolation while moving that bend several miles between scopes.

KSTL, KSUS, KALN, KBLV and KCPS therefore share one definition per river — the Mississippi, the Missouri and the Illinois River, each owned by exactly one module and generated from USGS NHD (§15A). Each centerline is converted through latitude/longitude into the airport's local nautical-mile plane, then the same smoothing and bank-width routine builds the displayed polygon. npm run validate:geography converts the finished polygons back to world coordinates and fails if any field disagrees, if two modules define one feature name, or if a field draws a locally adjusted copy of a shared feature.

Game claimReal environmentVerdict
A shared river occupies one world location on every overlapping scope.Airport scopes show the same physical terrain from different local origins.STRUCTURAL / FAITHFUL. Projection and cross-field agreement are enforced, not redrawn by eye. Future St. Louis fields must consume the regional layer.
The centerline is survey hydrography, decimated. The displayed channel width is not.USGS NHD high-resolution flowlines are a hydrographic product; a radar video map generalizes for legibility.MIXED, and the split is the point. The route is PUBLISHED FACT (USGS NHD, §15A) with a disclosed Douglas-Peucker simplification stated in each generated module. The width is OUR DISCRETION, exaggerated several times over for the scope. The centerline was hand-authored sectional/map context until 2026-07-29.

------
A shared river occupies one world location on every overlapping scope.Airport scopes show the same physical terrain from different local origins.STRUCTURAL / FAITHFUL. Projection and cross-field agreement are enforced, not redrawn by eye. Future St. Louis fields must consume the regional layer.
The centerline is survey hydrography, decimated. The displayed channel width is not.USGS NHD high-resolution flowlines are a hydrographic product; a radar video map generalizes for legibility.MIXED, and the split is the point. The route is PUBLISHED FACT (USGS NHD, §15A) with a disclosed Douglas-Peucker simplification stated in each generated module. The width is OUR DISCRETION, exaggerated several times over for the scope. The centerline was hand-authored sectional/map context until 2026-07-29.

22. Regional geography is one world, not one sketch per scope

The St. Louis fields overlap. A bend in the Mississippi seen from Lambert must occupy the same real-world location when seen from St. Louis Downtown, Spirit, Alton, or Scott. Redrawing a river independently for each airport can look plausible in isolation while moving that bend several miles between scopes.

KSTL and KCPS therefore use one canonical St. Louis regional Mississippi centerline. It is converted through latitude/longitude into each airport's local nautical-mile plane, then the same smoothing and bank-width routine builds the displayed polygon. validate:registry converts the finished polygons back to world coordinates and fails if the two fields disagree.

Game claimReal environmentVerdict
A shared river occupies one world location on every overlapping scope.Airport scopes show the same physical terrain from different local origins.STRUCTURAL / FAITHFUL. Projection and cross-field agreement are enforced, not redrawn by eye. Future St. Louis fields must consume the regional layer.
The centerline is survey hydrography, decimated. The displayed channel width is not.USGS NHD high-resolution flowlines are a hydrographic product; a radar video map generalizes for legibility.MIXED, and the split is the point. The route is PUBLISHED FACT (USGS NHD, §15A) with a disclosed Douglas-Peucker simplification stated in each generated module. The width is OUR DISCRETION, exaggerated several times over for the scope. The centerline was hand-authored sectional/map context until 2026-07-29.

Summary of open refinement items

Roadmap eraItems
v0.2 (wind/weather)Weather-driven ATIS rollover + code-on-checkin (§12); the 91.117(b) Class C/D surface-area 200-kt clamp, once the VFR visual-setup limit cycle it exposes is fixed (§7); vectoring a VFR onto a Bravo transition before it crosses the boundary (§16).
v0.3 (procedural depth)MVA/MSAW terrain layer (§8, §19) — listed first because KLAS ships without it and §19 is the disclosure that buys that.
v0.3 (procedural depth)CWT/B757 wake taxonomy (§2); correcting the modeled 3-min behind-Super departure interval to the real 4 min and adding the 3-min intersection case (§3); real racetrack holds (§10); anticipated-separation same-runway gate + Cat I/II/III (§5); LUAW 3-9-4 constraints (§6); MVA/MSAW terrain layer (§8); 5-5-7 15°-divergence test (§1); charted missed approaches (§9).
v0.3 (procedural depth)The controller's own compression curve beyond the conflict case (§6.3a's full three-state table: lengthen while the crew answers, shorten while it is saturated, re-lengthen into a dead channel), and compression of non-command pilot transmissions (§18).
v0.3 (procedural depth)Give GA/bizjet departures access to the published SIDs at the reliever fields that have them (§17.1 bound); source real per-runway departure headings instead of the modelled vector (§17.2); shelve/sectorise the TRACON bubble instead of a cylinder (§17.4).
ShippedClass B clearance-to-enter for VFR — the pilot requests it, CB clears / RB refuses, an uncleared pilot holds outside, an unauthorized entry draws an advisory (§16); the 91.117(c) 200-kt limit beneath a Class B shelf, flown by the pilot and non-waivable by the controller (§7); the departure model rework — per-field SID mix, radar-vector departures, departures never routed through arrival fixes, and the TRACON-bubble handoff (§17); the airspace COUPLING — VFR control authority resolved by a point-in-volume test against the published boundary instead of the per-field class letter, plus the neighbour surface areas split into their own selectable layer (§16); the AIRSPACE map layer — published FAA Class B/C/D boundaries drawn on the scope as a selectable video-map-style layer, every modelled field (§16); Same-runway wake departure intervals (§3, 2026-07-06); the Super wake class (A380: "Super" suffix, 6–8 nm in-trail, a same-runway departure interval) (§2/§3/§13); crossing-runway pavement protection for the occupied-runway go-around (§5); facility auto-acknowledgments (radar contact + altimeter, standby, roger) (§13); published RNAV STARs + descend-via (§14, the Procedures Era batch 2); published SIDs + climb-via (§14 departure side, the Procedures Era batch 3, 2026-07-12); the two-clearance model, approach + landing clearances and "report field in sight" visuals (§9 / §14, the Procedures Era batch 4, 2026-07-12); the parallel-final exemption for aircraft established on different parallel localizers (§4A, 2026-07-13); the comms compression ladder — advisory payload sheds first, the evidenced-retained elements never shed, and a tower sounds terser than a TRACON at equal traffic (§18); conflict expansion — under a live conflict the ladder runs negative and the frequency gets longer, with the full callsign, the clearance restated and the explicit negative statement on a verified-clear runway (§18); the emergency arc's two silences — a 20–35 s onset gap before the mayday and a terminal silence inside the last 60–90 s to the ground, both COMMS states that never stop the aeroplane flying or complying (§18).
Academy (strict mode)2.5-nm reduced final (§1); "tree/fife" strict digits (§13); hold-short hearback verification (§13).

This ledger is maintained alongside the code. When a refinement item ships, its row moves to FAITHFUL. Corrections from the controller community are welcome.

Sources

TAKE THE POSITION Free. Runs in your browser. No account.