In-Flight Engine Relight Test (flight-test-operations/performance/in-flight-engine-relight-test)
A FAR 25.903(d)-style in-flight engine restart demonstration for a
fixed-wing aircraft is reduced from two measurement sets: a windmill
survey that maps the windmill N2 percent reached at each true airspeed,
and the starter-assisted relight attempts that time the restart from
start to idle at each altitude band of the demonstration. This leaf fits
the least-squares regression of windmill N2 against true airspeed from
the windmill survey points, reads the minimum relight airspeed where the
fitted line crosses the required relight N2 threshold, summarizes the
starter-assisted relight time-to-idle samples with the mean, the worst
sample and a PASS/FAIL verdict against the type-data limit, applies the
same check per altitude band, and combines the band verdicts with the
determined minimum relight airspeed into one overall
restart-demonstration verdict. Deterministic reduction only: the windmill
N2 regression is the classic linear survey fit, not a transient model of
the relight itself. It pairs with flight-test-operations/performance/
engine-flight-test for the altitude engine performance campaign around
the restart demonstration, and with flight-test-operations/performance/
engine-failure-takeoff-flight-test for the ground-run failure case that
is not followed by an in-flight restart.
Domain quick reference
- Windmill N2 regression (least squares, windmill N2 y in percent against
true airspeed x in m/s): slope = (n * sxy - sx * sy) / (n * sxx - sx *
sx), intercept = (sy - slope * sx) / n, R-squared = 1 - ss_res /
ss_tot, with ss_tot = syy - sy * sy / n and ss_res = syy - intercept *
sy - slope * sxy. The degenerate constant-line case (ss_tot = 0.0)
returns R-squared 1.0. Fewer than two survey points, mismatched list
lengths, or zero TAS variance (denominator zero) are errors.
- Minimum relight airspeed: TAS = (N2_required - intercept) / slope where
the fitted windmill N2 line crosses the required relight N2 threshold
WINDMILL_N2_MIN_REQUIRED_PCT = 18.0 percent. The threshold and the slope
must be positive (windmill N2 rises with airspeed) and the computed
airspeed must be positive (a threshold below the idle line means the
relight airspeed is never reached on the survey).
- Starter-assisted relight time to idle: mean = sum / n, worst sample =
max of the samples, and the verdict is PASS when the worst sample is at
or below the type-data limit RELIGHT_IDLE_LIMIT_S = 60.0 s (inclusive),
FAIL otherwise. The verdict tracks the worst sample, never the mean.
- Altitude band score: each altitude band name of the demonstration maps
to the time-to-idle result dict computed on that band's samples.
- Combined verdict: PASS iff every band verdict is PASS and the minimum
relight airspeed is positive (a determined threshold); any failing band
fails the whole restart demonstration. An empty band set or a
non-positive airspeed is an error, never a PASS.
- The regulation is named and paraphrased only (FAR 25.903(d)-style
restart demonstration); no standard text is reproduced. Units: N2 in
percent, true airspeed in m/s, time in seconds.
Workflow
- Collect the windmill survey points: the true airspeed samples with the
windmill N2 percent observed at each survey speed, one paired list per
flight (windmill_regression inputs, two or more points, airspeeds that
actually vary).
- Fit the windmill N2 regression: windmill_regression(n2_pct_list,
tas_list) returns the least-squares slope, intercept and r_squared of
the windmill N2 line against true airspeed; check that R-squared is
high enough to read a threshold crossing.
- Read the minimum relight airspeed: min_relight_airspeed(
WINDMILL_N2_MIN_REQUIRED_PCT, slope, intercept) returns the TAS in m/s
where the fitted windmill N2 line crosses the 18.0 percent required
relight threshold.
- Summarize the starter-assisted relight samples: time_to_idle(
relight_time_samples) returns the mean time to idle, the worst sample,
the type-data limit and the PASS/FAIL verdict for the attempted
relights.
- Score each altitude band of the demonstration: altitude_band_verdict(
relight_results_per_altitude) applies the step 4 time-to-idle check to
every altitude band flown, keeping the band name keys exactly.
- Combine the band verdicts with the minimum relight airspeed into the
overall restart-demonstration verdict: combined_verdict(band_verdicts,
min_relight_airspeed_mps) returns PASS only when every band PASSes and
a relight airspeed was determined, otherwise FAIL (or ValueError for an
empty band set or a non-positive airspeed).
- Confirm the reduction with the deterministic contract test
scripts/test_in_flight_engine_relight_test.py.
Worked example
Windmill survey: TAS [70, 85, 105, 130] m/s with windmill N2 [13.5, 15.75,
18.75, 22.5] percent, a perfectly linear spread. Real module outputs from
running the logic module:
- Windmill N2 regression: slope 0.1500 percent per m/s, intercept 3.0000
percent, r_squared 1.0000.
- Minimum relight airspeed: min_relight_airspeed(18.0, 0.15, 3.0) = 100.0
m/s (194.4 kt TAS), the airspeed where the fitted line reaches the 18.0
percent required windmill N2.
- Starter-assisted relight samples [34.2, 41.7, 38.9, 52.4] s: mean 41.80
s, worst sample 52.40 s, limit 60.00 s, verdict PASS (the worst
starter-assisted relight stays below the type-data limit).
- Altitude bands FL200 [37.4, 40.2, 41.9], FL300 [42.6, 44.8, 47.1],
FL410 [46.5, 49.3, 58.9] s: FL200 mean 39.83 s, worst 41.90 s, PASS;
FL300 mean 44.83 s, worst 47.10 s, PASS; FL410 mean 51.57 s, worst
58.90 s, PASS.
- Combined verdict on those bands with the minimum relight airspeed 100.0
m/s: PASS.
- Boundary anchors: time_to_idle([60.0]) PASS (inclusive at the limit),
time_to_idle([60.1]) FAIL; a FL410 band with a 62.5 s sample FAILs, and
the combined verdict on that failing band with airspeed 100.0 m/s is
FAIL.
Verification
- Confirm the worked example outputs above fall inside the spec magnitude
bounds: slope 0.1500, intercept 3.0000, r_squared 1.0000, minimum
relight airspeed 100.0 m/s, time-to-idle mean 41.80 s with worst sample
52.40 s, and PASS at every stage of the three-band demonstration.
- Regression identity: windmill N2 generated as 0.15 * TAS + 3.0 recovers
slope 0.15 and intercept 3.0 exactly (within 1e-12) at any survey point
count of two or more; constant windmill N2 data returns r_squared 1.0.
- Threshold shift identity: raising the required relight N2 threshold by a
delta moves the minimum relight airspeed by delta / slope (1.5 percent
moves it 10.0 m/s on the worked example line).
- Verdict boundary: the time-to-idle verdict flips exactly at the 60.0 s
type-data limit (60.0 PASS, 60.1 FAIL), and the verdict tracks the worst
sample, not the mean.
- Band identity: altitude_band_verdict results replicate time_to_idle
computed directly on the same samples; a single failing band fails the
combined verdict regardless of the other bands.
- ValueError rejection: mismatched list lengths, a single survey point,
zero TAS variance, a non-positive required N2 threshold, a non-positive
slope, a threshold below the idle line, empty relight time samples, a
negative relight time, an empty altitude band dict, an empty band
verdict set, and a non-positive minimum relight airspeed all raise
ValueError.
- Determinism: no randomness anywhere; repeated calls return identical
results. Confirm everything with the contract test below.
Related leaves
- flight-test-operations/performance/engine-flight-test: the altitude
engine performance campaign around the restart demonstration, covering
the installed engine output side of the flight test program.
- flight-test-operations/performance/engine-failure-takeoff-flight-test:
the takeoff ground-run failure case, which is not followed by an
in-flight restart demonstration.
- flight-test-operations/performance/cruise-performance-flight-test: the
cruise survey context around the windmill survey speeds.
- flight-test-operations/performance/level-acceleration-test: the
energy-state runs that bound the survey speed range.
- flight-test-operations/performance/climb-performance-flight-test: the
climb segment of the flight test program that precedes the restart
demonstration bands.
Contract test
Run offline from the leaf directory or the repo root:
python3 scripts/test_in_flight_engine_relight_test.py
The stdlib unittest contract (33 methods, deterministic, under 1 second)
covers the SKILL.md workflow steps 1 to 7: the module thresholds, the
worked-example windmill N2 regression values and exact dict keys, the
regression recovery identity at two and nine survey points, the constant
windmill N2 degenerate case, step 3 threshold crossings with the
delta-over-slope shift identity, the worked-example time-to-idle summary
with the inclusive 60.0 s boundary and the worst-sample verdict rule,
per-band scoring on the FL200/FL300/FL410 demonstration bands with exact
band keys and the replicate-time_to_idle identity, the combined
restart-demonstration verdict including the any-failing-band rule and the
PASS independence of airspeed magnitude, ValueError rejection of every
non-physical input class, and determinism across repeated calls.
Compliance
- compliance: STANDARDS-REF, gated: false.
- Standards referenced, not reproduced: the FAR 25.903(d)-style in-flight
restart demonstration (id far-25 in standards-map.yaml) is named and
paraphrased only; the regression and time-to-idle relations above are
standard flight-test reduction methodology, summary-only, never verbatim
regulation text.
Pitfalls
- Reading the relight airspeed off an inadequate survey: fewer than two
windmill survey points, mismatched N2 and airspeed lists, or a survey
flown at constant true airspeed make the regression undefined, and a
required threshold below the fitted idle line means the relight
airspeed is never reached on the survey. Extend the survey or report
that no threshold crossing was demonstrated instead of extrapolating
the fitted line outside the measured speed range.
- Comparing the mean time to idle against the limit: the starter-assisted
relight verdict is driven by the worst sample, inclusive at 60.0 s (60.0
PASS, 60.1 FAIL). A low mean with one sample over the type-data limit
still FAILs the band.
- Scoring one band and calling it the demonstration: every altitude band
flown must be scored, and a single failing band fails the combined
restart-demonstration verdict regardless of how cleanly the other bands
PASS. The combined verdict also needs a determined (positive) minimum
relight airspeed, so a demonstration that never reached a threshold
crossing cannot be passed.
- Treating the regression as a relight model: the windmill N2 line is a
steady survey fit used to find the threshold airspeed. It does not
model the restart transient, the starter engagement, or the windmilling
spool-up dynamics of the relight itself.
- Routing rotor windmill tasks here: in this leaf "windmill" means engine
windmill N2 only. Rotor windmill state and autorotation airspeed work
belong to the flight-mechanics rotorcraft leaves
(rotorcraft-autorotative-descent, rotorcraft-axial-descent-flow-states),
not to this engine restart reduction.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline, pure
Python, no network):
python3 scripts/test_in_flight_engine_relight_test.py
The test must exit 0 with 33 methods passing. It pins the worked-example
outputs (regression slope 0.1500, intercept 3.0000, r_squared 1.0000;
minimum relight airspeed 100.0 m/s at the 18.0 percent required windmill
N2; time-to-idle mean 41.80 s with worst sample 52.40 s and PASS; the
three FL200/FL300/FL410 bands all PASS; combined verdict PASS), the
regression and threshold-shift identities within 1e-12, the inclusive
60.0 s verdict boundary, the replicate band identity, ValueError rejection
of every non-physical input class, and deterministic, fixed-string
verdicts with no randomness.
1---2name: in-flight-engine-relight-test3description: Use when you must reduce an in-flight engine restart demonstration: fit the least-squares windmill N2 regression against true airspeed from the windmill survey, read the minimum relight airspeed where the fitted N2 line crosses the required relight threshold, summarize the starter-assisted relight time-to-idle samples against the type-data limit per altitude band, and combine the band verdicts with the airspeed into the overall restart-demonstration verdict. Produces the regression slope, intercept and R-squared, the minimum relight airspeed in m/s, per-band time-to-idle statistics and verdicts, and the combined PASS or FAIL verdict. Trigger: in-flight relight test, engine restart demonstration, windmill N2 survey, relight airspeed, time-to-idle limit.4license: Apache-2.05---67# In-Flight Engine Relight Test (flight-test-operations/performance/in-flight-engine-relight-test)89A FAR 25.903(d)-style in-flight engine restart demonstration for a10fixed-wing aircraft is reduced from two measurement sets: a windmill11survey that maps the windmill N2 percent reached at each true airspeed,12and the starter-assisted relight attempts that time the restart from13start to idle at each altitude band of the demonstration. This leaf fits14the least-squares regression of windmill N2 against true airspeed from15the windmill survey points, reads the minimum relight airspeed where the16fitted line crosses the required relight N2 threshold, summarizes the17starter-assisted relight time-to-idle samples with the mean, the worst18sample and a PASS/FAIL verdict against the type-data limit, applies the19same check per altitude band, and combines the band verdicts with the20determined minimum relight airspeed into one overall21restart-demonstration verdict. Deterministic reduction only: the windmill22N2 regression is the classic linear survey fit, not a transient model of23the relight itself. It pairs with flight-test-operations/performance/24engine-flight-test for the altitude engine performance campaign around25the restart demonstration, and with flight-test-operations/performance/26engine-failure-takeoff-flight-test for the ground-run failure case that27is not followed by an in-flight restart.2829## Domain quick reference3031- Windmill N2 regression (least squares, windmill N2 y in percent against32 true airspeed x in m/s): slope = (n * sxy - sx * sy) / (n * sxx - sx *33 sx), intercept = (sy - slope * sx) / n, R-squared = 1 - ss_res /34 ss_tot, with ss_tot = syy - sy * sy / n and ss_res = syy - intercept *35 sy - slope * sxy. The degenerate constant-line case (ss_tot = 0.0)36 returns R-squared 1.0. Fewer than two survey points, mismatched list37 lengths, or zero TAS variance (denominator zero) are errors.38- Minimum relight airspeed: TAS = (N2_required - intercept) / slope where39 the fitted windmill N2 line crosses the required relight N2 threshold40 WINDMILL_N2_MIN_REQUIRED_PCT = 18.0 percent. The threshold and the slope41 must be positive (windmill N2 rises with airspeed) and the computed42 airspeed must be positive (a threshold below the idle line means the43 relight airspeed is never reached on the survey).44- Starter-assisted relight time to idle: mean = sum / n, worst sample =45 max of the samples, and the verdict is PASS when the worst sample is at46 or below the type-data limit RELIGHT_IDLE_LIMIT_S = 60.0 s (inclusive),47 FAIL otherwise. The verdict tracks the worst sample, never the mean.48- Altitude band score: each altitude band name of the demonstration maps49 to the time-to-idle result dict computed on that band's samples.50- Combined verdict: PASS iff every band verdict is PASS and the minimum51 relight airspeed is positive (a determined threshold); any failing band52 fails the whole restart demonstration. An empty band set or a53 non-positive airspeed is an error, never a PASS.54- The regulation is named and paraphrased only (FAR 25.903(d)-style55 restart demonstration); no standard text is reproduced. Units: N2 in56 percent, true airspeed in m/s, time in seconds.5758## Workflow59601. Collect the windmill survey points: the true airspeed samples with the61 windmill N2 percent observed at each survey speed, one paired list per62 flight (windmill_regression inputs, two or more points, airspeeds that63 actually vary).642. Fit the windmill N2 regression: windmill_regression(n2_pct_list,65 tas_list) returns the least-squares slope, intercept and r_squared of66 the windmill N2 line against true airspeed; check that R-squared is67 high enough to read a threshold crossing.683. Read the minimum relight airspeed: min_relight_airspeed(69 WINDMILL_N2_MIN_REQUIRED_PCT, slope, intercept) returns the TAS in m/s70 where the fitted windmill N2 line crosses the 18.0 percent required71 relight threshold.724. Summarize the starter-assisted relight samples: time_to_idle(73 relight_time_samples) returns the mean time to idle, the worst sample,74 the type-data limit and the PASS/FAIL verdict for the attempted75 relights.765. Score each altitude band of the demonstration: altitude_band_verdict(77 relight_results_per_altitude) applies the step 4 time-to-idle check to78 every altitude band flown, keeping the band name keys exactly.796. Combine the band verdicts with the minimum relight airspeed into the80 overall restart-demonstration verdict: combined_verdict(band_verdicts,81 min_relight_airspeed_mps) returns PASS only when every band PASSes and82 a relight airspeed was determined, otherwise FAIL (or ValueError for an83 empty band set or a non-positive airspeed).847. Confirm the reduction with the deterministic contract test85 scripts/test_in_flight_engine_relight_test.py.8687## Worked example8889Windmill survey: TAS [70, 85, 105, 130] m/s with windmill N2 [13.5, 15.75,9018.75, 22.5] percent, a perfectly linear spread. Real module outputs from91running the logic module:9293- Windmill N2 regression: slope 0.1500 percent per m/s, intercept 3.000094 percent, r_squared 1.0000.95- Minimum relight airspeed: min_relight_airspeed(18.0, 0.15, 3.0) = 100.096 m/s (194.4 kt TAS), the airspeed where the fitted line reaches the 18.097 percent required windmill N2.98- Starter-assisted relight samples [34.2, 41.7, 38.9, 52.4] s: mean 41.8099 s, worst sample 52.40 s, limit 60.00 s, verdict PASS (the worst100 starter-assisted relight stays below the type-data limit).101- Altitude bands FL200 [37.4, 40.2, 41.9], FL300 [42.6, 44.8, 47.1],102 FL410 [46.5, 49.3, 58.9] s: FL200 mean 39.83 s, worst 41.90 s, PASS;103 FL300 mean 44.83 s, worst 47.10 s, PASS; FL410 mean 51.57 s, worst104 58.90 s, PASS.105- Combined verdict on those bands with the minimum relight airspeed 100.0106 m/s: PASS.107- Boundary anchors: time_to_idle([60.0]) PASS (inclusive at the limit),108 time_to_idle([60.1]) FAIL; a FL410 band with a 62.5 s sample FAILs, and109 the combined verdict on that failing band with airspeed 100.0 m/s is110 FAIL.111112## Verification113114- Confirm the worked example outputs above fall inside the spec magnitude115 bounds: slope 0.1500, intercept 3.0000, r_squared 1.0000, minimum116 relight airspeed 100.0 m/s, time-to-idle mean 41.80 s with worst sample117 52.40 s, and PASS at every stage of the three-band demonstration.118- Regression identity: windmill N2 generated as 0.15 * TAS + 3.0 recovers119 slope 0.15 and intercept 3.0 exactly (within 1e-12) at any survey point120 count of two or more; constant windmill N2 data returns r_squared 1.0.121- Threshold shift identity: raising the required relight N2 threshold by a122 delta moves the minimum relight airspeed by delta / slope (1.5 percent123 moves it 10.0 m/s on the worked example line).124- Verdict boundary: the time-to-idle verdict flips exactly at the 60.0 s125 type-data limit (60.0 PASS, 60.1 FAIL), and the verdict tracks the worst126 sample, not the mean.127- Band identity: altitude_band_verdict results replicate time_to_idle128 computed directly on the same samples; a single failing band fails the129 combined verdict regardless of the other bands.130- ValueError rejection: mismatched list lengths, a single survey point,131 zero TAS variance, a non-positive required N2 threshold, a non-positive132 slope, a threshold below the idle line, empty relight time samples, a133 negative relight time, an empty altitude band dict, an empty band134 verdict set, and a non-positive minimum relight airspeed all raise135 ValueError.136- Determinism: no randomness anywhere; repeated calls return identical137 results. Confirm everything with the contract test below.138139## Related leaves140141- flight-test-operations/performance/engine-flight-test: the altitude142 engine performance campaign around the restart demonstration, covering143 the installed engine output side of the flight test program.144- flight-test-operations/performance/engine-failure-takeoff-flight-test:145 the takeoff ground-run failure case, which is not followed by an146 in-flight restart demonstration.147- flight-test-operations/performance/cruise-performance-flight-test: the148 cruise survey context around the windmill survey speeds.149- flight-test-operations/performance/level-acceleration-test: the150 energy-state runs that bound the survey speed range.151- flight-test-operations/performance/climb-performance-flight-test: the152 climb segment of the flight test program that precedes the restart153 demonstration bands.154155## Contract test156157Run offline from the leaf directory or the repo root:158159 python3 scripts/test_in_flight_engine_relight_test.py160161The stdlib unittest contract (33 methods, deterministic, under 1 second)162covers the SKILL.md workflow steps 1 to 7: the module thresholds, the163worked-example windmill N2 regression values and exact dict keys, the164regression recovery identity at two and nine survey points, the constant165windmill N2 degenerate case, step 3 threshold crossings with the166delta-over-slope shift identity, the worked-example time-to-idle summary167with the inclusive 60.0 s boundary and the worst-sample verdict rule,168per-band scoring on the FL200/FL300/FL410 demonstration bands with exact169band keys and the replicate-time_to_idle identity, the combined170restart-demonstration verdict including the any-failing-band rule and the171PASS independence of airspeed magnitude, ValueError rejection of every172non-physical input class, and determinism across repeated calls.173174## Compliance175176- compliance: STANDARDS-REF, gated: false.177- Standards referenced, not reproduced: the FAR 25.903(d)-style in-flight178 restart demonstration (id far-25 in standards-map.yaml) is named and179 paraphrased only; the regression and time-to-idle relations above are180 standard flight-test reduction methodology, summary-only, never verbatim181 regulation text.182183## Pitfalls184185- Reading the relight airspeed off an inadequate survey: fewer than two186 windmill survey points, mismatched N2 and airspeed lists, or a survey187 flown at constant true airspeed make the regression undefined, and a188 required threshold below the fitted idle line means the relight189 airspeed is never reached on the survey. Extend the survey or report190 that no threshold crossing was demonstrated instead of extrapolating191 the fitted line outside the measured speed range.192- Comparing the mean time to idle against the limit: the starter-assisted193 relight verdict is driven by the worst sample, inclusive at 60.0 s (60.0194 PASS, 60.1 FAIL). A low mean with one sample over the type-data limit195 still FAILs the band.196- Scoring one band and calling it the demonstration: every altitude band197 flown must be scored, and a single failing band fails the combined198 restart-demonstration verdict regardless of how cleanly the other bands199 PASS. The combined verdict also needs a determined (positive) minimum200 relight airspeed, so a demonstration that never reached a threshold201 crossing cannot be passed.202- Treating the regression as a relight model: the windmill N2 line is a203 steady survey fit used to find the threshold airspeed. It does not204 model the restart transient, the starter engagement, or the windmilling205 spool-up dynamics of the relight itself.206- Routing rotor windmill tasks here: in this leaf "windmill" means engine207 windmill N2 only. Rotor windmill state and autorotation airspeed work208 belong to the flight-mechanics rotorcraft leaves209 (rotorcraft-autorotative-descent, rotorcraft-axial-descent-flow-states),210 not to this engine restart reduction.211212## Behavior contract (gate 3)213214Run the deterministic contract test (stdlib unittest, offline, pure215Python, no network):216217 python3 scripts/test_in_flight_engine_relight_test.py218219The test must exit 0 with 33 methods passing. It pins the worked-example220outputs (regression slope 0.1500, intercept 3.0000, r_squared 1.0000;221minimum relight airspeed 100.0 m/s at the 18.0 percent required windmill222N2; time-to-idle mean 41.80 s with worst sample 52.40 s and PASS; the223three FL200/FL300/FL410 bands all PASS; combined verdict PASS), the224regression and threshold-shift identities within 1e-12, the inclusive22560.0 s verdict boundary, the replicate band identity, ValueError rejection226of every non-physical input class, and deterministic, fixed-string227verdicts with no randomness.