ARP4761A Event-Tree Analysis (systems-engineering-safety/arp4761a/event-tree-analysis)
Use when the task is forward event-tree analysis of an aircraft system
safety case per ARP4761A: starting from one initiating event, enumerate
every binary branch path through an ordered list of mitigating
functions, roll up each end-state outcome frequency, sum the frequency
of the failure end state, and screen the dominant sequences against the
per-flight-hour severity targets. This leaf is the forward dual of
fault tree analysis: FTA works backward from a top event through gates
to basic events, while this leaf works forward from an initiator
through successive mitigating-function branches. It consumes the FHA
severity class of each end state (rated by
functional-hazard-assessment, never re-derived here) and feeds end-state
frequencies into the SSA close-out work. Pairs with
systems-engineering-safety/arp4761a/fta-fmea for the backward side and
with systems-engineering-safety/arp4761a/particular-risk-analysis for
single-event forward risk that does not branch.
Domain quick reference
- An event tree starts from one initiating event with a per-flight-hour
frequency q0 and lets each ordered mitigating function (for example
fire detection, extinguisher discharge, pilot action) either succeed
with probability p or fail with probability 1 - p.
- Full binary expansion: N branch nodes give 2N end-state paths.
Enumeration is the ascending binary mask with node i mapped to bit i,
so the all-failure path (mask 0) comes first and the all-success path
(mask 2N - 1) comes last. The cap is BRANCH_NODES_MAX = 12 nodes =
4096 paths; 13 nodes (8192 paths) raise ValueError.
- Path probability: the product of the branch probabilities along the
path, p for a success branch and 1 - p for a failure branch. The
probabilities of the full expansion sum to exactly 1.0.
- End-state frequency: frequency = q0 x path probability for every
end-state path; the frequencies of the full expansion sum to exactly
the initiator frequency q0 (the expansion partitions the initiator).
- Failure end state: under the series-barriers reading, the path where
no mitigating function contained the initiator (every outcome False).
Its frequency is the top-function failure frequency, the undetected
and uncontained end state that the mitigating chain must push below
its severity target.
- Dominant sequence: an end-state sequence whose frequency strictly
exceeds the severity target of its FHA class (frequency > target;
equality is NOT dominant). Ratio = frequency / target.
- ARP4761A-class per-flight-hour severity targets, magnitude only and
mirrored from the FHA probability-target mapping: CATASTROPHIC 1e-9,
HAZARDOUS 1e-7, MAJOR 1e-5, MINOR 1e-3. The class of each end state is
an analyst input from the FHA and is never derived in the module:
screen each end state against the target of its own class.
- Deterministic binary enumeration only: no Monte Carlo, no time
integration, no analyst weighting inside the rollup.
Workflow
- Fix the initiating event: state the initiator and its per-flight-hour
frequency q0 from the prior analysis (for example an FHA or
preliminary assessment). q0 must be non-negative;
outcome_frequencies rejects a negative initiator frequency with
ValueError.
- List the ordered mitigating functions: build the branch node list of
(name, p_success) tuples in the order the functions act; the failure
probability of each function is 1 - p_success. At most
BRANCH_NODES_MAX = 12 nodes keep the expansion at 4096 paths; the
boundary probabilities 0.0 and 1.0 are legal.
- Enumerate the binary branch tree with build_paths: the full 2N
expansion from the all-failure path (mask 0, first) to the
all-success path (mask 2N - 1, last). Every end-state path carries
its readable sequence string (name:S or name:F per node in node
order), its bool path (True = the function succeeds) and the
branch-probability product along the path.
- Roll up and rank the end-state frequencies with
outcome_frequencies(q0, nodes): frequency = q0 x path probability for
every end-state path, ranked descending by frequency with ties broken
by enumeration order (stable sort).
- Sum the failure end-state frequency with is_failure_end_state and
top_function_failure_frequency: the all-failure path is the failure
end state where no mitigating function contained the initiator; the
function returns its sequence and the sum of the frequencies of the
paths reaching it.
- Screen the ranked sequences with dominant_sequences: pass the
per-flight-hour severity target of each end state's FHA class
(CATASTROPHIC 1e-9, HAZARDOUS 1e-7, MAJOR 1e-5, MINOR 1e-3, the
magnitude targets only). A frequency strictly above its class target
flags the sequence dominant with ratio = frequency / target; an end
state sitting exactly on its target is not dominant.
- Judge the mitigating chain: any dominant sequence, or a top-function
failure frequency above its class target, means the chain alone does
not meet the safety objective for the initiator. Add an independent
barrier or lower the initiator frequency and re-run steps 2 to 6.
- Confirm deterministic behavior with the contract test:
python3 scripts/test_event_tree_analysis.py.
Worked example
Cargo-compartment fire. Initiating event: cargo fire ignition at
initiator_frequency q0 = 3e-5 per flight hour. Three mitigating
functions in series, branch nodes [("detect", 0.95), ("extinguish",
0.90), ("pilot", 0.80)]: fire detection, extinguisher discharge, pilot
action. Failure probabilities are 0.05, 0.10 and 0.20. Real module
outputs from the smoke run (python3, stdlib, deterministic):
Path probabilities in enumeration order (module sum exactly 1.0):
detect:F extinguish:F pilot:F 0.001, detect:S extinguish:F pilot:F
0.019, detect:F extinguish:S pilot:F 0.009, detect:S extinguish:S
pilot:F 0.171, detect:F extinguish:F pilot:S 0.004, detect:S
extinguish:F pilot:S 0.076, detect:F extinguish:S pilot:S 0.036,
detect:S extinguish:S pilot:S 0.684. Each raw float sits within 1e-15
of the products of the decimal inputs, so the displayed values are the
module outputs rounded.
outcome_frequencies(3e-5, nodes) ranked descending (module frequency sum
exactly 3e-05 = the initiator):
- detect:S extinguish:S pilot:S probability 0.684, frequency 2.052e-5
- detect:S extinguish:S pilot:F probability 0.171, frequency 5.13e-6
- detect:S extinguish:F pilot:S probability 0.076, frequency 2.28e-6
- detect:F extinguish:S pilot:S probability 0.036, frequency 1.08e-6
- detect:S extinguish:F pilot:F probability 0.019, frequency 5.7e-7
- detect:F extinguish:S pilot:F probability 0.009, frequency 2.7e-7
- detect:F extinguish:F pilot:S probability 0.004, frequency 1.2e-7
- detect:F extinguish:F pilot:F probability 0.001, frequency 3e-8
top_function_failure_frequency returns {"sequences":
["detect:F extinguish:F pilot:F"], "frequency": 3e-8}: the undetected,
unsuppressed fire end state sits at 3e-8 per flight hour, which exceeds
the catastrophic target 1e-9 by a factor of 30 (module ratio
30.000000000000014, within 1e-9 of 30), so this chain alone does not
meet the safety objective and the design needs an additional independent
barrier or a lower initiator frequency.
Example FHA class input for the screening (analyst rating by consequence
belongs to the FHA, not the module): extinguish success rates the end
state minor; extinguish failure with detect success rates major;
extinguish failure with detect failure rates hazardous when the pilot
action succeeds and catastrophic when it fails. Screening each end state
against the target of its own class with dominant_sequences (real module
verdicts):
- detect:F extinguish:F pilot:F vs CATASTROPHIC 1e-9: 3e-8 > 1e-9,
DOMINANT, ratio 30.0 (mitigation required).
- detect:F extinguish:F pilot:S vs HAZARDOUS 1e-7: 1.2e-7 > 1e-7,
DOMINANT, ratio 1.2 (module 1.200000000000001, thin margin, needs
justification or improved detection and suppression).
- detect:S extinguish:F pilot:S and detect:S extinguish:F pilot:F vs
MAJOR 1e-5: 2.28e-6 and 5.7e-7, not dominant.
- the four extinguish-success end states vs MINOR 1e-3: largest is the
all-success chain at 2.052e-5, not dominant.
Global screening caution from the same run: screening the whole ranked
list against MAJOR alone flags only the all-success end state (2.052e-5
1e-5, module ratio 2.052), which is not the dangerous sequence; each
end state must be screened against the target of its own FHA-rated
class.
Verification
- build_paths over the fire nodes returns 8 paths in the documented
binary-mask order and the path probabilities sum to exactly 1.0.
- outcome_frequencies(3e-5, fire nodes) returns the ranked list above;
the frequencies sum to exactly 3e-05 and each entry carries exactly
the keys sequence, path, probability, frequency.
- A single node at p = 0.5 and initiator 1e-5 splits evenly into g:F
5e-6 then g:S 5e-6 (ties keep enumeration order).
- Boundary probabilities are legal: p = 1.0 puts the whole initiator on
the success end state, p = 0.0 on the failure end state.
- The 12-node all p = 0.5 tree enumerates 4096 paths with all-success
probability exactly 2**-12 = 0.000244140625 and max frequency
2**-12.
- The failure end-state frequency 3e-8 matches the initiator x (0.05 x
0.10 x 0.20) identity within 1e-15; the dominant ratios 30.0 and 1.2
hold within 1e-9.
- ValueError rejection of non-physical inputs: negative initiator
frequency, empty node list, 13 branch nodes, branch probability 1.5
or -0.1, and severity target 0 or negative all raise ValueError.
- Run the contract test offline: python3
scripts/test_event_tree_analysis.py (33 tests, deterministic, all
pass in under a second).
Related leaves
- systems-engineering-safety/arp4761a/fta-fmea: the backward dual,
top-event probability and cut sets from AND/OR gate structures over
basic events.
- systems-engineering-safety/arp4761a/functional-hazard-assessment:
the FHA severity classes that each end state consumes as input.
- systems-engineering-safety/arp4761a/ssa-closure: closes the SSA over
the assessed conditions using the per-flight-hour severity targets.
- systems-engineering-safety/arp4761a/particular-risk-analysis:
single-event forward risk combination without branch trees.
- systems-engineering-safety/arp4761a/markov-analysis: time-domain
state probabilities from transition rates, the neighbor this leaf
does not overlap.
Pitfalls
- Screening the whole ranked list against one target: in the worked
example a single MAJOR screen flags only the all-success end state
(2.052e-5 > 1e-5), which is not the dangerous sequence, while the
catastrophic failure end state at 3e-8 sails under that screen. Each
end state must be screened against the target of its own FHA class.
- Reading equality with the target as dominant: the comparison is
strict, frequency > target, so an end state sitting exactly on its
severity target is not flagged and still needs a margin argument.
- Re-ordering or dropping a mitigating function after the rollup: the
failure end state is the all-failure path of the exact node list in
force; every barrier added multiplies the failure end-state frequency
by its own 1 - p and every re-order changes the sequence strings, so
re-run the enumeration after any chain change.
- Misreading the mask order: node i maps to bit i of an ascending
binary mask, so mask 0 (all failure) is the FIRST path and mask
2**N - 1 (all success) is the LAST; a reversed reading swaps the
failure and success end states.
- Letting the module invent severity classes: the class of each end
state is an analyst input from the FHA (extinguish failure with
detect failure rates hazardous or catastrophic by consequence); the
module only screens against the target it is handed.
- Reaching for this leaf outside its scope: backward fault-tree gates,
cut sets and top-event logic from basic events, lognormal uncertainty
bands, and Markov time evolution belong to the sibling leaves listed
above, not to the forward branch rollup.
Contract test
The contract test scripts/test_event_tree_analysis.py (stdlib unittest,
offline, deterministic) exercises the whole workflow: the binary
branch-tree enumeration and probability table of step 3, the ranked
end-state frequency rollup and exact partition identities of step 4,
the failure end-state frequency sum of step 5, the dominant-sequence
screening with ratios and the strict-equality rule of step 6, every
ValueError rejection of the validation list, the 12-node expansion cap,
and determinism. Run it from the repo root:
python3 skills/systems-engineering-safety/arp4761a/event-tree-analysis/scripts/test_event_tree_analysis.py
Behavior contract (gate 3)
The event-tree logic is exercised by the gate 3 contract test:
scripts/test_event_tree_analysis.py against
scripts/event_tree_analysis_logic.py (stdlib unittest, offline). Run:
python3 scripts/test_event_tree_analysis.py
from the leaf directory, or the full path from the repo root as shown
in the Contract test section. Exit 0 with 33 tests passing satisfies
the behavior contract gate.
Compliance
- Standards referenced, not reproduced: ARP4761A is proprietary SAE
guidance (reference-only per standards-map.yaml); this leaf states
engineering methodology in its own words, summary-only, and the
severity targets appear by magnitude only as module constants.
- The event-tree method is the forward dual of fault tree analysis as
practiced in system safety assessments; no verbatim standard text is
included.
- compliance: STANDARDS-REF, gated: false.
1---2name: event-tree-analysis3description: Use when you must run a forward event-tree analysis of the sequences from an initiating event: enumerate every binary branch path through an ordered list of mitigating functions, each with its success probability, roll up each end-state outcome frequency as the initiator frequency times the product of the branch probabilities along the path, rank the end-state paths by frequency, sum the frequency over the paths that reach the failure end state, and screen the ranked sequences against the ARP4761A-class per-flight-hour severity targets to flag the dominant sequences. Produces the full path enumeration with per-path probabilities and frequencies, the frequency-ranked end-state list, the failure-end-state frequency sum and the dominant-sequence flags. Trigger: event tree, initiating event, mitigating function, branch path, end state, failure end state, dominant sequence, initiator frequency.4license: Apache-2.05---67# ARP4761A Event-Tree Analysis (systems-engineering-safety/arp4761a/event-tree-analysis)89Use when the task is forward event-tree analysis of an aircraft system10safety case per ARP4761A: starting from one initiating event, enumerate11every binary branch path through an ordered list of mitigating12functions, roll up each end-state outcome frequency, sum the frequency13of the failure end state, and screen the dominant sequences against the14per-flight-hour severity targets. This leaf is the forward dual of15fault tree analysis: FTA works backward from a top event through gates16to basic events, while this leaf works forward from an initiator17through successive mitigating-function branches. It consumes the FHA18severity class of each end state (rated by19functional-hazard-assessment, never re-derived here) and feeds end-state20frequencies into the SSA close-out work. Pairs with21systems-engineering-safety/arp4761a/fta-fmea for the backward side and22with systems-engineering-safety/arp4761a/particular-risk-analysis for23single-event forward risk that does not branch.2425## Domain quick reference2627- An event tree starts from one initiating event with a per-flight-hour28 frequency q0 and lets each ordered mitigating function (for example29 fire detection, extinguisher discharge, pilot action) either succeed30 with probability p or fail with probability 1 - p.31- Full binary expansion: N branch nodes give 2**N end-state paths.32 Enumeration is the ascending binary mask with node i mapped to bit i,33 so the all-failure path (mask 0) comes first and the all-success path34 (mask 2**N - 1) comes last. The cap is BRANCH_NODES_MAX = 12 nodes =35 4096 paths; 13 nodes (8192 paths) raise ValueError.36- Path probability: the product of the branch probabilities along the37 path, p for a success branch and 1 - p for a failure branch. The38 probabilities of the full expansion sum to exactly 1.0.39- End-state frequency: frequency = q0 x path probability for every40 end-state path; the frequencies of the full expansion sum to exactly41 the initiator frequency q0 (the expansion partitions the initiator).42- Failure end state: under the series-barriers reading, the path where43 no mitigating function contained the initiator (every outcome False).44 Its frequency is the top-function failure frequency, the undetected45 and uncontained end state that the mitigating chain must push below46 its severity target.47- Dominant sequence: an end-state sequence whose frequency strictly48 exceeds the severity target of its FHA class (frequency > target;49 equality is NOT dominant). Ratio = frequency / target.50- ARP4761A-class per-flight-hour severity targets, magnitude only and51 mirrored from the FHA probability-target mapping: CATASTROPHIC 1e-9,52 HAZARDOUS 1e-7, MAJOR 1e-5, MINOR 1e-3. The class of each end state is53 an analyst input from the FHA and is never derived in the module:54 screen each end state against the target of its own class.55- Deterministic binary enumeration only: no Monte Carlo, no time56 integration, no analyst weighting inside the rollup.5758## Workflow59601. Fix the initiating event: state the initiator and its per-flight-hour61 frequency q0 from the prior analysis (for example an FHA or62 preliminary assessment). q0 must be non-negative;63 outcome_frequencies rejects a negative initiator frequency with64 ValueError.652. List the ordered mitigating functions: build the branch node list of66 (name, p_success) tuples in the order the functions act; the failure67 probability of each function is 1 - p_success. At most68 BRANCH_NODES_MAX = 12 nodes keep the expansion at 4096 paths; the69 boundary probabilities 0.0 and 1.0 are legal.703. Enumerate the binary branch tree with build_paths: the full 2**N71 expansion from the all-failure path (mask 0, first) to the72 all-success path (mask 2**N - 1, last). Every end-state path carries73 its readable sequence string (name:S or name:F per node in node74 order), its bool path (True = the function succeeds) and the75 branch-probability product along the path.764. Roll up and rank the end-state frequencies with77 outcome_frequencies(q0, nodes): frequency = q0 x path probability for78 every end-state path, ranked descending by frequency with ties broken79 by enumeration order (stable sort).805. Sum the failure end-state frequency with is_failure_end_state and81 top_function_failure_frequency: the all-failure path is the failure82 end state where no mitigating function contained the initiator; the83 function returns its sequence and the sum of the frequencies of the84 paths reaching it.856. Screen the ranked sequences with dominant_sequences: pass the86 per-flight-hour severity target of each end state's FHA class87 (CATASTROPHIC 1e-9, HAZARDOUS 1e-7, MAJOR 1e-5, MINOR 1e-3, the88 magnitude targets only). A frequency strictly above its class target89 flags the sequence dominant with ratio = frequency / target; an end90 state sitting exactly on its target is not dominant.917. Judge the mitigating chain: any dominant sequence, or a top-function92 failure frequency above its class target, means the chain alone does93 not meet the safety objective for the initiator. Add an independent94 barrier or lower the initiator frequency and re-run steps 2 to 6.958. Confirm deterministic behavior with the contract test:96 python3 scripts/test_event_tree_analysis.py.9798## Worked example99100Cargo-compartment fire. Initiating event: cargo fire ignition at101initiator_frequency q0 = 3e-5 per flight hour. Three mitigating102functions in series, branch nodes [("detect", 0.95), ("extinguish",1030.90), ("pilot", 0.80)]: fire detection, extinguisher discharge, pilot104action. Failure probabilities are 0.05, 0.10 and 0.20. Real module105outputs from the smoke run (python3, stdlib, deterministic):106107Path probabilities in enumeration order (module sum exactly 1.0):108detect:F extinguish:F pilot:F 0.001, detect:S extinguish:F pilot:F1090.019, detect:F extinguish:S pilot:F 0.009, detect:S extinguish:S110pilot:F 0.171, detect:F extinguish:F pilot:S 0.004, detect:S111extinguish:F pilot:S 0.076, detect:F extinguish:S pilot:S 0.036,112detect:S extinguish:S pilot:S 0.684. Each raw float sits within 1e-15113of the products of the decimal inputs, so the displayed values are the114module outputs rounded.115116outcome_frequencies(3e-5, nodes) ranked descending (module frequency sum117exactly 3e-05 = the initiator):118119- detect:S extinguish:S pilot:S probability 0.684, frequency 2.052e-5120- detect:S extinguish:S pilot:F probability 0.171, frequency 5.13e-6121- detect:S extinguish:F pilot:S probability 0.076, frequency 2.28e-6122- detect:F extinguish:S pilot:S probability 0.036, frequency 1.08e-6123- detect:S extinguish:F pilot:F probability 0.019, frequency 5.7e-7124- detect:F extinguish:S pilot:F probability 0.009, frequency 2.7e-7125- detect:F extinguish:F pilot:S probability 0.004, frequency 1.2e-7126- detect:F extinguish:F pilot:F probability 0.001, frequency 3e-8127128top_function_failure_frequency returns {"sequences":129["detect:F extinguish:F pilot:F"], "frequency": 3e-8}: the undetected,130unsuppressed fire end state sits at 3e-8 per flight hour, which exceeds131the catastrophic target 1e-9 by a factor of 30 (module ratio13230.000000000000014, within 1e-9 of 30), so this chain alone does not133meet the safety objective and the design needs an additional independent134barrier or a lower initiator frequency.135136Example FHA class input for the screening (analyst rating by consequence137belongs to the FHA, not the module): extinguish success rates the end138state minor; extinguish failure with detect success rates major;139extinguish failure with detect failure rates hazardous when the pilot140action succeeds and catastrophic when it fails. Screening each end state141against the target of its own class with dominant_sequences (real module142verdicts):143144- detect:F extinguish:F pilot:F vs CATASTROPHIC 1e-9: 3e-8 > 1e-9,145 DOMINANT, ratio 30.0 (mitigation required).146- detect:F extinguish:F pilot:S vs HAZARDOUS 1e-7: 1.2e-7 > 1e-7,147 DOMINANT, ratio 1.2 (module 1.200000000000001, thin margin, needs148 justification or improved detection and suppression).149- detect:S extinguish:F pilot:S and detect:S extinguish:F pilot:F vs150 MAJOR 1e-5: 2.28e-6 and 5.7e-7, not dominant.151- the four extinguish-success end states vs MINOR 1e-3: largest is the152 all-success chain at 2.052e-5, not dominant.153154Global screening caution from the same run: screening the whole ranked155list against MAJOR alone flags only the all-success end state (2.052e-5156> 1e-5, module ratio 2.052), which is not the dangerous sequence; each157end state must be screened against the target of its own FHA-rated158class.159160## Verification161162- build_paths over the fire nodes returns 8 paths in the documented163 binary-mask order and the path probabilities sum to exactly 1.0.164- outcome_frequencies(3e-5, fire nodes) returns the ranked list above;165 the frequencies sum to exactly 3e-05 and each entry carries exactly166 the keys sequence, path, probability, frequency.167- A single node at p = 0.5 and initiator 1e-5 splits evenly into g:F168 5e-6 then g:S 5e-6 (ties keep enumeration order).169- Boundary probabilities are legal: p = 1.0 puts the whole initiator on170 the success end state, p = 0.0 on the failure end state.171- The 12-node all p = 0.5 tree enumerates 4096 paths with all-success172 probability exactly 2**-12 = 0.000244140625 and max frequency173 2**-12.174- The failure end-state frequency 3e-8 matches the initiator x (0.05 x175 0.10 x 0.20) identity within 1e-15; the dominant ratios 30.0 and 1.2176 hold within 1e-9.177- ValueError rejection of non-physical inputs: negative initiator178 frequency, empty node list, 13 branch nodes, branch probability 1.5179 or -0.1, and severity target 0 or negative all raise ValueError.180- Run the contract test offline: python3181 scripts/test_event_tree_analysis.py (33 tests, deterministic, all182 pass in under a second).183184## Related leaves185186- systems-engineering-safety/arp4761a/fta-fmea: the backward dual,187 top-event probability and cut sets from AND/OR gate structures over188 basic events.189- systems-engineering-safety/arp4761a/functional-hazard-assessment:190 the FHA severity classes that each end state consumes as input.191- systems-engineering-safety/arp4761a/ssa-closure: closes the SSA over192 the assessed conditions using the per-flight-hour severity targets.193- systems-engineering-safety/arp4761a/particular-risk-analysis:194 single-event forward risk combination without branch trees.195- systems-engineering-safety/arp4761a/markov-analysis: time-domain196 state probabilities from transition rates, the neighbor this leaf197 does not overlap.198199## Pitfalls200201- Screening the whole ranked list against one target: in the worked202 example a single MAJOR screen flags only the all-success end state203 (2.052e-5 > 1e-5), which is not the dangerous sequence, while the204 catastrophic failure end state at 3e-8 sails under that screen. Each205 end state must be screened against the target of its own FHA class.206- Reading equality with the target as dominant: the comparison is207 strict, frequency > target, so an end state sitting exactly on its208 severity target is not flagged and still needs a margin argument.209- Re-ordering or dropping a mitigating function after the rollup: the210 failure end state is the all-failure path of the exact node list in211 force; every barrier added multiplies the failure end-state frequency212 by its own 1 - p and every re-order changes the sequence strings, so213 re-run the enumeration after any chain change.214- Misreading the mask order: node i maps to bit i of an ascending215 binary mask, so mask 0 (all failure) is the FIRST path and mask216 2**N - 1 (all success) is the LAST; a reversed reading swaps the217 failure and success end states.218- Letting the module invent severity classes: the class of each end219 state is an analyst input from the FHA (extinguish failure with220 detect failure rates hazardous or catastrophic by consequence); the221 module only screens against the target it is handed.222- Reaching for this leaf outside its scope: backward fault-tree gates,223 cut sets and top-event logic from basic events, lognormal uncertainty224 bands, and Markov time evolution belong to the sibling leaves listed225 above, not to the forward branch rollup.226227## Contract test228229The contract test scripts/test_event_tree_analysis.py (stdlib unittest,230offline, deterministic) exercises the whole workflow: the binary231branch-tree enumeration and probability table of step 3, the ranked232end-state frequency rollup and exact partition identities of step 4,233the failure end-state frequency sum of step 5, the dominant-sequence234screening with ratios and the strict-equality rule of step 6, every235ValueError rejection of the validation list, the 12-node expansion cap,236and determinism. Run it from the repo root:237238 python3 skills/systems-engineering-safety/arp4761a/event-tree-analysis/scripts/test_event_tree_analysis.py239240## Behavior contract (gate 3)241242The event-tree logic is exercised by the gate 3 contract test:243scripts/test_event_tree_analysis.py against244scripts/event_tree_analysis_logic.py (stdlib unittest, offline). Run:245246 python3 scripts/test_event_tree_analysis.py247248from the leaf directory, or the full path from the repo root as shown249in the Contract test section. Exit 0 with 33 tests passing satisfies250the behavior contract gate.251252## Compliance253254- Standards referenced, not reproduced: ARP4761A is proprietary SAE255 guidance (reference-only per standards-map.yaml); this leaf states256 engineering methodology in its own words, summary-only, and the257 severity targets appear by magnitude only as module constants.258- The event-tree method is the forward dual of fault tree analysis as259 practiced in system safety assessments; no verbatim standard text is260 included.261- compliance: STANDARDS-REF, gated: false.