AS9100 requires aerospace manufacturers to maintain traceable, tamper-evident test records for every unit produced. TofuPilot maps directly to these requirements, giving you structured test data, serial number tracking, and exportable records without building a custom QMS.
AS9100 Requirements for Test Records
AS9100 Rev D builds on ISO 9001 with aerospace-specific additions. The clauses most relevant to test and inspection are:
| AS9100 Clause | Requirement | TofuPilot Feature |
|---|---|---|
| 7.1.5 Monitoring and measuring resources | Calibrated equipment, traceable measurements | Measurements with units and limits, station identifiers |
| 7.5.3 Control of documented information | Records retained, protected, retrievable | Immutable test records, cloud storage with retention |
| 8.5.2 Identification and traceability | Unique identification of product throughout production | Serial number tracking, unit history page |
| 8.6 Release of products and services | Evidence of conformity to acceptance criteria | Pass/fail results with measurement limits |
| 8.7 Control of nonconforming outputs | Documented nonconformances with disposition | Failed test runs with root cause measurements |
| 10.2 Nonconformity and corrective action | Records of nonconformities and actions taken | Failure history per unit, measurement trends |
Structuring Tests for AS9100 Compliance
A well-structured OpenHTF test produces the data AS9100 auditors look for: identified DUT, traceable measurements with limits, and a clear pass/fail determination.
# Aerospace PCBA acceptance test with AS9100-aligned structure
import openhtf as htf
from openhtf.util import units
from tofupilot.openhtf import TofuPilot
@htf.measures(
htf.Measurement("insulation_resistance")
.in_range(minimum=100)
.doc("Per IPC-9252, minimum 100 Mohm between adjacent nets"),
htf.Measurement("hi_pot_leakage")
.in_range(maximum=0.001)
.with_units(units.AMPERE)
.doc("Dielectric withstand per MIL-STD-202, Method 301"),
)
def dielectric_test(test):
test.measurements.insulation_resistance = 450.2
test.measurements.hi_pot_leakage = 0.00012
@htf.measures(
htf.Measurement("supply_voltage")
.in_range(minimum=27.5, maximum=28.5)
.with_units(units.VOLT)
.doc("28V nominal bus, AS6081 compliant power supply"),
htf.Measurement("quiescent_current")
.in_range(maximum=0.050)
.with_units(units.AMPERE),
htf.Measurement("output_signal_snr")
.in_range(minimum=40),
)
def functional_acceptance(test):
test.measurements.supply_voltage = 28.01
test.measurements.quiescent_current = 0.0124
test.measurements.output_signal_snr = 52.3
@htf.measures(
htf.Measurement("temperature_cycle_drift_pct")
.in_range(maximum=0.5)
.doc("Output drift after -40C to +85C cycle per RTCA DO-160"),
)
def environmental_screening(test):
test.measurements.temperature_cycle_drift_pct = 0.18
def main():
test = htf.Test(
dielectric_test,
functional_acceptance,
environmental_screening,
)
with TofuPilot(test):
test.execute(test_start=lambda: "AE-PCB-2026-00847")
if __name__ == "__main__":
main()Each measurement includes units (where a constant exists), limits, and documentation strings. TofuPilot stores all of this, making it retrievable during audits.
Record Retention and Retrieval
AS9100 clause 7.5.3 requires that quality records are retained for the period specified by the customer or regulatory authority. In aerospace, this often means 7 to 30 years depending on the program.
TofuPilot stores test records immutably. Records can't be edited or deleted through the normal interface. You can search by serial number, procedure, station, date range, or pass/fail status.
For audit preparation, export test records from TofuPilot's dashboard. Each export includes the serial number, procedure name, station, operator (if captured), all measurements with limits, and the overall result.
Nonconformance Tracking
When a unit fails a test, AS9100 requires documented nonconformance handling. TofuPilot captures this at the measurement level.
# Test that captures detailed failure data for nonconformance records
import openhtf as htf
from openhtf.util import units
from tofupilot.openhtf import TofuPilot
@htf.measures(
htf.Measurement("solder_joint_resistance")
.in_range(maximum=0.05)
.with_units(units.OHM)
.doc("IPC-A-610 Class 3 solder joint acceptance"),
htf.Measurement("component_placement_offset")
.in_range(maximum=0.1)
.with_units(units.MILLIMETRE)
.doc("Component X/Y offset from nominal pad center"),
htf.Measurement("visual_inspection_defects")
.in_range(maximum=0)
.doc("Count of IPC-A-610 Class 3 defects found"),
)
def incoming_inspection(test):
test.measurements.solder_joint_resistance = 0.08 # FAIL: exceeds 0.05 ohm
test.measurements.component_placement_offset = 0.04
test.measurements.visual_inspection_defects = 0
def main():
test = htf.Test(incoming_inspection)
with TofuPilot(test):
test.execute(test_start=lambda: "AE-PCB-2026-00848")
if __name__ == "__main__":
main()The failed measurement (solder joint resistance at 0.08 ohm, limit 0.05 ohm) is recorded with its exact value. In TofuPilot's dashboard, failed runs surface immediately. The unit's history page shows every test attempt, so you can track rework and retest cycles.
Station and Equipment Identification
AS9100 requires traceability of monitoring and measuring equipment. TofuPilot records the station identifier for every test run, linking results to specific test fixtures and equipment.
Configure station names to match your equipment calibration records. This creates a direct link between test results and the calibrated instruments that produced them.
Audit-Ready Exports
TofuPilot's dashboard provides everything AS9100 auditors typically request:
- Unit history. Complete test record for any serial number, showing every procedure, measurement, and result.
- Measurement trends. Control charts and Cpk values for any measurement across production, demonstrating process stability.
- Failure analysis. Failure Pareto charts showing which measurements fail most often, supporting corrective action (clause 10.2).
- Station records. Test results filtered by station, supporting equipment traceability requirements.
All of this data is available without writing custom reports or export scripts.