Jets that fly like jets
The report: “I have to constantly pull up on the stick to maintain altitude, and it climbs very slowly — is that intentional?” It was not intentional. It was three separate bugs wearing one trench coat, and the probe that unpicked them watched a hands-off Starfang sink from 450 m into the Brick Gulf in nine seconds flat — with the auto-trim on.
The feeling, as numbers
House rule: convert the feeling into numbers before touching a
constant. A new probe (JET_FEEL=1) steps the real
flight model and asks every airframe four questions: how much stick
holds level flight at cruise, what happens hands-off, what's the
best sustained climb, and what's the top speed. The WW2 fighters
answered like trimmed airplanes: a Sparrowhawk holds level with
0.8% stick, a Thunderhead with 0.1%. The jets answered
like anvils. The Starfang wanted 10.7% back-stick every
second of the sortie, sank at 34 m/s the moment you
relaxed, and out-climbed the WW2 Thunderhead by negative six
meters per second — 23 vs 29. The era pitch promises
“silver darts at twice the speed”; the dart was 18%
faster than a prop.
Culprit one: a propeller bolted to a turbojet
The flight model's thrust curve has a falloff term written for propellers — thrust dies as airspeed rises, the way a prop's bite does. The jets shipped with falloff constants in the same band as the props (280–300), so every turbojet in the era lost thrust exactly like a piston engine. A real turbojet doesn't care how fast you're going. Raising the falloff to jet-like values (800–1000) is the whole engine fix: the Starfang went from 239 m/s and a 23 m/s climb to 316 m/s and 42 m/s; the Balalaika now accelerates like its namesake's reputation (334 m/s, 54 m/s climb). Twice a Sparrowhawk. As promised.
Culprit two: airframes that never trimmed
Each airframe carries a cm0 — the pitching moment
at zero angle of attack, the constant that decides where the nose
rests when you let go. The props trim near their cruise speeds. The
jets shipped with cm0 near zero, which trims a
heavy, small-winged airframe at a speed it never flies. Sizing it so
each jet trims itself in its fighting band cut the required
back-pressure from 6–11% of the stick to under 3% —
prop territory.
Culprit three: the instructor was flying it into the sea
The numbers above fixed the airframe, and the playtest still hit the water. The control-loop microscope — a headless client logging the steering assist every second — found the real killer: the mouse-aim instructor casts its aim ray from the chase camera's eye, 8.5 m above the plane, which bakes a standing few-degree depression into “reticle at rest.” The assist held a constant −0.3 elevator against the auto-trim, and the trim's authority fades exactly as the composed command grows — so the harder it fought, the less it was allowed to fight. A prop shrugs this standoff off. A jet loses it, settles into a stable 12° dive, and arrives at the sea on a schedule.
The fix is a contract players already know from every arcade flight game: a settled hand means level flight. For jet airframes, when the reticle is at rest and no pitch key is held, the assist's pitch blends into the trim's own proven level-hold loop, aiming the nose the necessary hair above the horizon so the flight path rides level. Work the mouse, bank into a turn, touch S or W — and the hold fades to nothing; aiming is bit-for-bit the prop instructor. After the change the microscope read: altitude pinned at 564–566 m for twenty straight seconds, elevator commands under 3%, no porpoising. Jets also now spawn at 140–165 m/s — handing a player a jet at a prop's 85 m/s launch speed put it on the back side of the power curve before the first input.
The confession
The first version of this fix gave the bots the fast spawns too, and the era probe promptly filed a mass-casualty report: stall and terrain deaths tripled, 245 bot hulls flown into the ground in twenty simulated minutes. Two hypotheses died honorably on the way to the truth — speed-scaled terrain margins (made it worse) and a bot throttle governor (changed nothing) — before a clean bisect found it: the bots' entire energy ledger, every zoom and turn entry and stall reflex, is tuned around the slow launch. Give them a fast one and they spend it on hillsides. So the humans got the jet catapult and the bots kept the launch their habits were written for, and the probe went back to reading healthier than baseline: stall deaths from 140 to 4.
And the propeller sounds from the same report? Already fixed in the previous shell (v151) — the report raced the deploy and the deploy lost. If your jets still drone, reload twice and the service worker will hand you the turbine.
Retesting on a phone surfaced two more. First, no audio on mobile at all — which turned out to be the iPhone ring/silent switch: iOS routes Web Audio as “ambient” sound and the switch mutes it completely. We tried overriding it (the “playback” session music apps claim) and decided against shipping that: a phone on silent should be silent. The switch is respected, the touch join screen now says so, and the context revives on any tap after iOS suspends it for a phone call. Second, with the switch flipped, the verdict on the new turbojet voice was “too loud” — fair, because the roar is broadband noise, and noise at the same gain reads several dB louder than the piston chain's two saws. The jet voice now sits about 4 dB under its first cut, targeting the piston drone's perceived level rather than its number, and jet flybys ride just under the prop figure for the same reason. The touch e2e suite now asserts the join tap leaves the audio context running, so the gesture-unlock path can never silently regress.
The follow-up reports
Two more from the phone, both real. “Pulling up kind of humps” — the instructor's G/AoA limiter was tuned at prop pitch rates, and at jet dynamic pressure the G arrives faster than the feedback registers it, so the limiter recoils after the overshoot: pull, cut, nose dip, pull again. The probe read the pitch rate swinging +0.37 to −0.12 inside one second of pull entry. (First attempt — widening the taper — made the whole pull limit-cycle instead; measured, discarded.) The fix is a damper, not a stiffer spring: the limiter now leads with the current pitch rate, easing the elevator during the rotation, jets only. After: rate stays positive through a five-second maximum pull, one soft check at entry, half the old amplitude, no repetition.
And “there's no missile fire button on mobile”
— there wasn't. The MSL and FLARE buttons shipped with the
era's touch support but never got layout rules, so both piled onto
position:absolute's default corner: FLARE half off the
top-left of the screen, MSL entirely gone. The screenshot made it
undeniable in one glance. They now sit in the weapon cluster where
thumbs live — MSL in seeker blue above FIRE, FLARE in flare
orange above BOMB.