How MARGIN works

Method

MARGIN places NASA combustion test conditions and a crewed-cabin scenario in one condition space and measures how far the scenario is from the nearest comparable test. Every step below is deterministic: the same inputs always give the same numbers, and every number on this page is computed from the engine and data at build time.

Constants from lib/enginePSI snapshot 2026-11-141,870 run rows

Section 01What D is, and is not

D is a measure of evidence coverage. It answers one question: how far is this scenario from conditions NASA has actually tested, for this kind of fire question, in this gravity regime?

D is not:

  • a prediction of whether, or how, a fire would ignite, spread or go out;
  • a safety score, a risk rating, or a margin of safety;
  • a certification or qualification of any environment or material;
  • proof that two test conditions are scientifically equivalent. A small D means a similar test exists, not that the outcome would be the same.

Section 02Condition space and units

Every test row and every scenario is described on the same axes: O₂ mole fraction (% by volume), total pressure (kPa), ventilation flow (cm/s), gravity regime, and fuel class. Units are converted with fixed constants:

Unit conversions (lib/engine/constants.ts)
FromkPa
1 psia6.894757
1 atm101.325
1 bar100
1 mmHg0.133322
1 mbar0.1

Each value keeps its basis: measured; nominal (stated) — a value the investigators state, not a measurement; reported limit — a threshold the authors inferred from a series of tests; or not recorded. The original cell text is kept beside every normalised value, with the conversion applied.

Three rules prevent values being read as something they are not:

  • Missing values are never inferred. If a table does not record pressure, the run has no pressure. A nominal pressure is used only where the investigators state one.
  • Burner-fed oxidizer is not cabin O₂. In inverse-flame tests (ACME CFI-G and Flame Design) the O₂ fraction describes the gas fed through the burner into a fuel/diluent chamber. Those 274 runs are not placed on the ambient O₂ axis.
  • Reported limits are not tests. Published limiting-O₂ values are shown as separate marks and never used as the nearest evidence.

Section 03Comparability gate

Before any distance is computed, a run must pass a gate. A gas-burner flame is never counted as evidence about cabin fabrics, and no distance is ever computed across gravity regimes.

Fuel classes counted as evidence, by question (lib/engine/gate.ts)
QuestionComparableContext only (never sets the verdict)
Material flammabilitySolid · thin, Solid · thick, Solid · unclassified—
Smoke & detectionSmoke source, Solid · thin, Solid · thick, Solid · unclassified — solids only when they carry smoke or alarm measurementsNo fuel
SuppressionLiquid droplet, Solid · thin, Solid · thick, Solid · unclassified—
Liquid fuel & cool flamesLiquid dropletGas burner
  1. Planned experiments are never evidence. Published results (not in PSI) count only when you include them.
  2. The material filter (thin / thick) narrows solid runs; unclassified solids stay in.
  3. A run with no recorded O₂ cannot be placed and is not compared. Otherwise a run matched on pressure alone could look deceptively close. This is why the smoke-detector tests (SAME, SAME-R), which record no O₂, give the verdict NONE rather than borrowing a verdict from flammability burns.
  4. Reported limit values are set aside as limits.
  5. A run tested in a different gravity regime is listed under that regime and never compared.

Section 04Evidence distance

For a comparable run r and scenario s, each axis gap is divided by a scale, and D is the root of the sum of squares:

D=square root of (wO₂·ΔO₂2+wP·ΔP2+wU·ΔU2)

ΔO₂=O₂r−O₂s divided by 2

ΔP=ln(Pr / Ps) divided by ln 1.25

ΔU=Ur−Us divided by 5

where
D
evidence distance from the scenario to one comparable run, in scale units (dimensionless)
r, s
a comparable run (a tested condition) and the scenario
O₂
O₂ mole fraction, % by volume; its gap is in percentage points, divided by the O₂ scale of 2 points
P
total pressure, kPa; compared as a ratio on a log scale, one unit being a pressure ratio of ×1.25
U
ventilation flow, cm/s, divided by the flow scale of 5 cm/s; compared only if both flows are numeric
ΔO₂, ΔP, ΔU
signed axis gaps in scale units (run minus scenario)
wO₂, wP, wU
axis weights: 1, 1 and 1

