Skip to content
Scaling & Monitoring

Set Up Alerts for Yield Drops

Configure yield threshold alerts and measurement drift notifications in TofuPilot so you catch production problems before they become expensive.

JJulien Buteau
beginner5 min readMarch 14, 2026

A yield drop that goes unnoticed for a full shift can mean hundreds of scrapped units. TofuPilot's alerting features notify you when something goes wrong, so you can intervene before the damage spreads.

Why Real-Time Alerting Matters

Production problems rarely announce themselves. A solder paste machine runs low and starts producing weak joints. A fixture contact wears down and adds resistance to every measurement. A new component lot has slightly different characteristics.

In all these cases, the yield drop starts small and grows. The earlier you catch it, the fewer units are affected. Waiting for end-of-shift reports or weekly quality reviews is too slow.

Produce Clean, Structured Test Data

Alerts are only as good as the data behind them. Write your OpenHTF tests with clear, measurable outputs so TofuPilot can track trends and trigger alerts on the right signals.

test_charger_board.py
import openhtf as htf
from openhtf.util import units
from tofupilot.openhtf import TofuPilot

@htf.measures(
    htf.Measurement("charge_voltage")
    .in_range(minimum=4.15, maximum=4.25)
    .with_units(units.VOLT),
    htf.Measurement("charge_current")
    .in_range(minimum=0.450, maximum=0.550)
    .with_units(units.AMPERE),
    htf.Measurement("thermal_shutdown_temp")
    .in_range(minimum=80, maximum=90)
    .with_units(units.DEGREE_CELSIUS),
)
def test_charging_circuit(test):
    test.measurements.charge_voltage = 4.19
    test.measurements.charge_current = 0.498
    test.measurements.thermal_shutdown_temp = 85.2

def main():
    test = htf.Test(
        test_charging_circuit,
        station_id="LINE-A-FCT-02",
    )
    with TofuPilot(test):
        test.execute(test_start=lambda: "CHG-2026-03318")

if __name__ == "__main__":
    main()

Each measurement with defined limits feeds TofuPilot's analytics. The tighter and more consistent your naming, the more useful your alerts will be.

What TofuPilot Can Alert On

TofuPilot monitors your production data and can notify you about several conditions:

Alert typeWhat it catches
Yield thresholdFPY drops below your target (e.g., below 95%)
Consecutive failuresMultiple units fail the same test in a row
Measurement driftA measurement's mean shifts toward a limit
Station inactivityA station stops reporting results

These cover the most common production problems. Yield threshold alerts catch broad issues. Consecutive failure alerts catch acute problems like a broken fixture. Measurement drift alerts catch slow degradation before it causes failures.

Configure Alerts in TofuPilot

Set up alerts from the TofuPilot dashboard. Navigate to your procedure, then configure notification rules:

  • Yield alerts: Set a yield floor. When FPY over a rolling window drops below the threshold, TofuPilot notifies your team.
  • Consecutive failure alerts: Set the count. Three consecutive failures on the same measurement is a strong signal that something changed.
  • Drift alerts: TofuPilot watches measurement distributions and flags when the mean shifts significantly. You don't need to set manual thresholds for this.
  • Station offline alerts: TofuPilot tracks when each station last reported. If a station goes silent during expected production hours, you get notified.

Design Tests for Better Alerting

You can make alerts more useful by how you structure your tests.

test_led_driver.py
import openhtf as htf
from openhtf.util import units
from tofupilot.openhtf import TofuPilot

@htf.measures(
    # Separate measurements for each channel make alerts specific
    htf.Measurement("led_current_ch1")
    .in_range(minimum=0.018, maximum=0.022)
    .with_units(units.AMPERE),
    htf.Measurement("led_current_ch2")
    .in_range(minimum=0.018, maximum=0.022)
    .with_units(units.AMPERE),
    htf.Measurement("led_current_ch3")
    .in_range(minimum=0.018, maximum=0.022)
    .with_units(units.AMPERE),
    htf.Measurement("led_current_ch4")
    .in_range(minimum=0.018, maximum=0.022)
    .with_units(units.AMPERE),
)
def test_led_channels(test):
    test.measurements.led_current_ch1 = 0.0201
    test.measurements.led_current_ch2 = 0.0198
    test.measurements.led_current_ch3 = 0.0203
    test.measurements.led_current_ch4 = 0.0200

def main():
    test = htf.Test(
        test_led_channels,
        station_id="LINE-B-FCT-01",
    )
    with TofuPilot(test):
        test.execute(test_start=lambda: "LED-2026-05519")

if __name__ == "__main__":
    main()

Splitting measurements by channel (instead of a single pass/fail for all channels) means TofuPilot can alert you that channel 3 is drifting specifically. That's actionable. A generic "LED test failing more" is not.

Respond to Alerts

When an alert fires, act on it:

  1. Check the measurement data in TofuPilot. Look at the trend chart and histogram to understand what changed.
  2. Narrow down the scope. Is it one station or all stations? One shift or all shifts? This points to the root cause.
  3. Fix the root cause. Recalibrate the equipment, replace the fixture, retrain the operator, quarantine the component lot.
  4. Verify the fix. Watch the next batch of results in TofuPilot to confirm yield recovers and measurements return to nominal.

Alerts are a starting point, not the answer. They tell you something changed. The measurement data in TofuPilot tells you what.

More Guides

Put this guide into practice