In-Service Safety Assessment (systems-engineering-safety/continued-airworthiness/in-service-safety-assessment)
Use when field experience on a civil aircraft fleet must be reviewed
against the type-design safety assessment: collect service difficulty
reports, airline reliability reports and incident reports, group them by
the failure condition they demonstrate, and decide whether the observed
event rate over the fleet exposure is consistent with the SSA predicted
rate for each condition. This leaf opens the continued-airworthiness
pack and implements the ARP5150A and ARP5151 style in-service review in
pure Python, stdlib only. ARP5150A and ARP5151 continue the ARP4761A
assessment process into the in-service phase, so the predicted rates
consumed here come from the development safety assessment. It pairs with
systems-engineering-safety/arp4761a/safety-assessment (the producer of
those predicted rates), with arp4761a/failure-rate-estimation (the
statistics sibling; chi-square confidence bounds and zero-failure
demonstrations are NOT re-derived here), and with
certification/mmel-development (dispatch relief uses the same severity
inputs).
Domain quick reference
- Field event sources: service difficulty reports, airline reliability
reports and incident reports, each mapped to the failure condition it
demonstrates with a severity (none, minor, major, hazardous,
catastrophic) and a description.
- Exposure: total fleet flight hours (fh) or flight cycles (fc) over
which events were collected; per aircraft average is total divided by
fleet size.
- Expected events under the prediction: m = predicted_rate * exposure.
- Observed rate: observed / exposure.
- Single-event rule: one hazardous or catastrophic event is
significant regardless of the rate (SINGLE_EVENT_SEVERITIES).
- Poisson exceedance tail: P(X >= observed | mean m) computed as the
series sum from k = observed, stopping when the added term falls
below 1e-12 or k exceeds m * 20 + 50 (CEILING_MULT), via exp and a
log-factorial start term for stability.
- Significance: tail <= SIGNIFICANCE_ALPHA (0.05), or observed rate at
least RATE_EXCEEDANCE_MIN (2.0x) the predicted rate, or the
single-event rule.
- Exposure adequacy: an exposure window is adequate to judge a
predicted rate when predicted_rate * exposure >= 5.0 expected events
(EXPOSURE_ADEQUACY_EXPECTED_EVENTS), a typical screening rule.
- Corrective routes: airworthiness-directive-request (catastrophic
single event or catastrophic rate exceedance, immediate), service-
bulletin (hazardous significant, or major significant with an
increasing trend, short-term or scheduled), continued-monitoring
(minor significant, or any not-significant verdict with inadequate
exposure or an increasing trend, routine or scheduled), no-action
(not significant, adequate exposure, non-increasing trend, routine).
- The Poisson tail math is implemented directly in this leaf; the
chi-square failure-rate statistics belong to the
failure-rate-estimation sibling.
Workflow
- Fix the fleet exposure: fleet_size (aircraft), exposure_hours (total
fleet exposure) and exposure_unit ("fh" flight hours or "fc" flight
cycles); get the per-aircraft average with exposure_summary.
- Collect the field events as dicts with event_id, condition_id,
severity and description; group_events returns the count per
condition and severity_max_per_condition preserves the highest
observed severity per condition.
- Load the SSA predictions: {condition_id: {predicted_rate, severity,
note}}; every event condition must appear in predictions.
- For each condition compute the expected events with
expected_events(predicted_rate, exposure_hours) and screen the
exposure with adequacy_verdict (adequate when expected events reach
the 5.0 threshold).
- Form the observed rate with observed_rate(events_count,
exposure_hours).
- Decide significance with significance_verdict(condition_id,
observed, expected, severity): the single-event rule for hazardous
or catastrophic observations, the one-sided Poisson exceedance tail
against SIGNIFICANCE_ALPHA, and the RATE_EXCEEDANCE_MIN factor.
- Route the outcome with corrective_route(verdict, exposure_adequate,
trend_direction) where trend_direction is -1, 0 or 1; read the route
and the urgency band.
- Run assessment_summary(fleet_size, exposure_hours, exposure_unit,
events, predictions, trend_direction) to obtain the full report body
with every per-condition row and the safety-significant condition
list.
- Confirm the deterministic checks with the contract test
scripts/test_in_service_safety_assessment.py.
Worked example
Fleet of 200 aircraft with 1,000,000 fleet flight hours (fh).
Predictions from the SSA: "FCS-1" predicted_rate 3e-7 per fh, severity
hazardous (expected events 0.3); "PP-1" predicted_rate 2e-6 per fh,
severity major (expected events 2.0). Field events: 2 hazardous
"FCS-1" and 3 major "PP-1".
- FCS-1: observed rate 2e-6 per fh (observed_rate(2, 1e6)), expected
events 0.3. Exposure is inadequate to judge the rate (0.3 is below
the 5.0 adequacy threshold). Poisson tail P(X >= 2 | mean 0.3) =
0.0369, at or below alpha 0.05, and the hazardous single-event rule
applies. Verdict: significant; route service-bulletin, urgency
short-term.
- PP-1: observed rate 3e-6 per fh, expected events 2.0. Poisson tail
P(X >= 3 | mean 2.0) = 0.3233, above alpha 0.05; the rate ratio 1.5
is below the 2.0 exceedance factor. Verdict: not significant. With
expected events 2.0 the exposure is below the 5.0 adequacy threshold,
so the route is continued-monitoring (routine) rather than a close
out; the spec anchor permits no-action or continued-monitoring.
- Single catastrophic event: one event on a condition predicted at
1e-8 per fh triggers the single-event rule even at a low rate; route
airworthiness-directive-request, urgency immediate.
Verification
- Confirm observed_rate(2, 1e6) returns 2e-6 and expected_events(3e-7,
1e6) returns 0.3; the rate times the exposure recovers the event
count (round-trip identity).
- Confirm poisson_exceedance_p(2, 0.3) is 0.0369 and
poisson_exceedance_p(3, 2.0) is 0.3233, both within 1e-3 of the spec
anchors; the tail is 1.0 for zero observed events and 0.0 for a
positive count against a zero mean.
- Confirm adequacy_verdict(5.0) is adequate and adequacy_verdict(0.3)
is inadequate against the 5.0 threshold.
- Confirm a single catastrophic event routes
airworthiness-directive-request with urgency immediate, and that a
hazardous significant verdict routes service-bulletin short-term.
- Confirm every non-physical input raises ValueError: negative
exposure, non-positive fleet size, negative observed count or
expected count, zero exposure when forming a rate, negative
predicted rate, unknown severity strings, empty predictions, an
event condition missing from predictions, an invalid exposure_unit,
and a trend_direction outside -1/0/1.
- Run the contract test offline: python3
scripts/test_in_service_safety_assessment.py (35 tests,
deterministic, under 20 seconds).
Related leaves
- systems-engineering-safety/arp4761a/safety-assessment: the
development safety assessment whose FHA/PSSA/SSA predicted rates are
consumed as inputs here.
- systems-engineering-safety/arp4761a/failure-rate-estimation: the
statistics sibling; chi-square confidence bounds, test-hours sizing
and the zero-failure rule live there, this leaf consumes predicted
rates instead of re-deriving them.
- systems-engineering-safety/certification/mmel-development: dispatch
relief planning uses the same failure-condition severity inputs.
Pitfalls
- Waiting for the rate to prove a single severe event: one hazardous
or catastrophic event is significant regardless of the rate - the
single-event rule fires even against a 1e-8 predicted rate and
routes an airworthiness-directive-request with immediate urgency.
- Closing a condition out on a not-significant verdict alone: with
inadequate exposure (expected events below the 5.0 threshold, as in
both worked conditions) the route is continued-monitoring, not
no-action - the verdict and the adequacy screen must be read
together.
- Judging significance on one path only: significance fires on the
Poisson exceedance tail at or below alpha 0.05, OR the observed rate
at least 2.0x the predicted rate, OR the single-event rule - any one
path makes the condition significant.
- Reviewing events against an unknown condition: every event
condition must appear in the SSA predictions, and an event mapped
to a condition missing from predictions raises ValueError rather
than silently scoring against nothing.
- Confusing this leaf with the statistics sibling: the Poisson tail is
implemented here, but chi-square confidence bounds, test-hours
sizing and zero-failure demonstrations belong to
failure-rate-estimation and are not re-derived in this review.
- Routing without the trend input: corrective_route takes
trend_direction (-1, 0, 1), so a major significant condition with an
increasing trend routes service-bulletin while the same verdict
without the trend signal does not.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_in_service_safety_assessment.py
The test covers the worked-example anchors (FCS-1 observed rate 2e-6
against expected 0.3 with Poisson tail 0.0369, PP-1 observed 3e-6
against expected 2.0 with tail 0.3233), the exposure summary and
adequacy threshold, expected and observed rate math with the round-trip
identity, Poisson tail boundary and ceiling behavior, the single-event
rule for hazardous and catastrophic events, the rate-exceedance factor
path, the route and urgency branches (airworthiness-directive-request,
service-bulletin, continued-monitoring, no-action), the full
assessment_summary report, and ValueError rejection of non-physical
inputs.
Compliance
- Standards referenced, not reproduced: ARP4761A is the mapped
standards id; ARP5150A and ARP5151 are named in prose only (they are
not in standards-map.yaml). All content above is paraphrase at
reference level per standards-map.yaml; no standard text is
reproduced.
- compliance: STANDARDS-REF, gated: false.
1---2name: in-service-safety-assessment3description: Use when you must assess in-service safety data for a civil aircraft fleet against the type-design safety assessment predictions: collect field events from service difficulty reports and airline reliability reports grouped by failure condition, compute the observed event rate over the fleet exposure, compare it with the predicted rate from the safety objective, apply the single-event rule for hazardous or catastrophic events, and decide whether the experience is safety-significant. Produces the observed rate, the Poisson exceedance statistic, the significance verdict, and the corrective action route (no action, continued monitoring, service bulletin, or airworthiness directive request) with an urgency band. Trigger: in-service safety assessment, continued airworthiness, service difficulty report, field event rate, fleet exposure, observed versus predicted rate, single-event rule, ARP5150, safety significance, airworthiness directive request.4license: Apache-2.05---67# In-Service Safety Assessment (systems-engineering-safety/continued-airworthiness/in-service-safety-assessment)89Use when field experience on a civil aircraft fleet must be reviewed10against the type-design safety assessment: collect service difficulty11reports, airline reliability reports and incident reports, group them by12the failure condition they demonstrate, and decide whether the observed13event rate over the fleet exposure is consistent with the SSA predicted14rate for each condition. This leaf opens the continued-airworthiness15pack and implements the ARP5150A and ARP5151 style in-service review in16pure Python, stdlib only. ARP5150A and ARP5151 continue the ARP4761A17assessment process into the in-service phase, so the predicted rates18consumed here come from the development safety assessment. It pairs with19systems-engineering-safety/arp4761a/safety-assessment (the producer of20those predicted rates), with arp4761a/failure-rate-estimation (the21statistics sibling; chi-square confidence bounds and zero-failure22demonstrations are NOT re-derived here), and with23certification/mmel-development (dispatch relief uses the same severity24inputs).2526## Domain quick reference2728- Field event sources: service difficulty reports, airline reliability29 reports and incident reports, each mapped to the failure condition it30 demonstrates with a severity (none, minor, major, hazardous,31 catastrophic) and a description.32- Exposure: total fleet flight hours (fh) or flight cycles (fc) over33 which events were collected; per aircraft average is total divided by34 fleet size.35- Expected events under the prediction: m = predicted_rate * exposure.36- Observed rate: observed / exposure.37- Single-event rule: one hazardous or catastrophic event is38 significant regardless of the rate (SINGLE_EVENT_SEVERITIES).39- Poisson exceedance tail: P(X >= observed | mean m) computed as the40 series sum from k = observed, stopping when the added term falls41 below 1e-12 or k exceeds m * 20 + 50 (CEILING_MULT), via exp and a42 log-factorial start term for stability.43- Significance: tail <= SIGNIFICANCE_ALPHA (0.05), or observed rate at44 least RATE_EXCEEDANCE_MIN (2.0x) the predicted rate, or the45 single-event rule.46- Exposure adequacy: an exposure window is adequate to judge a47 predicted rate when predicted_rate * exposure >= 5.0 expected events48 (EXPOSURE_ADEQUACY_EXPECTED_EVENTS), a typical screening rule.49- Corrective routes: airworthiness-directive-request (catastrophic50 single event or catastrophic rate exceedance, immediate), service-51 bulletin (hazardous significant, or major significant with an52 increasing trend, short-term or scheduled), continued-monitoring53 (minor significant, or any not-significant verdict with inadequate54 exposure or an increasing trend, routine or scheduled), no-action55 (not significant, adequate exposure, non-increasing trend, routine).56- The Poisson tail math is implemented directly in this leaf; the57 chi-square failure-rate statistics belong to the58 failure-rate-estimation sibling.5960## Workflow61621. Fix the fleet exposure: fleet_size (aircraft), exposure_hours (total63 fleet exposure) and exposure_unit ("fh" flight hours or "fc" flight64 cycles); get the per-aircraft average with exposure_summary.652. Collect the field events as dicts with event_id, condition_id,66 severity and description; group_events returns the count per67 condition and severity_max_per_condition preserves the highest68 observed severity per condition.693. Load the SSA predictions: {condition_id: {predicted_rate, severity,70 note}}; every event condition must appear in predictions.714. For each condition compute the expected events with72 expected_events(predicted_rate, exposure_hours) and screen the73 exposure with adequacy_verdict (adequate when expected events reach74 the 5.0 threshold).755. Form the observed rate with observed_rate(events_count,76 exposure_hours).776. Decide significance with significance_verdict(condition_id,78 observed, expected, severity): the single-event rule for hazardous79 or catastrophic observations, the one-sided Poisson exceedance tail80 against SIGNIFICANCE_ALPHA, and the RATE_EXCEEDANCE_MIN factor.817. Route the outcome with corrective_route(verdict, exposure_adequate,82 trend_direction) where trend_direction is -1, 0 or 1; read the route83 and the urgency band.848. Run assessment_summary(fleet_size, exposure_hours, exposure_unit,85 events, predictions, trend_direction) to obtain the full report body86 with every per-condition row and the safety-significant condition87 list.889. Confirm the deterministic checks with the contract test89 scripts/test_in_service_safety_assessment.py.9091## Worked example9293Fleet of 200 aircraft with 1,000,000 fleet flight hours (fh).94Predictions from the SSA: "FCS-1" predicted_rate 3e-7 per fh, severity95hazardous (expected events 0.3); "PP-1" predicted_rate 2e-6 per fh,96severity major (expected events 2.0). Field events: 2 hazardous97"FCS-1" and 3 major "PP-1".9899- FCS-1: observed rate 2e-6 per fh (observed_rate(2, 1e6)), expected100 events 0.3. Exposure is inadequate to judge the rate (0.3 is below101 the 5.0 adequacy threshold). Poisson tail P(X >= 2 | mean 0.3) =102 0.0369, at or below alpha 0.05, and the hazardous single-event rule103 applies. Verdict: significant; route service-bulletin, urgency104 short-term.105- PP-1: observed rate 3e-6 per fh, expected events 2.0. Poisson tail106 P(X >= 3 | mean 2.0) = 0.3233, above alpha 0.05; the rate ratio 1.5107 is below the 2.0 exceedance factor. Verdict: not significant. With108 expected events 2.0 the exposure is below the 5.0 adequacy threshold,109 so the route is continued-monitoring (routine) rather than a close110 out; the spec anchor permits no-action or continued-monitoring.111- Single catastrophic event: one event on a condition predicted at112 1e-8 per fh triggers the single-event rule even at a low rate; route113 airworthiness-directive-request, urgency immediate.114115## Verification116117- Confirm observed_rate(2, 1e6) returns 2e-6 and expected_events(3e-7,118 1e6) returns 0.3; the rate times the exposure recovers the event119 count (round-trip identity).120- Confirm poisson_exceedance_p(2, 0.3) is 0.0369 and121 poisson_exceedance_p(3, 2.0) is 0.3233, both within 1e-3 of the spec122 anchors; the tail is 1.0 for zero observed events and 0.0 for a123 positive count against a zero mean.124- Confirm adequacy_verdict(5.0) is adequate and adequacy_verdict(0.3)125 is inadequate against the 5.0 threshold.126- Confirm a single catastrophic event routes127 airworthiness-directive-request with urgency immediate, and that a128 hazardous significant verdict routes service-bulletin short-term.129- Confirm every non-physical input raises ValueError: negative130 exposure, non-positive fleet size, negative observed count or131 expected count, zero exposure when forming a rate, negative132 predicted rate, unknown severity strings, empty predictions, an133 event condition missing from predictions, an invalid exposure_unit,134 and a trend_direction outside -1/0/1.135- Run the contract test offline: python3136 scripts/test_in_service_safety_assessment.py (35 tests,137 deterministic, under 20 seconds).138139## Related leaves140141- systems-engineering-safety/arp4761a/safety-assessment: the142 development safety assessment whose FHA/PSSA/SSA predicted rates are143 consumed as inputs here.144- systems-engineering-safety/arp4761a/failure-rate-estimation: the145 statistics sibling; chi-square confidence bounds, test-hours sizing146 and the zero-failure rule live there, this leaf consumes predicted147 rates instead of re-deriving them.148- systems-engineering-safety/certification/mmel-development: dispatch149 relief planning uses the same failure-condition severity inputs.150151## Pitfalls152153- Waiting for the rate to prove a single severe event: one hazardous154 or catastrophic event is significant regardless of the rate - the155 single-event rule fires even against a 1e-8 predicted rate and156 routes an airworthiness-directive-request with immediate urgency.157- Closing a condition out on a not-significant verdict alone: with158 inadequate exposure (expected events below the 5.0 threshold, as in159 both worked conditions) the route is continued-monitoring, not160 no-action - the verdict and the adequacy screen must be read161 together.162- Judging significance on one path only: significance fires on the163 Poisson exceedance tail at or below alpha 0.05, OR the observed rate164 at least 2.0x the predicted rate, OR the single-event rule - any one165 path makes the condition significant.166- Reviewing events against an unknown condition: every event167 condition must appear in the SSA predictions, and an event mapped168 to a condition missing from predictions raises ValueError rather169 than silently scoring against nothing.170- Confusing this leaf with the statistics sibling: the Poisson tail is171 implemented here, but chi-square confidence bounds, test-hours172 sizing and zero-failure demonstrations belong to173 failure-rate-estimation and are not re-derived in this review.174- Routing without the trend input: corrective_route takes175 trend_direction (-1, 0, 1), so a major significant condition with an176 increasing trend routes service-bulletin while the same verdict177 without the trend signal does not.178179## Behavior contract (gate 3)180181Run the deterministic contract test (stdlib unittest, offline):182183 python3 scripts/test_in_service_safety_assessment.py184185The test covers the worked-example anchors (FCS-1 observed rate 2e-6186against expected 0.3 with Poisson tail 0.0369, PP-1 observed 3e-6187against expected 2.0 with tail 0.3233), the exposure summary and188adequacy threshold, expected and observed rate math with the round-trip189identity, Poisson tail boundary and ceiling behavior, the single-event190rule for hazardous and catastrophic events, the rate-exceedance factor191path, the route and urgency branches (airworthiness-directive-request,192service-bulletin, continued-monitoring, no-action), the full193assessment_summary report, and ValueError rejection of non-physical194inputs.195196## Compliance197198- Standards referenced, not reproduced: ARP4761A is the mapped199 standards id; ARP5150A and ARP5151 are named in prose only (they are200 not in standards-map.yaml). All content above is paraphrase at201 reference level per standards-map.yaml; no standard text is202 reproduced.203- compliance: STANDARDS-REF, gated: false.