HALT and HASS are stress testing methods that sound similar and do opposite things. HALT destroys a handful of units on purpose to find where the design breaks. HASS screens production units with a stress profile chosen to be survivable. Confusing them is expensive in both directions.
The Difference in One Table
| HALT | HASS | |
|---|---|---|
| Full name | Highly Accelerated Life Test | Highly Accelerated Stress Screen |
| When | Design phase | Production |
| Sample | A few units (3-10) | Every unit, or a large sample |
| Goal | Find the design's destruct limits | Precipitate latent defects |
| Stress level | Increased until failure, beyond spec | Fixed, below the destruct limit |
| Expected outcome | Every unit eventually fails | Every unit survives |
| A failure means | Useful information about margin | This unit had a defect |
| Output | Operating and destruct limits | Pass/fail per unit |
The single most important relationship: HALT defines the stress levels that HASS is allowed to use. You cannot design a HASS profile without HALT data, because you would be guessing at how much stress the product survives.
HALT: Finding the Limits
HALT applies increasing stress until the product stops working, in steps, one stress type at a time and then combined.
| Step | Stress | What you learn |
|---|---|---|
| 1 | Cold step stress | Lower operating and destruct limits |
| 2 | Hot step stress | Upper operating and destruct limits |
| 3 | Rapid thermal transitions | Sensitivity to thermal shock |
| 4 | Vibration step stress | Mechanical resonances, solder joint weakness |
| 5 | Combined thermal + vibration | Interaction failures neither finds alone |
Two thresholds come out of each stress type:
- Operating limit. The product stops working but recovers when the stress is removed.
- Destruct limit. The product is permanently damaged.
The margin between the specification and the operating limit is the number that matters. A product specified to 60 °C with an operating limit of 65 °C has almost no margin; one with an operating limit of 110 °C has plenty.
HALT is not a pass/fail test and has no meaningful yield. Every unit is expected to fail eventually. Stopping HALT because a unit broke defeats the purpose.
Recording HALT
HALT results are limits, not verdicts. The useful record is the stress level at which each failure mode appeared.
def thermal_step(measurements, chamber, dut): """One step of a cold or hot step-stress sequence.""" measurements.chamber_temperature = chamber.read_temperature() measurements.dut_functional = dut.self_test_passes() measurements.supply_current = dut.supply_current_ma()procedure.yaml27 lines
name: HALT Thermal Stepversion: 1.0.0description: One step in a HALT step-stress sequence; failures are expectedunit: serial_number: default_value: "HALT-001" part_number: default_value: "PCBA-100"plugs: - name: chamber python: plugs.chamber:Chamber - name: dut python: plugs.dut:Dutmain: - name: Thermal Step python: phases.thermal_step measurements: - name: Chamber Temperature unit: "°C" description: Actual soak temperature, recorded not asserted - name: DUT Functional description: Whether the unit still operates at this step - name: Supply Current unit: mANote what is missing: validators. A HALT step has no limits, because the point is to record where behaviour changes, not to judge it. A measurement with no validator is recorded and reported without a pass/fail verdict, which is exactly right here.
The failure step is then visible in the unit's history: the temperature at which dut_functional went false is the operating limit, and whether it recovered on the way back tells you if that was also the destruct limit.
def record_halt_context(run): run.metadata["stress_type"] = "cold_step" run.metadata["step_number"] = 7 run.metadata["recovered_after_step"] = TrueHASS: Screening Production
HASS uses a fixed profile derived from the HALT results, typically set well inside the operating limits, to precipitate latent defects without damaging good units.
| Parameter | Typical derivation |
|---|---|
| Temperature extremes | Inside the operating limits, outside the spec range |
| Ramp rate | Aggressive, often 30-60 °C/min |
| Vibration level | A fraction of the vibration operating limit |
| Cycles | Few; enough to precipitate, not to consume life |
| Functional test | During and after stress, not only after |
The critical constraint is that HASS must not consume meaningful life from good units. That is verified with a Safety of Screen study: repeat the screen on the same units many times and confirm they still pass. If units start failing after twenty screens, the profile is too aggressive for a product expected to survive years in the field.
Recording HASS
HASS is a normal pass/fail production test, so it has limits like any other:
def hass_functional(measurements, chamber, dut): measurements.chamber_temperature = chamber.read_temperature() measurements.output_voltage = dut.output_voltage() measurements.self_test_passed = dut.self_test_passes()procedure.yaml39 lines
name: HASS Screenversion: 1.0.0unit: serial_number: default_value: "PCBA000001" part_number: default_value: "PCBA-100"plugs: - name: chamber python: plugs.chamber:Chamber - name: dut python: plugs.dut:Dutmain: - name: HASS Functional python: phases.hass_functional measurements: - name: Chamber Temperature unit: "°C" description: Verify the screen was actually applied validators: - operator: ">=" expected_value: -38.0 - operator: "<=" expected_value: 82.0 - name: Output Voltage unit: V description: Same limits as the ambient functional test validators: - operator: ">=" expected_value: 4.75 - operator: "<=" expected_value: 5.25 - name: Self Test Passed validators: - operator: "==" expected_value: trueRun it with tofupilot run ./procedure.yaml --upload.
Two deliberate choices:
The chamber temperature is validated. A screen that was never actually applied, because the chamber did not reach setpoint, produces units that passed a test that did not happen. Verifying the stress was delivered is part of the test.
The functional limits match the ambient test. That makes drift across the screen visible as a comparison against the same unit's earlier run, rather than two unrelated numbers.
HALT and HASS in Context
| Method | Phase | Units | Purpose |
|---|---|---|---|
| HALT | Design | A few, destroyed | Find design margin |
| HASS | Production | All or a large sample | Screen out latent defects |
| ORT | Ongoing production | Small continuous sample | Detect reliability drift over time |
| Burn-in | Production | All or a sample | Precipitate infant mortality by duration |
HASS and burn-in overlap in intent. HASS is generally faster and more aggressive, using thermal cycling and vibration; burn-in is longer and gentler, usually powered soak at elevated temperature.
When HASS Is Not Worth It
HASS requires a chamber, a fixture that survives the profile, the HALT data to design it, and a Safety of Screen study. For low-volume or low-criticality products, that investment may exceed the cost of the field failures it prevents. The honest calculation is the expected cost of escapes against the cost of screening.
For high-reliability products, the calculation almost always favours screening, which is why it is standard in aerospace, medical and automotive.
If You Already Run OpenHTF
hass.py21 lines
import openhtf as htffrom openhtf.util import unitsfrom tofupilot.openhtf import upload@htf.measures( htf.Measurement("chamber_temperature_C") .in_range(-38.0, 82.0) .with_units(units.DEGREE_CELSIUS), htf.Measurement("output_voltage_V") .in_range(4.75, 5.25) .with_units(units.VOLT),)def phase_hass(test): test.measurements.chamber_temperature_C = 81.2 test.measurements.output_voltage_V = 5.02test = htf.Test(phase_hass, part_number="PCBA-100")test.add_output_callbacks(upload())test.execute(test_start=lambda: input("Scan serial: "))Install with pip install "tofupilot[openhtf]", or skip the callback and run it with tofupilot run.
Common Mistakes
| Mistake | Consequence | Fix |
|---|---|---|
| Designing HASS without HALT data | Either damaging good units or screening nothing | Run HALT first; derive the profile from its limits |
| Stopping HALT at the first failure | No destruct limit, no margin figure | Continue to destruct on every stress type |
| Putting pass/fail limits on HALT steps | The data becomes a verdict instead of a limit | Record HALT measurements without validators |
| No Safety of Screen study | HASS consumes field life from good units | Repeat the screen and confirm survival |
| Not verifying the chamber reached setpoint | Units pass a screen that never happened | Validate the chamber temperature |
| Different functional limits than the ambient test | Drift across the screen is invisible | Reuse the ambient measurement names and limits |