The D of a scenario is the smallest D over the comparable runs in its gravity regime.

One unit of D is a 2-point O₂ difference, or a 25% pressure ratio, or a 5 cm/s flow difference. The scales are expert judgement, chosen to be commensurate with published effect sizes:

  • 2 points of O₂ — the order of published gravity-induced shifts in limiting O₂: for Mylar, the Moon value sits 5.6 points below 1 g (Olson & Ferkul, Table I), and 1.9 points separate the BASS-II 0 g and 1 g limits (BASS-II summary report).
  • ×1.25 pressure — on this scale, 10.2 psia versus 14.7 psia is 1.6 units.
  • 5 cm/s flow — the BASS-II flammability boundary is U-shaped in flow, with its minimum at low ventilation speeds (BASS-II summary report).

Missing axes. If either side lacks an axis, that axis is left out and the match is labelled partial with the axes used. Leaving an axis out can only lower D, so MARGIN also reports the best fully compared test whenever the nearest is partial. Quiescent versus ventilated flow is a categorical mismatch: the flow gap is not computed and the mismatch is shown. Ties are broken complete-before-partial, then by run id.

Illustration of the method, not data

The D ≤ 1 and D ≤ 2.5 regions around one example test, drawn by the engine on the O₂ × pressure plane, with all three scales at ½×, 1×, 2× their defaults. Change the scales or the probe’s flow to see how the regions and the probe’s D respond.

Scales (all three axes)
Probe flow
D ≤ 2.5D ≤ 1Example testProbe20253035401520305070100150200Oxygen, % by volumePressure, kPa (log)

Probe to example test

D 1.51 NEAR

O₂ gap
−1.50
Pressure gap
−0.19
Flow gap
0.00

Gaps in scaled units (test minus probe). Scales at 1×: 2 pts O₂, ×1.25 pressure, 5 cm/s flow.

  • D ≤ 1 from the example test (DIRECT)
  • D ≤ 2.5 (NEAR)
  • D = 2.5 at the other two scale settings
  • Example test (published, not in PSI)
  • Probe (a scenario)
Example test: PUB-SAFFIRE:VI-2 (SIBAL fabric, 2-sided), 31% O₂, 54.1 kPa, 20 cm/s, microgravity, the nearest comparable test to the Exploration Atmosphere with published evidence included. Probe at the Exploration Atmosphere’s 34% O₂ and 56.5 kPa. Computed with evaluate, distance and distanceField from lib/engine. One test only: the Atlas map uses every comparable run. Not a hazard map.

Section 05Verdict classes

Classes on the D axis: DIRECT up to 1, NEAR up to 2.5, DISTANT beyond. NONE sits off the axis: no comparable test exists.
Classes of the nearest comparable test (boundaries inclusive)
ClassConditionReads as
DIRECTD ≤ 1A comparable test lies within one scale unit on the compared axes.
NEAR1 < D ≤ 2.5Comparable tests are nearby but differ noticeably on at least one axis.
DISTANTD > 2.5The nearest comparable test is far from the scenario.
NONEno comparable testNothing in this gravity regime passes the gate for this question.

These are classes defined by MARGIN’s method — the scales and thresholds above. They are not established scientific categories, and they say nothing about how a fire would behave.

Section 06Robustness

Because the scales are judgement, every verdict is recomputed with each of the three scales at ½×, 1×, 2× its default (3³ = 27 combinations; the pressure ratio is raised to the power of the factor). If all combinations agree, the verdict is labelled robust; otherwise sensitive, with the range of classes.

ExampleThe Exploration Atmosphere (34% O₂, 56.5 kPa, 10 cm/s, microgravity, published evidence included): sensitive, NEAR 9 · DISTANT 18 of 27; D spans 1.25–5.02.

Section 07The flow assumption

Ventilation flow is an input you choose. MARGIN’s presets use 10 cm/s. Because flow is one of the three axes, the assumed flow can move a verdict across a class boundary. The table shows how D for the Exploration Atmosphere changes with the assumed flow, with everything else fixed.

