A320 source bridge audit — normal ready state and real output paths

All findings reference the pinned A320-family source fec1ecba767c8fffd145337b27012e89c01e3ade.
Machine-readable values, source references, exact PI and airdata algorithms are in A320_NORMAL_READY.json.
This audit changes no original aircraft XML and no application code.

1. Euler rates are required, not body p/q/r.
   FG JSBSim adapter explicitly calls Auxiliary->GetEulerRates. Bind native
   velocities/phidot-rad_sec, thetadot-rad_sec, psidot-rad_sec (convert to deg/s)
   to FG /orientation/roll-rate-degps, pitch-rate-degps, yaw-rate-degps.
   a320-fbw.xml:418-431 intentionally uses attitude-stable rates.
   The earlier tentative common mirror candidates were corrected in both
   make_bridge_config.py and JSBSIM_BRIDGE_CONFIG.json.

2. Real A320 surface output and visual/FG aliases.
   Roll: /systems/fcs/aileron-l/final-deg and aileron-r/final-deg.
   Pitch: /systems/fcs/elevator-l/final-deg, elevator-r/final-deg,
          /systems/fcs/stabilizer/final-deg.
   Yaw: /systems/fcs/rudder/final-deg.
   Aerodynamics uses those actual degrees directly. Generic elevator/aileron
   pos-norm fields do not represent this aircraft's real surface states.
   Flaps: fcs/flap-pos-deg and fcs/flap-pos-norm (degree / 40).
   Slats: fcs/slat-pos-deg and fcs/slat-pos-norm (degree / 27).
   CFM max flap is 35 degrees but the source normalization denominator stays40.
   Takeoff lever0.2 means 1+F on the ground: flap10deg and slat18deg; its lever
   fraction is different from normalized surface travel.
   Gear: gear/unit[0..2]/pos-norm, also /systems/gear/unit[i]/pos-actuator.
   FG bridge mirrors these to /gear/gear[i]/position-norm. Correct lever input
   is /controls/gear/lever-cockpit (3 down, 0 up); native /controls/gear/lever
   is calculated. Native fcs/* lives under /fdm/jsbsim/fcs/* in FlightGear.
   A320-main.xml:571-579 multiplayer aliases: generic/float4..9 are L/R elevator,
   L/R aileron, rudder, stabilizer degrees; float11 slatnorm, float12 flapnorm.

3. Source core.systemsInit is not just the -set XML defaults.
   fbw.nas initializes all seven ELAC/SEC/FAC switches ON and sidesticks active.
   hydraulics.nas initializes reservoir input quantities8/16/15 and source
   pumps (blue electric, green/yellow EDP, PTU) ON. Native XML then derives
   pressure, electrical buses, ELAC/SEC/FAC healthy status and actuator gates.
   Do not hard-write those calculated outputs. End ready staging by clearing
   /systems/acconfig/autoconfig-running and /services/chocks/enable; otherwise
   native brakes can remain applied. Source takeoff trim is initially -0.1,
   then native FBW updates that same input every step. Rewriting -0.1 each tick
   defeats original auto-trim.

4. ADIRS ready and live operation.
   Source acconfig sets each ADR switch1, IR mode NAV1, then instAlign().
   instAlign sets aligned1, inAlign0, internal IR operating1 and alignment
   property1. The internal IR operating flag is not an existing JSB property.
   ADR operative depends on actual electrical buses: main ac-ess-shed/ac-2/ac-1;
   backups dc-hot-1/dc-hot-2/dc-hot-1, last two limited300s. Source treats any
   nonzero voltage as available. /systems/navigation/adr/operating-N is
   outputOn ? operative : 0. Normal settled alignment/operating outputs all1.
   ADIRS affects Nasal law degradation and native airdata/yaw RTLU. It is not
   the direct pitch/roll hardware gate, so missing alignment alone does not
   explain a nonresponsive healthy native roll chain.

5. ADIRS must receive actual probe pressures.
   Three ADR CAS/Mach channels read /systems/pitot[i]/measured-total-pressure-inhg
   and /systems/static[i]/pressure-inhg, not ordinary indicated-speed-kt.
   A320/Systems/pitot-static.xml and primary FG pitot.cxx/static.cxx were fetched.
   JSON contains their original formulas, including alpha/beta response,
   pitot stall, static side-slip error factors0.43/0.42/0.45, tau0.7, and exact
   fgGetLowPass. Use native ambient pressure, Mach, alpha, beta; preserve native
   ADR quantization/CAS logic. Check cas1/2/3 and fmgc active-airspeed1/2.
   Source standby ASI adds a50/s low-pass and derives indicated Mach from the
   same pressures. Full altitude instrument fidelity also requires original
   seven altimeter instances; the source configuration is already local.

6. Two external FG controller dependencies remain outside native FBW XML.
   a320-fbw-rules.xml: exact PI-simple controller. Reference minus input, clamp
   P first, accumulate I, clamp P+I, antiwindup I=out-P. Dynamic bounds are
   [min(e-i-sum,0),max(e-i-sum,0)], not generic [-1,1]. Ki only airborne law0/1.
   core-rules.xml:1761: IAS predictor. current=(IAS-last)/dt;
   average=(1-dt)*average+current*dt for dt<1, else current; output=IAS+average.
   It supplies normal-law overspeed protection. Primary implementation files
   FlightGear-pisimplecontroller.cxx and FlightGear-predictor.cxx are local.

7. Useful runtime diagnosis of poor route response.
   Inspect actual sidestick input, law, fmgc/enabled (manual control requires0),
   native roll/pitch gains, rate-demand, Euler feedback, PID, and final-deg.
   With healthy normal law and zero stick the native control is not an altitude
   autopilot; the zero-stick response must not be interpreted as a demand to
   descend toward route altitude. Log the original native chain before tuning
   an outer route guidance controller. Source engine thrust and raw FDM should
   remain untouched.

Source URLs:
https://github.com/legoboyvdlp/A320-family/tree/fec1ecba767c8fffd145337b27012e89c01e3ade
https://github.com/FlightGear/flightgear/blob/next/src/Autopilot/pisimplecontroller.cxx
https://github.com/FlightGear/flightgear/blob/next/src/Autopilot/predictor.cxx
https://github.com/FlightGear/flightgear/blob/next/src/Systems/pitot.cxx
https://github.com/FlightGear/flightgear/blob/next/src/Systems/static.cxx
https://github.com/FlightGear/flightgear/blob/next/src/Main/util.cxx
https://github.com/JSBSim-Team/jsbsim/blob/master/src/models/FGAuxiliary.cpp
