Register /sweatbox/* on service HTTP only when SweatboxHost is allocated
(SWEATBOX_ENABLED). Same fsd_service JWT + Administrator middleware as
existing routes. 2 MiB body limit on airport/scenario/command payloads.
Wire the pure sweatbox engine to FSD sessions with dual bookkeeping:
claim before Register, post-Register commit check, abortFailedAdd vs
cleanupSyntheticSession, AfterFunc pointer-scoped only (stopAF before
Cancel on intentional Remove), engine.Delete only if owned.
Also: FPL encode goldens, PackPBH round-trip, kick/$!! Remove for
Synthetic, SWEATBOX_ENABLED default false (TestServer true), tick apply
with map + same-pointer Find, State merges session FlightPlan.
- Taxi follows polyline until hold waypoint (no corner-cut to future holds)
- Align dep runway heading on CTO from hold-short / in-position (tick + command)
- Regression tests for Issues 1–2
Implement pure motion.go and expand Engine.Tick(dt):
- paused / dt<=0: freeze motion and elapsed
- taxi along TaxiWaypoints at ground speed; stop at holds; honor hold/res/cross
- takeoff when ClearedTakeoff: accelerate, climb to initial climb, then Departing
- air vectors: turn (TurnDir), climb/descend, speed change; position integration
- TickResult returns value-copy snapshots only (no shared pointers)
Wire P0c air-vector and flight-plan instructor commands through Engine.Command.
Set DesiredHeading/Alt/Speed (and TurnDir/ImmediateHeading for fhn) plus plan
fields for PR4 Tick and host FPL encode; no kinematics or wire encoding.
Wire P0b ground commands through Engine.Command using PlanTaxi for routes.
Set SimAircraft taxi path, hold-short, and takeoff-clearance state for PR4 Tick.
Reject NaN/Inf geometry on add; clear Ident on ss; combined runway
name defaults to RwyA; simplify rules switch; test SetMaxAircraft
below current count.
Add Session.Synthetic so in-process sweatbox participants can register
in the postoffice without receiving human fan-out traffic. All six
broadcast helpers skip synthetic recipients.
Introduce pure internal/sweatbox package with TWRTrainer-compatible
airport and scenario parsers, fixtures, unit tests, and import-graph
ownership rules. No server wiring.
Drop runtime PostgreSQL support (repos, dual migration trees, driver
selection). Reject non-sqlite DATABASE_DRIVER at startup with a pointer
to the cutover path. Add openfsd-migrate-to-sqlite (unit + embedded-
Postgres e2e), wiki docs for operators, and the sweatbox integrated
simulator design doc.
Cover QuantizeDeg non-positive quantum path so internal/geo hits 100%
(floor was failing at 96.9%). Grant actions:write for GHA cache, allow
optional GHCR_TOKEN, and document package Actions access for write_package.
Run both services by default, or select with -fsd / -web. Shared DB
layer is unchanged; colocated web defaults FSD service HTTP to localhost.
Remove the separate cmd/openfsd-web entrypoint.
Gate Search on treeReady so rebuild cannot race with concurrent
Register; serialize tree mutations under treeLock. Check session
cancel in SendPosition so fan-out skips dead peers. Add concurrency
and UX contract tests plus overridable linear threshold for large-N
coverage.
Speed up dense position fan-out with atomic live snapshots for N≤2048,
equirectangular DistanceSq filtering, and SendPosition latest-wins
drops so slow peers cannot stall broadcasters. Ignore SQLite WAL/SHM
sidecars so local operator DBs are not staged by accident.
Advertise only implemented server flags (no SECPOS), document the full
capability inventory from vatSys research, and cover the path with unit
and e2e tests.