Exploration Atmosphere (34% O₂, 56.5 kPa, microgravity, material flammability): D to the nearest comparable test by assumed flow
Assumed flowD, PSI onlyClassD, with publishedClassNearest (with published)
quiescent5.95DISTANT (partial)1.51NEAR (partial)PUB-SAFFIRE:VI-2
5 cm/s6.45DISTANT (partial)3.36DISTANTPUB-SAFFIRE:VI-2
10 cm/s (preset)6.28DISTANT (partial)2.51DISTANTPUB-SAFFIRE:VI-2
15 cm/s6.03DISTANT (partial)1.81NEARPUB-SAFFIRE:VI-2
20 cm/s5.95DISTANT (partial)1.51NEARPUB-SAFFIRE:VI-2
25 cm/s6.03DISTANT (partial)1.81NEARPUB-SAFFIRE:VI-2
30 cm/s6.28DISTANT (partial)2.51DISTANTPUB-SAFFIRE:VI-2

With published evidence, the class changes at 10.05 cm/s (DISTANT → NEAR) and 29.95 cm/s (NEAR → DISTANT). At the 10 cm/s preset the verdict is DISTANT with D = 2.51, just above the 2.5 boundary. MARGIN keeps the preset at 10 cm/s and shows this sensitivity rather than choosing a flow that produces a more favourable class. A NEAR result at 20 cm/s describes a different scenario; it does not correct the 10 cm/s result.

Section 08Gravity regimes

Gravity is categorical: microgravity, lunar, Martian and Earth gravity are separate regimes. There is no gravity slider and no line, curve or estimate between regimes. Every PSI run in this snapshot was flown in microgravity; PSI holds no partial-gravity combustion runs.

Why not interpolate? In NASA drop-tower tests of Mylar G at 10.2 psia, the limiting O₂ at lunar gravity (15.6%) was below both the 0 g value (17%) and the 1 g value (21.2%) — Olson & Ferkul, ICES-2012-3492, Table I, p. 6. Microgravity and Earth results did not bound lunar behaviour for this material, so MARGIN does not estimate any regime from the others.

Section 09The coverage map

The shaded plane on the Atlas is D evaluated at every point of the O₂ × pressure window, with the scenario’s flow, gravity, question and material held fixed. Dark shading is D ≤ 1, light is D ≤ 2.5, hatching is further. Only runs with both O₂ and pressure recorded shape the map; runs lacking a pressure still count for the verdict as partial matches and are disclosed beneath the map. The dashed contours show where the 2.5 boundary would sit if the O₂ and pressure scales were halved or doubled. It is a map of where tests exist, not a hazard map.

Section 10Investigation ranking

R=100×( 0.4·P+0.2·H+0.15·S+0.15·C+0.1·M )

where
R
rank score of an investigation for the scenario, 0–100 (weights renormalised to sum to 1)
P · proximity
exp(−Dmin) over the investigation’s comparable runs; 0 if none.
H · question match
1 if the investigation primarily addresses the question, 0.5 if secondarily, else 0 (curated hazard map).
S · scale
large-scale 1, bench 0.6, ground 0.4.
C · coverage
share of the investigation’s runs within NEAR of the scenario.
M · measurements
1 if an outcome plus a question-relevant metric is recorded, 0.5 if outcome only, else 0.

Investigations with at least one comparable run always rank above those with none; the latter are ranked on metadata only and labelled so. The weights can be changed in the interface.

Section 11Data quality

PSI run tables fetched 2026-11-14: 1,870 run rows (1,828 distinct; 42 exact duplicates flagged and kept), plus 130 summary rows that describe test series rather than single runs and are never treated as runs. 887 runs record both O₂ and pressure and can be placed on the map. The ACME CFI-G inverse-flame file contains 861 trailing blank lines, which are ignored.

