Fastener Installation Quality (manufacturing-quality/assembly/fastener-installation-quality)
Use when the task is verifying the installation quality of aerospace
structural fasteners (bolts, Hi-Loks, rivets) at assembly time:
selecting the correct grip length for the clamped stack from the
available grip increments, checking the thread protrusion after
installation, computing the clamp load from the applied torque with
the torque coefficient, verifying the clamp load and the torque
scatter band against the joint allowables, checking the countersink
flushness for flush head fasteners, confirming swage collar
engagement for lock-bolt fasteners, and classifying the installation
verdict as pass, rework, or scrap with the specific defect. This leaf
implements the checks in pure Python, stdlib only. It is the first
leaf of the assembly pack and pairs with
structures/composites/composite-bolted-joints, which analyzes the
bearing and bypass stresses of the same bolted joint, and with the
as9100 process-control leaves that govern the tooling and records
around the installation. Fastener hole fatigue screening and fastener
pattern design are out of scope here.
Domain quick reference
- Grip selection: the installed grip must cover the clamped stack.
Grip = the smallest available grip increment at least the stack
total; when no increment reaches the total, no grip fits the stack.
Protrusion = grip minus stack total, the thread extending past the
nut or collar.
- Thread protrusion band: a typical structural bolt protrusion of
0.5 to 3.0 mm past the nut (documented typical values, confirm
against the fastener manufacturer data and the governing code).
Negative protrusion (a grip shorter than the stack) is out of band.
- Clamp load from torque: F = T / (k * D), with T the applied torque
in N m, k the torque coefficient (typical 0.2 lubricated) and D the
nominal fastener diameter in m.
- Clamp verdict: the estimated clamp load must sit between the joint
minimum required clamp and the joint allowable clamp (embedment or
pull-out limit). Below the minimum is under-clamp, above the
allowable is over-clamp.
- Countersink flushness: for flush head fasteners the measured
flushness (positive proud, negative recessed) must stay within the
tolerance, typically 0.13 mm.
- Swage collar engagement: for lock-bolt fasteners the collar must
engage at least 2 full threads (typical practice).
- Torque scatter: when the actual applied torque is recorded,
scatter = abs(actual minus applied) / applied * 100 percent; a
typical scatter band of 15 percent is acceptable (informational
note, confirm against the program control plan).
- AS9100 frames the assembly process control context; the relations
above are standard engineering methodology, summary-only.
Workflow
- Collect the clamped stack thicknesses, the available grip
increments, the fastener diameter, the applied torque and the joint
clamp limits (min_clamp_N, max_clamp_N) from the installation
record and the joint drawing.
- Select the grip with select_grip(stack_thicknesses_mm,
available_grips_mm) and read the stack total, grip and protrusion.
- Check the protrusion with protrusion_ok(protrusion_mm) against the
typical 0.5 to 3.0 mm band.
- Estimate the clamp load with clamp_load_N(applied_torque_Nm,
k_factor, fastener_diameter_m) and classify it with
clamp_verdict(clamp_N, min_clamp_N, max_clamp_N).
- For flush head fasteners, check flushness_ok(measured_mm,
tolerance_mm) with the countersink measurement. For lock-bolts,
confirm collar_engagement_ok(engaged_threads) reaches the minimum
thread count.
- Run installation_verdict with the full input set to get the
verdict (pass, rework, scrap), the specific defect, the clamp
values and the torque scatter note.
- Confirm the deterministic checks with the contract test
scripts/test_fastener_installation_quality.py.
Worked example
1/4 inch bolt-nut joint, protruding head: stack [4.0, 6.0, 4.0] mm
(total 14.0 mm), available grips [12.7, 15.875, 19.05] mm,
D = 0.00635 m, torque 24 N m, k = 0.2, min clamp 12000 N, max clamp
25000 N.
- select_grip: total 14.0 mm; the smallest available grip at least
14.0 is 15.875 mm; grip 15.875 mm, protrusion 1.875 mm.
protrusion_ok True (inside [0.5, 3.0]).
- clamp_load_N: 24 / (0.2 * 0.00635) = 18897.6 N (within 0.5);
clamp_verdict "clamp-ok" (12000 <= 18897.6 <= 25000).
- installation_verdict: "pass", defect None, clamp verdict clamp-ok.
- No grip fits: stack [10.0, 8.0] mm = 18.0 mm against grips [12.7,
15.875] mm gives grip None, verdict "rework", defect
"no-grip-fits". With grips [12.7, 15.875, 19.05, 22.0] mm the same
stack selects 19.05 mm (protrusion 1.05 mm) and passes.
- Protrusion fail: stack 15.9 mm against the extended grip list
selects 19.05 mm with protrusion 3.15 mm, above the 3.0 mm band,
verdict "rework", defect "protrusion-out-of-band". A misfitted
grip shorter than the stack gives a negative protrusion, for
example protrusion_ok(-0.025) is False, the same defect path.
- Over-clamp: torque 40 N m gives 31496 N, above the 25000 N
allowable, verdict "scrap", defect "over-clamp". Under-clamp:
torque 10 N m gives 7874 N, below the 12000 N minimum, verdict
"rework", defect "under-clamp".
- Flushness fail: flush head with measured +0.22 mm against the 0.13
mm tolerance gives verdict "rework", defect
"flushness-out-of-tolerance".
- Collar fail: lock-bolt with 1 engaged collar thread gives verdict
"rework", defect "collar-engagement"; 2 threads pass.
- Scatter note: actual torque 26.4 N m gives scatter 10.0 percent
(scatter_ok True); actual 30 N m gives 25 percent (scatter_ok
False, informational only).
Verification
- Confirm select_grip([4.0, 6.0, 4.0], [12.7, 15.875, 19.05]) returns
stack total 14.0 mm, grip 15.875 mm, protrusion 1.875 mm, and that
protrusion_ok(1.875) is True while protrusion_ok(-0.025) is False.
- Confirm clamp_load_N(24, 0.2, 0.00635) returns 18897.6 N within
0.5, and clamp_verdict(18897.6, 12000, 25000) is "clamp-ok".
- Confirm the worked example installation_verdict result is "pass"
with defect None, and each fail case (no-grip-fits,
protrusion-out-of-band, over-clamp scrap, under-clamp rework,
flushness-out-of-tolerance, collar-engagement) maps to the expected
verdict and defect.
- Confirm the scatter note: actual 26.4 N m gives 10.0 percent with
scatter_ok True, actual 30 N m gives 25 percent with scatter_ok
False, and no actual torque gives None for both fields.
- Confirm ValueError rejection of non-physical inputs: empty stack,
negative stack thickness, empty or unsorted grips, torque 0 or
negative, k factor 0 or negative, diameter 0 or negative, minimum
clamp 0 or a maximum below the minimum, negative engaged threads, a
flush head without a measured flushness, fastener_type "screw" and
an unknown head_style.
- Run the contract test offline: python3
scripts/test_fastener_installation_quality.py (35 tests,
deterministic).
Related leaves
- structures/composites/composite-bolted-joints: the stress analysis
of the same bolted joint (bearing and bypass loads); this leaf
verifies the physical installation, that leaf verifies the joint
strength allowables.
- manufacturing-quality/as9100/calibration-control: the torque tools
and measuring equipment used for the installation must sit inside
calibration control.
- manufacturing-quality/as9100/nonconformance-control: disposition of
the rework and scrap installations this leaf classifies.
Pitfalls
- Releasing a joint whose grip selection found no fit: when no
available grip increment reaches the stack total the verdict is
rework with defect no-grip-fits - and a grip shorter than the stack
produces negative protrusion, which is always out of band, never a
pass.
- Confusing clamp verdict direction: below the joint minimum clamp is
under-clamp (rework) while above the joint allowable is over-clamp
(scrap) - the two failure modes have different dispositions and must
not be merged into one defect.
- Checking the protrusion band without the fastener data: the 0.5 to
3.0 mm band is a documented typical value that must be confirmed
against the fastener manufacturer data and the governing code for
the program, and the 0.13 mm flushness tolerance and 15 percent
scatter band carry the same confirm-first status.
- Reading torque scatter as a verdict input: the scatter note is
informational only (scatter_ok False never changes pass, rework or
scrap), so a 25 percent scatter flags a process-control problem
without silently failing an otherwise sound installation.
- Forgetting the head and fastener type gates: a flush head without a
measured flushness, a lock-bolt checked without engaged threads, a
fastener_type of "screw", and an unknown head_style all raise
ValueError - the check set must match the fastener being verified.
- Assuming this leaf verifies joint strength: it checks the physical
installation (grip, protrusion, clamp load, flushness, engagement);
bearing and bypass stress allowables of the same bolted joint belong
to structures/composites/composite-bolted-joints.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_fastener_installation_quality.py
The test covers the worked example anchors (stack 14.0 mm, grip
15.875 mm, protrusion 1.875 mm, clamp load 18897.6 N, clamp verdict
clamp-ok, verdict pass), grip selection boundaries (exact match, next
increment, no grip fits), the protrusion band with inclusive
boundaries and negative values, clamp load scaling with torque and k,
clamp verdict branches with inclusive boundaries, flushness checks in
both proud and recessed directions, collar engagement at and below
the minimum with the None input, every verdict and defect path
including the lock-bolt and rivet type paths, the torque scatter note
in and out of band, and ValueError rejection of every non-physical
input class.
Compliance
- AS9100 is referenced for assembly process control context only, not
reproduced; standards-map.yaml governs the citation form.
- The protrusion band, minimum engaged threads, torque coefficient,
flushness tolerance and torque scatter band are documented typical
aerospace practice values, paraphrased, not reproductions of
standard text. Confirm each against the fastener manufacturer data
and the governing code for the program before releasing an
installation.
- compliance: STANDARDS-REF, gated: false.
1---2name: fastener-installation-quality3description: Use when you must verify the installation quality of aerospace structural fasteners during assembly: select the grip length for the clamped stack from the available grip increments, check the thread protrusion against the typical protrusion band, compute the clamp load from the applied torque with the torque coefficient, verify the clamp load and the torque scatter band against the joint allowables, check the countersink flushness for flush head fasteners, confirm the swage collar engagement for lock-bolt fasteners, and classify the installation verdict as pass, rework, or scrap with the specific defect. Produces the selected grip, the protrusion check, the clamp-load estimate, the flushness and engagement checks, and the installation verdict that gate the assembly quality assessment. Trigger: fastener installation quality, grip length selection, thread protrusion, clamp load from torque, countersink flushness, collar engagement, Hi-Lok installation check.4license: Apache-2.05---67# Fastener Installation Quality (manufacturing-quality/assembly/fastener-installation-quality)89Use when the task is verifying the installation quality of aerospace10structural fasteners (bolts, Hi-Loks, rivets) at assembly time:11selecting the correct grip length for the clamped stack from the12available grip increments, checking the thread protrusion after13installation, computing the clamp load from the applied torque with14the torque coefficient, verifying the clamp load and the torque15scatter band against the joint allowables, checking the countersink16flushness for flush head fasteners, confirming swage collar17engagement for lock-bolt fasteners, and classifying the installation18verdict as pass, rework, or scrap with the specific defect. This leaf19implements the checks in pure Python, stdlib only. It is the first20leaf of the assembly pack and pairs with21structures/composites/composite-bolted-joints, which analyzes the22bearing and bypass stresses of the same bolted joint, and with the23as9100 process-control leaves that govern the tooling and records24around the installation. Fastener hole fatigue screening and fastener25pattern design are out of scope here.2627## Domain quick reference2829- Grip selection: the installed grip must cover the clamped stack.30 Grip = the smallest available grip increment at least the stack31 total; when no increment reaches the total, no grip fits the stack.32 Protrusion = grip minus stack total, the thread extending past the33 nut or collar.34- Thread protrusion band: a typical structural bolt protrusion of35 0.5 to 3.0 mm past the nut (documented typical values, confirm36 against the fastener manufacturer data and the governing code).37 Negative protrusion (a grip shorter than the stack) is out of band.38- Clamp load from torque: F = T / (k * D), with T the applied torque39 in N m, k the torque coefficient (typical 0.2 lubricated) and D the40 nominal fastener diameter in m.41- Clamp verdict: the estimated clamp load must sit between the joint42 minimum required clamp and the joint allowable clamp (embedment or43 pull-out limit). Below the minimum is under-clamp, above the44 allowable is over-clamp.45- Countersink flushness: for flush head fasteners the measured46 flushness (positive proud, negative recessed) must stay within the47 tolerance, typically 0.13 mm.48- Swage collar engagement: for lock-bolt fasteners the collar must49 engage at least 2 full threads (typical practice).50- Torque scatter: when the actual applied torque is recorded,51 scatter = abs(actual minus applied) / applied * 100 percent; a52 typical scatter band of 15 percent is acceptable (informational53 note, confirm against the program control plan).54- AS9100 frames the assembly process control context; the relations55 above are standard engineering methodology, summary-only.5657## Workflow58591. Collect the clamped stack thicknesses, the available grip60 increments, the fastener diameter, the applied torque and the joint61 clamp limits (min_clamp_N, max_clamp_N) from the installation62 record and the joint drawing.632. Select the grip with select_grip(stack_thicknesses_mm,64 available_grips_mm) and read the stack total, grip and protrusion.653. Check the protrusion with protrusion_ok(protrusion_mm) against the66 typical 0.5 to 3.0 mm band.674. Estimate the clamp load with clamp_load_N(applied_torque_Nm,68 k_factor, fastener_diameter_m) and classify it with69 clamp_verdict(clamp_N, min_clamp_N, max_clamp_N).705. For flush head fasteners, check flushness_ok(measured_mm,71 tolerance_mm) with the countersink measurement. For lock-bolts,72 confirm collar_engagement_ok(engaged_threads) reaches the minimum73 thread count.746. Run installation_verdict with the full input set to get the75 verdict (pass, rework, scrap), the specific defect, the clamp76 values and the torque scatter note.777. Confirm the deterministic checks with the contract test78 scripts/test_fastener_installation_quality.py.7980## Worked example81821/4 inch bolt-nut joint, protruding head: stack [4.0, 6.0, 4.0] mm83(total 14.0 mm), available grips [12.7, 15.875, 19.05] mm,84D = 0.00635 m, torque 24 N m, k = 0.2, min clamp 12000 N, max clamp8525000 N.8687- select_grip: total 14.0 mm; the smallest available grip at least88 14.0 is 15.875 mm; grip 15.875 mm, protrusion 1.875 mm.89 protrusion_ok True (inside [0.5, 3.0]).90- clamp_load_N: 24 / (0.2 * 0.00635) = 18897.6 N (within 0.5);91 clamp_verdict "clamp-ok" (12000 <= 18897.6 <= 25000).92- installation_verdict: "pass", defect None, clamp verdict clamp-ok.93- No grip fits: stack [10.0, 8.0] mm = 18.0 mm against grips [12.7,94 15.875] mm gives grip None, verdict "rework", defect95 "no-grip-fits". With grips [12.7, 15.875, 19.05, 22.0] mm the same96 stack selects 19.05 mm (protrusion 1.05 mm) and passes.97- Protrusion fail: stack 15.9 mm against the extended grip list98 selects 19.05 mm with protrusion 3.15 mm, above the 3.0 mm band,99 verdict "rework", defect "protrusion-out-of-band". A misfitted100 grip shorter than the stack gives a negative protrusion, for101 example protrusion_ok(-0.025) is False, the same defect path.102- Over-clamp: torque 40 N m gives 31496 N, above the 25000 N103 allowable, verdict "scrap", defect "over-clamp". Under-clamp:104 torque 10 N m gives 7874 N, below the 12000 N minimum, verdict105 "rework", defect "under-clamp".106- Flushness fail: flush head with measured +0.22 mm against the 0.13107 mm tolerance gives verdict "rework", defect108 "flushness-out-of-tolerance".109- Collar fail: lock-bolt with 1 engaged collar thread gives verdict110 "rework", defect "collar-engagement"; 2 threads pass.111- Scatter note: actual torque 26.4 N m gives scatter 10.0 percent112 (scatter_ok True); actual 30 N m gives 25 percent (scatter_ok113 False, informational only).114115## Verification116117- Confirm select_grip([4.0, 6.0, 4.0], [12.7, 15.875, 19.05]) returns118 stack total 14.0 mm, grip 15.875 mm, protrusion 1.875 mm, and that119 protrusion_ok(1.875) is True while protrusion_ok(-0.025) is False.120- Confirm clamp_load_N(24, 0.2, 0.00635) returns 18897.6 N within121 0.5, and clamp_verdict(18897.6, 12000, 25000) is "clamp-ok".122- Confirm the worked example installation_verdict result is "pass"123 with defect None, and each fail case (no-grip-fits,124 protrusion-out-of-band, over-clamp scrap, under-clamp rework,125 flushness-out-of-tolerance, collar-engagement) maps to the expected126 verdict and defect.127- Confirm the scatter note: actual 26.4 N m gives 10.0 percent with128 scatter_ok True, actual 30 N m gives 25 percent with scatter_ok129 False, and no actual torque gives None for both fields.130- Confirm ValueError rejection of non-physical inputs: empty stack,131 negative stack thickness, empty or unsorted grips, torque 0 or132 negative, k factor 0 or negative, diameter 0 or negative, minimum133 clamp 0 or a maximum below the minimum, negative engaged threads, a134 flush head without a measured flushness, fastener_type "screw" and135 an unknown head_style.136- Run the contract test offline: python3137 scripts/test_fastener_installation_quality.py (35 tests,138 deterministic).139140## Related leaves141142- structures/composites/composite-bolted-joints: the stress analysis143 of the same bolted joint (bearing and bypass loads); this leaf144 verifies the physical installation, that leaf verifies the joint145 strength allowables.146- manufacturing-quality/as9100/calibration-control: the torque tools147 and measuring equipment used for the installation must sit inside148 calibration control.149- manufacturing-quality/as9100/nonconformance-control: disposition of150 the rework and scrap installations this leaf classifies.151152## Pitfalls153154- Releasing a joint whose grip selection found no fit: when no155 available grip increment reaches the stack total the verdict is156 rework with defect no-grip-fits - and a grip shorter than the stack157 produces negative protrusion, which is always out of band, never a158 pass.159- Confusing clamp verdict direction: below the joint minimum clamp is160 under-clamp (rework) while above the joint allowable is over-clamp161 (scrap) - the two failure modes have different dispositions and must162 not be merged into one defect.163- Checking the protrusion band without the fastener data: the 0.5 to164 3.0 mm band is a documented typical value that must be confirmed165 against the fastener manufacturer data and the governing code for166 the program, and the 0.13 mm flushness tolerance and 15 percent167 scatter band carry the same confirm-first status.168- Reading torque scatter as a verdict input: the scatter note is169 informational only (scatter_ok False never changes pass, rework or170 scrap), so a 25 percent scatter flags a process-control problem171 without silently failing an otherwise sound installation.172- Forgetting the head and fastener type gates: a flush head without a173 measured flushness, a lock-bolt checked without engaged threads, a174 fastener_type of "screw", and an unknown head_style all raise175 ValueError - the check set must match the fastener being verified.176- Assuming this leaf verifies joint strength: it checks the physical177 installation (grip, protrusion, clamp load, flushness, engagement);178 bearing and bypass stress allowables of the same bolted joint belong179 to structures/composites/composite-bolted-joints.180181## Behavior contract (gate 3)182183Run the deterministic contract test (stdlib unittest, offline):184185 python3 scripts/test_fastener_installation_quality.py186187The test covers the worked example anchors (stack 14.0 mm, grip18815.875 mm, protrusion 1.875 mm, clamp load 18897.6 N, clamp verdict189clamp-ok, verdict pass), grip selection boundaries (exact match, next190increment, no grip fits), the protrusion band with inclusive191boundaries and negative values, clamp load scaling with torque and k,192clamp verdict branches with inclusive boundaries, flushness checks in193both proud and recessed directions, collar engagement at and below194the minimum with the None input, every verdict and defect path195including the lock-bolt and rivet type paths, the torque scatter note196in and out of band, and ValueError rejection of every non-physical197input class.198199## Compliance200201- AS9100 is referenced for assembly process control context only, not202 reproduced; standards-map.yaml governs the citation form.203- The protrusion band, minimum engaged threads, torque coefficient,204 flushness tolerance and torque scatter band are documented typical205 aerospace practice values, paraphrased, not reproductions of206 standard text. Confirm each against the fastener manufacturer data207 and the governing code for the program before releasing an208 installation.209- compliance: STANDARDS-REF, gated: false.