Address classroom tester feedback (Detlef / FSC e.V.)

Fixes the most impactful issues from ~1.5h of testing:

- TTS: spell SID prefixes phonetically (ANEKI → Alfa November Echo Kilo
  India) so unfamiliar waypoint names are intelligible without prior
  briefing context.
- TTS: expand standalone uppercase waypoints after via/direct (with a
  skip list for common ATC English tokens like MAYDAY, CLEARED, …).
- TTS: join taxi route tokens with ", " so pauses land between
  taxiways (C5, Z5, U10, …) instead of running together.
- TTS: handle "ILS Z 25C" variant before the runway → "ILS Zulu runway
  two five center" (was previously read as "Zee twentyfive cee").
- Scenarios: derive arrivalRunway from the chosen approach so the
  controller no longer clears a flight for ILS 25C onto runway 18.
- Radio check: accept any readability 1–5 (numeric or spoken), shorten
  placeholder so it fits the sm-width field.
- Line-up readback: clearer hint about the runway-first ICAO order.
- Classroom UI: disable browser autocomplete/autocorrect on readback
  inputs (Edge autofill was injecting unrelated values).
- Classroom UI: "Speak answer" button replays the expected readback as
  TTS so students can hear the correct phrasing.

Tests adjusted for the new SID and taxi-route phonetics.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
itsrubberduck
2026-05-26 10:24:48 +02:00
parent 1f6c068f92
commit 9082a25cb8
6 changed files with 87 additions and 23 deletions

View File

@@ -332,12 +332,12 @@ export function createBaseScenario(): Scenario {
const taxiRoute = choice(airport.taxi)
const sid = choice(airport.sids)
const transition = choice(airport.transitions)
const arrivalRunway = choice(destination.runways)
const approach = choice(destination.approaches)
const arrivalRunway = approach.match(/(\d{2}[LCR]?)$/)?.[1] ?? choice(destination.runways)
const arrivalStand = choice(destination.stands)
const arrivalTaxiRoute = choice(destination.taxiIn ?? destination.taxi)
const arrivalStar = choice(destination.stars ?? destination.sids)
const arrivalTransition = choice(destination.arrivalTransitions ?? destination.transitions)
const approach = choice(destination.approaches)
const altitude = choice([4000, 5000, 6000, 7000])
const climbAltitude = altitude + 2000
const squawk = generateSquawk()