Flags carried by PSI runs (a run can carry several)
FlagRunsMeaning
assumed-value1,021A value set by a documented rule rather than read from a cell (e.g. flow 0 for quiescent droplet and burner tests).
missing1,012A value is absent in the source table (left empty, never filled in).
approximate344The source gives a range or an approximate value; the first value is used.
burner-fed-oxidizer274Inverse flame: the O₂ value is the burner-fed oxidizer stream, not the ambient atmosphere, so it is not placed on the O₂ axis.
suspect-unit262The column's unit label looks inconsistent with its values; kept but not used for distance.
nominal-value218Pressure is a nominal value stated by the investigators, not a measurement.
unverified-transcription131A value whose supporting statement has not yet been checked against its primary source.
ambiguous-unit129The source unit is ambiguous (e.g. uncalibrated fan setting), so the value is not converted.
text-parsed99The value was parsed from text in the cell (e.g. "1 atm").
duplicate-row42An exact duplicate of another row in the same table; kept and counted, flagged.
out-of-range14A value outside physical range (e.g. final O₂ above initial); never used.
derived-value9The investigators derived this value from another measurement (e.g. O₂ from CO₂ production).
Experimental tables read from PSI
InvestigationFileKindRowsKept
PSI-25PSI-25_Experimental table_BASS-II.csvrun129129
PSI-26PSI-26_Experimental table_BASS.csvrun122121
PSI-98PSI-98_Experimental table_SAFFIRE-1.csvrun42
PSI-99PSI-99_Experimental table_SAFFIRE-2.csvrun159
PSI-100PSI-100_Experimental table_SAFFIRE-3.csvrun22
PSI-69PSI-69_Experimental table_FLEX.csvrun274274
PSI-39PSI-39_Experimental table_CFI.csvrun8787
PSI-159PSI-159_Experimental table_CFI-G_Normal Flames.csvrun179179
PSI-159PSI-159_Experimental table_CFI-G_Inverse Flames.csvrun154154
PSI-10PSI-10_Experimental table_Flame Design_Normal Flame.csvrun207207
PSI-10PSI-10_Experimental table_Flame Design_Inverse Flame.csvrun120120
PSI-107PSI-107_Experimental table_Spice.csvrun469469
PSI-102PSI-102_Experimental table_SAME.csvrun88
PSI-101PSI-101_Experimental table_SAME-R.csvrun109109
PSI-68PSI-68_Experimental table_Flex2.csvsummary88
PSI-106PSI-106_Experimental table_Slice.csvsummary1212
PSI-20PSI-20_Experimental table_ACME BRE.csvsummary1818
PSI-21PSI-21_Experimental table_CLD Flame.csvsummary3232
PSI-22PSI-22_Experimental table_ACME E-FIELD Flames.csvsummary3232
PSI-23PSI-23_Experimental table_ACME s-Flame.csvsummary1818
PSI-47PSI-47_Experimental table_DAFT.csvsummary22
PSI-142PSI-142_Experimental table_Data Summary Table.csvsummary88

Section 12Limitations

  • Evidence distance measures coverage of test conditions, not flammability. Being close to a test does not mean a material behaves the same way.
  • The axis scales (2 pts O₂, 25% pressure, 5 cm/s flow) are expert judgement; robustness to ½×–2× is shown.
  • Tested configurations are narrow: mostly PMMA, SIBAL fabric, a few liquid fuels and gas burners.
  • Partial-gravity evidence is three materials in 5.18 s drops plus one rotating sounding-rocket flight reported in conference slides.
  • Published values differ between papers (Saffire O₂, pressure, flow direction and heat release); all reported values are shown.
  • “Nominal (stated)” pressures are not measurements.

Section 13Claims MARGIN does not make

  • That any atmosphere, material or vehicle is acceptable, or not, for crewed use.
  • That a scenario close to a test would behave like that test.
  • That results at 0 g and 1 g bracket lunar or Martian behaviour.
  • That a gas-burner or droplet flame says anything about cabin materials.
  • That a planned experiment is evidence.
  • Any flammability prediction for an untested material or condition.

Section 14Reproducibility

The data pipeline (pipeline/) downloads the PSI combustion records and experimental tables once and writes a versioned snapshot; the app never calls NASA at run time. The engine (lib/engine) is pure TypeScript with unit and science tests, and the constants on this page are read from it directly. Every scenario is encoded in the page URL, so a shared link reproduces the same result. See Sources for every reference.