aero-agent-roles 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/NOTICE +18 -0
  2. package/README.md +49 -0
  3. package/bin/aero-agent-roles.js +127 -0
  4. package/lib/catalog.js +97 -0
  5. package/lib/install.js +48 -0
  6. package/lib/mcp.js +199 -0
  7. package/manifest.json +516 -0
  8. package/package.json +44 -0
  9. package/roles/aerodynamics-engineer/ROLE.md +153 -0
  10. package/roles/aerodynamics-engineer/SOURCES.md +12 -0
  11. package/roles/aerodynamics-engineer/cli.py +143 -0
  12. package/roles/aerodynamics-engineer/core/aerodynamics_core.py +1218 -0
  13. package/roles/aerodynamics-engineer/templates/aero-design-report-template.md +72 -0
  14. package/roles/aerodynamics-engineer/tests/test_aerodynamics_core.py +227 -0
  15. package/roles/aerodynamics-engineer/tests/test_role_aerodynamics.py +94 -0
  16. package/roles/aircraft-design-engineer/ROLE.md +138 -0
  17. package/roles/aircraft-design-engineer/SOURCES.md +12 -0
  18. package/roles/aircraft-design-engineer/cli.py +152 -0
  19. package/roles/aircraft-design-engineer/core/aircraft_design_core.py +1278 -0
  20. package/roles/aircraft-design-engineer/templates/concept-design-template.md +99 -0
  21. package/roles/aircraft-design-engineer/tests/test_aircraft_design_core.py +269 -0
  22. package/roles/aircraft-design-engineer/tests/test_role_aircraft_design_engineer.py +106 -0
  23. package/roles/airworthiness-compliance-engineer/ROLE.md +122 -0
  24. package/roles/airworthiness-compliance-engineer/SOURCES.md +16 -0
  25. package/roles/airworthiness-compliance-engineer/cli.py +146 -0
  26. package/roles/airworthiness-compliance-engineer/core/airworthiness_core.py +894 -0
  27. package/roles/airworthiness-compliance-engineer/templates/compliance-matrix-template.md +46 -0
  28. package/roles/airworthiness-compliance-engineer/tests/test_airworthiness_core.py +224 -0
  29. package/roles/airworthiness-compliance-engineer/tests/test_role_airworthiness.py +85 -0
  30. package/roles/as9100-quality-auditor/ROLE.md +128 -0
  31. package/roles/as9100-quality-auditor/SOURCES.md +16 -0
  32. package/roles/as9100-quality-auditor/cli.py +136 -0
  33. package/roles/as9100-quality-auditor/core/as9100_core.py +857 -0
  34. package/roles/as9100-quality-auditor/templates/findings-report-template.md +119 -0
  35. package/roles/as9100-quality-auditor/tests/test_as9100_cli_profile.py +105 -0
  36. package/roles/as9100-quality-auditor/tests/test_as9100_core.py +204 -0
  37. package/roles/as9100-quality-auditor/tests/test_role_as9100.py +90 -0
  38. package/roles/data-bus-avionics-engineer/ROLE.md +146 -0
  39. package/roles/data-bus-avionics-engineer/SOURCES.md +23 -0
  40. package/roles/data-bus-avionics-engineer/cli.py +311 -0
  41. package/roles/data-bus-avionics-engineer/core/data_bus_avionics_core.py +1121 -0
  42. package/roles/data-bus-avionics-engineer/templates/bus-assessment-template.md +134 -0
  43. package/roles/data-bus-avionics-engineer/tests/test_bundle_protocol.py +137 -0
  44. package/roles/data-bus-avionics-engineer/tests/test_data_bus_avionics_core.py +261 -0
  45. package/roles/data-bus-avionics-engineer/tests/test_role_data_bus_avionics_engineer.py +121 -0
  46. package/roles/do160-environmental-engineer/ROLE.md +136 -0
  47. package/roles/do160-environmental-engineer/SOURCES.md +30 -0
  48. package/roles/do160-environmental-engineer/cli.py +147 -0
  49. package/roles/do160-environmental-engineer/core/do160_environmental_core.py +1246 -0
  50. package/roles/do160-environmental-engineer/templates/environmental-qualification-plan-template.md +114 -0
  51. package/roles/do160-environmental-engineer/tests/test_do160_environmental_core.py +312 -0
  52. package/roles/do160-environmental-engineer/tests/test_role_do160_environmental_engineer.py +281 -0
  53. package/roles/do178c-cert-engineer/ROLE.md +120 -0
  54. package/roles/do178c-cert-engineer/SOURCES.md +16 -0
  55. package/roles/do178c-cert-engineer/cli.py +129 -0
  56. package/roles/do178c-cert-engineer/core/do178c_core.py +411 -0
  57. package/roles/do178c-cert-engineer/templates/psac-template.md +74 -0
  58. package/roles/do178c-cert-engineer/tests/test_do178c_cert_engineer_core.py +91 -0
  59. package/roles/do178c-cert-engineer/tests/test_role_do178c.py +109 -0
  60. package/roles/do254-hardware-engineer/ROLE.md +127 -0
  61. package/roles/do254-hardware-engineer/SOURCES.md +19 -0
  62. package/roles/do254-hardware-engineer/cli.py +308 -0
  63. package/roles/do254-hardware-engineer/core/do254_hardware_core.py +761 -0
  64. package/roles/do254-hardware-engineer/templates/phac-template.md +87 -0
  65. package/roles/do254-hardware-engineer/tests/test_do254_bundle_profile.py +152 -0
  66. package/roles/do254-hardware-engineer/tests/test_do254_hardware_core.py +200 -0
  67. package/roles/do254-hardware-engineer/tests/test_role_do254_hardware.py +108 -0
  68. package/roles/engineering-analysis-engineer/ROLE.md +154 -0
  69. package/roles/engineering-analysis-engineer/SOURCES.md +15 -0
  70. package/roles/engineering-analysis-engineer/cli.py +151 -0
  71. package/roles/engineering-analysis-engineer/core/engineering_analysis_engineer_core.py +866 -0
  72. package/roles/engineering-analysis-engineer/templates/analysis-memo-template.md +73 -0
  73. package/roles/engineering-analysis-engineer/tests/test_engineering_analysis_engineer_core.py +367 -0
  74. package/roles/engineering-analysis-engineer/tests/test_role_engineering_analysis_engineer.py +113 -0
  75. package/roles/flight-management-engineer/ROLE.md +160 -0
  76. package/roles/flight-management-engineer/SOURCES.md +30 -0
  77. package/roles/flight-management-engineer/cli.py +258 -0
  78. package/roles/flight-management-engineer/core/flight_management_core.py +1473 -0
  79. package/roles/flight-management-engineer/templates/route-assessment-template.md +94 -0
  80. package/roles/flight-management-engineer/tests/test_flight_management_core.py +437 -0
  81. package/roles/flight-management-engineer/tests/test_role_flight_management_engineer.py +123 -0
  82. package/roles/flight-mechanics-engineer/ROLE.md +162 -0
  83. package/roles/flight-mechanics-engineer/SOURCES.md +51 -0
  84. package/roles/flight-mechanics-engineer/cli.py +149 -0
  85. package/roles/flight-mechanics-engineer/core/flight_mechanics_core.py +1507 -0
  86. package/roles/flight-mechanics-engineer/templates/perf-sc-report-template.md +82 -0
  87. package/roles/flight-mechanics-engineer/tests/test_flight_mechanics_core.py +277 -0
  88. package/roles/flight-mechanics-engineer/tests/test_role_flight_mechanics_engineer.py +141 -0
  89. package/roles/flight-test-engineer/ROLE.md +137 -0
  90. package/roles/flight-test-engineer/SOURCES.md +24 -0
  91. package/roles/flight-test-engineer/cli.py +135 -0
  92. package/roles/flight-test-engineer/core/flight_test_core.py +931 -0
  93. package/roles/flight-test-engineer/templates/flight-test-template.md +143 -0
  94. package/roles/flight-test-engineer/tests/test_flight_test_engineer_core.py +227 -0
  95. package/roles/flight-test-engineer/tests/test_role_flight_test_engineer.py +150 -0
  96. package/roles/flight-test-performance-engineer/ROLE.md +165 -0
  97. package/roles/flight-test-performance-engineer/SOURCES.md +20 -0
  98. package/roles/flight-test-performance-engineer/cli.py +319 -0
  99. package/roles/flight-test-performance-engineer/core/flight_test_performance_core.py +1398 -0
  100. package/roles/flight-test-performance-engineer/templates/performance-report-template.md +105 -0
  101. package/roles/flight-test-performance-engineer/tests/test_flight_test_performance_engineer_core.py +308 -0
  102. package/roles/flight-test-performance-engineer/tests/test_role_flight_test_performance_engineer.py +165 -0
  103. package/roles/gnc-engineer/ROLE.md +141 -0
  104. package/roles/gnc-engineer/SOURCES.md +35 -0
  105. package/roles/gnc-engineer/cli.py +141 -0
  106. package/roles/gnc-engineer/core/gnc_core.py +1074 -0
  107. package/roles/gnc-engineer/templates/gnc-report-template.md +105 -0
  108. package/roles/gnc-engineer/tests/test_gnc_engineer_core.py +238 -0
  109. package/roles/gnc-engineer/tests/test_role_gnc_engineer.py +142 -0
  110. package/roles/guidance-engineer/ROLE.md +156 -0
  111. package/roles/guidance-engineer/SOURCES.md +43 -0
  112. package/roles/guidance-engineer/cli.py +280 -0
  113. package/roles/guidance-engineer/core/guidance_core.py +820 -0
  114. package/roles/guidance-engineer/templates/guidance-report-template.md +70 -0
  115. package/roles/guidance-engineer/tests/test_guidance_engineer_core.py +269 -0
  116. package/roles/guidance-engineer/tests/test_role_guidance_engineer.py +146 -0
  117. package/roles/high-speed-aerodynamics-engineer/ROLE.md +161 -0
  118. package/roles/high-speed-aerodynamics-engineer/SOURCES.md +18 -0
  119. package/roles/high-speed-aerodynamics-engineer/cli.py +282 -0
  120. package/roles/high-speed-aerodynamics-engineer/core/high_speed_aero_core.py +1566 -0
  121. package/roles/high-speed-aerodynamics-engineer/templates/high-speed-memo-template.md +75 -0
  122. package/roles/high-speed-aerodynamics-engineer/tests/test_bundle_protocol.py +103 -0
  123. package/roles/high-speed-aerodynamics-engineer/tests/test_high_speed_aero_core.py +280 -0
  124. package/roles/high-speed-aerodynamics-engineer/tests/test_role_high_speed_aerodynamics.py +125 -0
  125. package/roles/ndt-engineer/ROLE.md +157 -0
  126. package/roles/ndt-engineer/SOURCES.md +18 -0
  127. package/roles/ndt-engineer/cli.py +316 -0
  128. package/roles/ndt-engineer/core/ndt_core.py +1590 -0
  129. package/roles/ndt-engineer/templates/ndt-plan-template.md +109 -0
  130. package/roles/ndt-engineer/tests/test_ndt_cli_bundle.py +183 -0
  131. package/roles/ndt-engineer/tests/test_ndt_core.py +437 -0
  132. package/roles/ndt-engineer/tests/test_role_ndt_engineer.py +148 -0
  133. package/roles/numerical-analysis-engineer/ROLE.md +158 -0
  134. package/roles/numerical-analysis-engineer/SOURCES.md +19 -0
  135. package/roles/numerical-analysis-engineer/cli.py +414 -0
  136. package/roles/numerical-analysis-engineer/core/numerical_analysis_core.py +1220 -0
  137. package/roles/numerical-analysis-engineer/templates/verification-memo-template.md +120 -0
  138. package/roles/numerical-analysis-engineer/tests/test_bundle_protocol.py +157 -0
  139. package/roles/numerical-analysis-engineer/tests/test_numerical_analysis_core.py +337 -0
  140. package/roles/numerical-analysis-engineer/tests/test_role_numerical_analysis_engineer.py +117 -0
  141. package/roles/propulsion-engineer/ROLE.md +163 -0
  142. package/roles/propulsion-engineer/SOURCES.md +15 -0
  143. package/roles/propulsion-engineer/cli.py +168 -0
  144. package/roles/propulsion-engineer/core/propulsion_core.py +1291 -0
  145. package/roles/propulsion-engineer/templates/propulsion-report-template.md +92 -0
  146. package/roles/propulsion-engineer/tests/test_propulsion_engineer_core.py +294 -0
  147. package/roles/propulsion-engineer/tests/test_role_propulsion_engineer.py +106 -0
  148. package/roles/space-systems-engineer/ROLE.md +161 -0
  149. package/roles/space-systems-engineer/SOURCES.md +49 -0
  150. package/roles/space-systems-engineer/cli.py +173 -0
  151. package/roles/space-systems-engineer/core/space_systems_core.py +980 -0
  152. package/roles/space-systems-engineer/templates/space-systems-template.md +88 -0
  153. package/roles/space-systems-engineer/tests/test_role_space_systems_engineer.py +117 -0
  154. package/roles/space-systems-engineer/tests/test_space_systems_engineer_core.py +247 -0
  155. package/roles/state-estimation-engineer/ROLE.md +154 -0
  156. package/roles/state-estimation-engineer/SOURCES.md +27 -0
  157. package/roles/state-estimation-engineer/cli.py +326 -0
  158. package/roles/state-estimation-engineer/core/state_estimation_core.py +958 -0
  159. package/roles/state-estimation-engineer/templates/nav-state-estimator-design-template.md +76 -0
  160. package/roles/state-estimation-engineer/tests/test_bundle_protocol.py +110 -0
  161. package/roles/state-estimation-engineer/tests/test_role_state_estimation_engineer.py +127 -0
  162. package/roles/state-estimation-engineer/tests/test_state_estimation_engineer_core.py +231 -0
  163. package/roles/structures-loads-engineer/ROLE.md +171 -0
  164. package/roles/structures-loads-engineer/SOURCES.md +44 -0
  165. package/roles/structures-loads-engineer/cli.py +219 -0
  166. package/roles/structures-loads-engineer/core/structures_loads_core.py +1112 -0
  167. package/roles/structures-loads-engineer/templates/loads-strength-report-template.md +96 -0
  168. package/roles/structures-loads-engineer/tests/test_bundle_protocol.py +101 -0
  169. package/roles/structures-loads-engineer/tests/test_role_structures_loads_engineer.py +147 -0
  170. package/roles/structures-loads-engineer/tests/test_structures_loads_core.py +261 -0
@@ -0,0 +1,119 @@
1
+ # AS9100 Internal Audit Findings Report
2
+
3
+ **Supplier:** AeroForge Precision Machining, LLC
4
+ **Audit date:** 2026-09-05
5
+ **Auditor:** M. Reyes (independent of area owner J. Torres: yes)
6
+ **Status:** draft-for-review
7
+
8
+ ## Audit plan
9
+
10
+ - Audit scope: CNC machining and production control (8.5.1), inspection and test (8.6), calibration control (7.1.5), nonconformance disposition (8.7), corrective action (10.2).
11
+ - Criteria: AS9100D clauses (6.1, 7.1.5, 8.1.2, 8.6, 8.7, 10.2), customer requirements flow-down, PO-7712.
12
+ - Audit team: M. Reyes (lead auditor).
13
+ - Process risk category: high; next audit due 2027-03-05 (risk-scaled 12-month base interval).
14
+ - Records sampled: 20 of 400 records sampled at 0.95 confidence (square-root rule).
15
+
16
+ ## Findings summary
17
+
18
+ - Major nonconformities: 2
19
+ - Minor nonconformities: 2
20
+ - Observations (opportunities for improvement): 1
21
+ - Total findings: 5
22
+ - AS9100D clauses cited: 10.2, 6.1, 7.1.5, 8.1.2, 8.7.
23
+
24
+ ## Findings report
25
+
26
+ ### Nonconformities
27
+
28
+ | NC ID | Clause | Classification | Objective evidence | Requirement |
29
+ |---|---|---|---|---|
30
+ | NC-01 | 8.7 | major | NCR-2214: bracket P/N BN-4470-2 (safety-critical, flight control linkage) dispositioned use-as-is by the supplier MRB; no customer waiver on file and the disposition record has no customer-approval entry. Twelve brackets of the same lot shipped under delivery DLV-3390. | Nonconforming output must be identified, segregated, and dispositioned by an authorized authority; use-as-is outside the original specification requires customer approval. |
31
+ | NC-02 | 10.2 | major | NCR-2210/2211/2214 record the same oversize-bore characteristic within six months. CAPA-118 was closed with effectiveness evidence restating the root cause rather than an observed result. | On nonconformity, the organization must react, evaluate the need for action to eliminate the cause so it does not recur, and verify the effectiveness of the action taken. |
32
+ | NC-03 | 7.1.5 | minor | Torque wrench TQ-009 in the assembly tool crib carried a calibration sticker due 2026-08-30; the crib sign-out log shows no issue after the sticker expiry date. | Monitoring and measuring resources must be calibrated or verified at defined intervals; suspect measurements must be assessed for validity. |
33
+ | NC-04 | 8.1.2 | minor | ECO-4821 (drawing BN-4470 rev A to rev B) approved 2026-08-10; the configuration baseline register entry for BN-4470 still shows rev A as of the audit date. No nonconforming product resulted. | Configuration management must establish and maintain a configuration baseline and control changes to it. |
34
+ | NC-05 | 6.1 | observation | The operational risk register is complete and current; mitigation actions for the coating process change are recorded but no residual RPN re-score follows the recorded reductions. | No violation found; the register meets clause 6.1. Re-scoring residual risk closes the mitigation loop demonstrated elsewhere in the QMS. |
35
+
36
+ ### Finding details
37
+
38
+ #### NC-01 - MAJOR (clause 8.7)
39
+
40
+ **Title:** Use-as-is disposition on a safety-critical part without customer approval
41
+ **Classification rationale:** severity impact 5 is 4-5, which is a major nonconformity.
42
+ **Objective evidence:** NCR-2214: bracket P/N BN-4470-2 (safety-critical, flight control linkage) dispositioned use-as-is by the supplier MRB; no customer waiver on file and the disposition record has no customer-approval entry. Twelve brackets of the same lot shipped under delivery DLV-3390.
43
+ **Requirement violated:** Nonconforming output must be identified, segregated, and dispositioned by an authorized authority; use-as-is outside the original specification requires customer approval.
44
+
45
+ Corrective-action record (closure chain status: effectiveness-pending):
46
+ - Containment: Quarantine the twelve shipped brackets of lot 2214B at the customer site; suspend MRB use-as-is disposition until the procedure is corrected.
47
+ - Root cause: The MRB disposition procedure has no customer-approval step for use-as-is > The procedure was written when the MRB handled non-aerospace parts only > Customer approval flow was never added when the aerospace order book opened > No checklist gate sits between the disposition decision and product release
48
+ - Corrective action: Revise the disposition procedure to require customer approval before any use-as-is release and add a release checklist gate; retrain the MRB board.
49
+ - Effectiveness evidence: pending - not yet recorded
50
+
51
+ #### NC-02 - MAJOR (clause 10.2)
52
+
53
+ **Title:** Recurring nonconformity with no root cause or effectiveness verification
54
+ **Classification rationale:** severity impact 3 with systemic spread, which escalates a minor to a major nonconformity.
55
+ **Objective evidence:** NCR-2210/2211/2214 record the same oversize-bore characteristic within six months. CAPA-118 was closed with effectiveness evidence restating the root cause rather than an observed result.
56
+ **Requirement violated:** On nonconformity, the organization must react, evaluate the need for action to eliminate the cause so it does not recur, and verify the effectiveness of the action taken.
57
+
58
+ Corrective-action record (closure chain status: effectiveness-pending):
59
+ - Containment: 100% bore inspection of the affected part numbers in stock and in work.
60
+ - Root cause: Tool wear compensation is not verified between operator shifts > The compensation check is a manual step with no scheduled trigger > The CNC program pauses at shift change but no measurement is required before restart
61
+ - Corrective action: Add an in-process bore measurement gate at every shift change, tied to the SPC record for the characteristic.
62
+ - Effectiveness evidence: pending - not yet recorded
63
+
64
+ #### NC-03 - MINOR (clause 7.1.5)
65
+
66
+ **Title:** Calibration sticker expired on a torque wrench in the tool crib
67
+ **Classification rationale:** severity impact 2 is 2-3 with no systemic spread, which is a minor nonconformity.
68
+ **Objective evidence:** Torque wrench TQ-009 in the assembly tool crib carried a calibration sticker due 2026-08-30; the crib sign-out log shows no issue after the sticker expiry date.
69
+ **Requirement violated:** Monitoring and measuring resources must be calibrated or verified at defined intervals; suspect measurements must be assessed for validity.
70
+
71
+ Corrective-action record (closure chain status: effectiveness-pending):
72
+ - Containment: Remove TQ-009 to calibration; verify the sign-out log to bound the period of possible use.
73
+ - Root cause: No recall alert fired when the interval expired > Calibration due dates are tracked on a paper log reviewed monthly > The monthly review ran two weeks late
74
+ - Corrective action: Move calibration due-date tracking to the shop system with an automatic recall alert at interval expiry.
75
+ - Effectiveness evidence: pending - not yet recorded
76
+
77
+ #### NC-04 - MINOR (clause 8.1.2)
78
+
79
+ **Title:** Configuration baseline register not updated for approved engineering change ECO-4821
80
+ **Classification rationale:** severity impact 3 is 2-3 with no systemic spread, which is a minor nonconformity.
81
+ **Objective evidence:** ECO-4821 (drawing BN-4470 rev A to rev B) approved 2026-08-10; the configuration baseline register entry for BN-4470 still shows rev A as of the audit date. No nonconforming product resulted.
82
+ **Requirement violated:** Configuration management must establish and maintain a configuration baseline and control changes to it.
83
+
84
+ Corrective-action record (closure chain status: effectiveness-pending):
85
+ - Containment: Update the baseline register for BN-4470 rev B; audit open ECOs against the register.
86
+ - Root cause: Baseline register updates are batched monthly > No trigger links ECO approval to the register update > The register owner has no change-approval notification
87
+ - Corrective action: Link ECO approval records to the baseline register so approved changes update the register at approval time.
88
+ - Effectiveness evidence: pending - not yet recorded
89
+
90
+ #### NC-05 - OBSERVATION (clause 6.1)
91
+
92
+ **Title:** Opportunity: risk register entries lack post-mitigation residual scoring
93
+ **Classification rationale:** severity impact 1 is an opportunity for improvement, reported as an observation.
94
+ **Objective evidence:** The operational risk register is complete and current; mitigation actions for the coating process change are recorded but no residual RPN re-score follows the recorded reductions.
95
+ **Requirement violated:** No violation found; the register meets clause 6.1. Re-scoring residual risk closes the mitigation loop demonstrated elsewhere in the QMS.
96
+
97
+ No corrective action required (observation, clause 6.1); improvement tracked separately.
98
+
99
+ ### Observations (no violation found, improvement note)
100
+
101
+ - NC-05 (clause 6.1): Opportunity: risk register entries lack post-mitigation residual scoring. The operational risk register is complete and current; mitigation actions for the coating process change are recorded but no residual RPN re-score follows the recorded reductions.
102
+
103
+ ### Corrective-action follow-up
104
+
105
+ | NC ID | Root cause | Containment | Corrective action | Verification | Status |
106
+ |---|---|---|---|---|---|
107
+ | NC-01 | use-as-is release without customer approval on safety-critical parts | Quarantine the twelve shipped brackets of lot 2214B at the customer site; suspend MRB use-as-is disposition until the procedure is corrected. | Revise the disposition procedure to require customer approval before any use-as-is release and add a release checklist gate; retrain the MRB board. | pending - effectiveness not yet verified | effectiveness-pending |
108
+ | NC-02 | oversize-bore recurrence from unverified tool-wear compensation at shift change | 100% bore inspection of the affected part numbers in stock and in work. | Add an in-process bore measurement gate at every shift change, tied to the SPC record for the characteristic. | pending - effectiveness not yet verified | effectiveness-pending |
109
+ | NC-03 | expired calibration sticker from a late monthly due-date review | Remove TQ-009 to calibration; verify the sign-out log to bound the period of possible use. | Move calibration due-date tracking to the shop system with an automatic recall alert at interval expiry. | pending - effectiveness not yet verified | effectiveness-pending |
110
+ | NC-04 | baseline register updated monthly instead of at ECO approval | Update the baseline register for BN-4470 rev B; audit open ECOs against the register. | Link ECO approval records to the baseline register so approved changes update the register at approval time. | pending - effectiveness not yet verified | effectiveness-pending |
111
+ | NC-05 | n/a - observation | n/a - observation | n/a - observation | n/a - observation | observation |
112
+
113
+ ## Closure
114
+
115
+ - Closure recommendation: PROPOSED - the QA manager signs audit closure; NC-01/02 effectiveness verification at the follow-up audit is required before any closure is recorded.
116
+ - No finding is recorded closed: closure requires the corrective action taken, the root cause statement and the effectiveness check all on file (verification gate).
117
+
118
+ ---
119
+ *DRAFT - audit evidence report generated by Aero Agent Roles as9100-quality-auditor core (2026-09-05) for human QA review. Not a certification, supplier-approval, or closure decision; the QA manager signs closure.*
@@ -0,0 +1,105 @@
1
+ #!/usr/bin/env python3
2
+ """CLI test: as9100-quality-auditor build --profile (PROFILE-SCHEMA.md v1).
3
+
4
+ Verifies the --profile path end-to-end through cli.py (offline, no
5
+ network): a program profile (audited supplier context) prepends the
6
+ '## Program context' header to the findings report and records
7
+ profile.customer in the evidence model.json, exactly like the
8
+ do178c-cert-engineer reference. Also checks the no-profile path is
9
+ unchanged and a malformed profile fails loudly with exit 1.
10
+ """
11
+ import json
12
+ import os
13
+ import shutil
14
+ import subprocess
15
+ import sys
16
+ import tempfile
17
+ import unittest
18
+
19
+ ROLE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
20
+ CLI = os.path.join(ROLE_DIR, "cli.py")
21
+ # repo root is 4 up from tests/ (tests -> role -> roles -> repo)
22
+ REPO_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(
23
+ os.path.dirname(os.path.abspath(__file__)))))
24
+ PROFILE = os.path.join(REPO_ROOT, "profiles", "example-airframer.json")
25
+ EXPECTED_CUSTOMER = "Example Airframers Ltd"
26
+
27
+
28
+ def run_build(outdir, extra_args=None):
29
+ args = [sys.executable, CLI, "build", "--out",
30
+ os.path.join(outdir, "report.md"), "--bundle"]
31
+ if extra_args:
32
+ args.extend(extra_args)
33
+ return subprocess.run(args, capture_output=True, text=True)
34
+
35
+
36
+ class TestAs9100CliProfile(unittest.TestCase):
37
+
38
+ def setUp(self):
39
+ self.tmp = tempfile.mkdtemp()
40
+ if not os.path.exists(PROFILE):
41
+ self.skipTest("profiles/example-airframer.json not present")
42
+
43
+ def tearDown(self):
44
+ shutil.rmtree(self.tmp, ignore_errors=True)
45
+
46
+ def _model(self):
47
+ return json.load(open(os.path.join(self.tmp, "evidence",
48
+ "model.json")))
49
+
50
+ def test_build_with_profile_exits_zero_header_first(self):
51
+ r = run_build(self.tmp, ["--profile", PROFILE])
52
+ self.assertEqual(r.returncode, 0, r.stderr[-500:])
53
+ md = open(os.path.join(self.tmp, "report.md")).read()
54
+ self.assertTrue(md.startswith("## Program context"),
55
+ "profile context header must lead the report")
56
+ self.assertIn("Customer: " + EXPECTED_CUSTOMER, md)
57
+ self.assertIn("profile: " + EXPECTED_CUSTOMER, r.stdout)
58
+
59
+ def test_model_json_records_profile_customer(self):
60
+ r = run_build(self.tmp, ["--profile", PROFILE])
61
+ self.assertEqual(r.returncode, 0)
62
+ m = self._model()
63
+ self.assertEqual(m["role"], "as9100-quality-auditor")
64
+ self.assertIn("profile", m)
65
+ self.assertEqual(m["profile"]["customer"], EXPECTED_CUSTOMER)
66
+ self.assertEqual(m["profile"]["basis"], "FAR-25")
67
+ self.assertEqual(m["profile"]["authority"], "FAA")
68
+ # profile tailors context; the report body is still the audit
69
+ self.assertEqual(m["status"], "draft-for-review")
70
+ self.assertTrue(m["supplier"])
71
+
72
+ def test_profiled_report_still_passes_gates(self):
73
+ r = run_build(self.tmp, ["--profile", PROFILE])
74
+ self.assertEqual(r.returncode, 0)
75
+ g = json.load(open(os.path.join(self.tmp, "evidence",
76
+ "gates.json")))
77
+ self.assertTrue(g["all_pass"])
78
+ self.assertEqual(g["exit_code"], 0)
79
+ # gate-check command also passes on the profiled markdown
80
+ c = subprocess.run(
81
+ [sys.executable, CLI, "check", "--file",
82
+ os.path.join(self.tmp, "report.md")],
83
+ capture_output=True, text=True)
84
+ self.assertEqual(c.returncode, 0, c.stdout)
85
+ self.assertIn("RESULT: PASS", c.stdout)
86
+
87
+ def test_no_profile_unchanged(self):
88
+ r = run_build(self.tmp)
89
+ self.assertEqual(r.returncode, 0, r.stderr[-500:])
90
+ md = open(os.path.join(self.tmp, "report.md")).read()
91
+ self.assertTrue(md.startswith("# AS9100 Internal Audit "
92
+ "Findings Report"))
93
+ self.assertNotIn("profile", self._model())
94
+
95
+ def test_malformed_profile_fails_loudly(self):
96
+ bad = os.path.join(self.tmp, "bad-profile.json")
97
+ with open(bad, "w") as f:
98
+ json.dump({"program": "no customer here"}, f)
99
+ r = run_build(self.tmp, ["--profile", bad])
100
+ self.assertEqual(r.returncode, 1)
101
+ self.assertIn("error: bad profile", r.stdout)
102
+
103
+
104
+ if __name__ == "__main__":
105
+ unittest.main()
@@ -0,0 +1,204 @@
1
+ #!/usr/bin/env python3
2
+ """Test as9100_core: the executable engine of the AS9100 auditor role.
3
+
4
+ Proves the role can DO its job standalone (no AeroSkills needed):
5
+ NC classification on the finding ladder, corrective action closure
6
+ chain scoring, audit program numbers (sample size, due date), findings
7
+ report generation, and evidence-gate checks.
8
+ """
9
+ import os
10
+ import sys
11
+ import unittest
12
+
13
+ sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "core"))
14
+ from as9100_core import (
15
+ AS9100D_SECTIONS, BASE_INTERVAL_MONTHS, CLAUSE_BY_ID,
16
+ NC_CLASSIFICATIONS, audit_due_date, audit_findings, audit_sample_size,
17
+ build_findings, check_findings, check_findings_markdown,
18
+ classify_nc, containment_ok, corrective_action_status,
19
+ effectiveness_evidence_ok, example_findings_markdown, example_item,
20
+ render_findings_markdown, root_cause_chain_ok,
21
+ )
22
+
23
+
24
+ class TestClassificationLadder(unittest.TestCase):
25
+
26
+ def test_high_severity_is_major(self):
27
+ self.assertEqual(classify_nc(4, False, False), "major")
28
+ self.assertEqual(classify_nc(5, False, False), "major")
29
+
30
+ def test_mid_severity_is_minor(self):
31
+ self.assertEqual(classify_nc(2, False, False), "minor")
32
+ self.assertEqual(classify_nc(3, False, False), "minor")
33
+
34
+ def test_systemic_escalates_minor_to_major(self):
35
+ self.assertEqual(classify_nc(2, True, False), "major")
36
+ self.assertEqual(classify_nc(3, True, False), "major")
37
+
38
+ def test_escaped_detection_escalates_to_major(self):
39
+ # Detection failure means containment of suspect output is
40
+ # required, which is a major regardless of severity.
41
+ self.assertEqual(classify_nc(1, False, True), "major")
42
+ self.assertEqual(classify_nc(2, False, True), "major")
43
+
44
+ def test_low_severity_is_observation(self):
45
+ self.assertEqual(classify_nc(1, False, False), "observation")
46
+
47
+ def test_severity_out_of_range_raises(self):
48
+ for bad in (0, 6, -1, 9):
49
+ with self.assertRaises(ValueError):
50
+ classify_nc(bad, False, False)
51
+
52
+
53
+ class TestCorrectiveActionChain(unittest.TestCase):
54
+
55
+ def test_closure_chain_stages(self):
56
+ record = {
57
+ "problem": "recurring defect",
58
+ "containment": "quarantine suspect lot",
59
+ "whys": ["cause a", "cause b", "cause c"],
60
+ "corrective_action": "update process control",
61
+ "effectiveness_evidence": "",
62
+ "root_cause_statement": "cause c",
63
+ }
64
+ self.assertEqual(corrective_action_status(record),
65
+ "effectiveness-pending")
66
+ record["effectiveness_evidence"] = "three clean lots observed"
67
+ self.assertEqual(corrective_action_status(record), "closed")
68
+
69
+ def test_circular_effectiveness_evidence_fails(self):
70
+ record = {
71
+ "problem": "recurring defect",
72
+ "containment": "quarantine",
73
+ "whys": ["a", "b", "c"],
74
+ "corrective_action": "update control",
75
+ "effectiveness_evidence": "cause c",
76
+ "root_cause_statement": "cause c",
77
+ }
78
+ self.assertFalse(effectiveness_evidence_ok(
79
+ record["effectiveness_evidence"],
80
+ record["root_cause_statement"]))
81
+ self.assertEqual(corrective_action_status(record),
82
+ "effectiveness-pending")
83
+
84
+ def test_chain_helpers(self):
85
+ self.assertTrue(containment_ok("quarantine"))
86
+ self.assertFalse(containment_ok("none"))
87
+ self.assertTrue(root_cause_chain_ok(["a", "b", "c"]))
88
+ self.assertFalse(root_cause_chain_ok(["a", "b"]))
89
+ self.assertFalse(root_cause_chain_ok(["a", "a", "a"]))
90
+
91
+
92
+ class TestAuditNumbers(unittest.TestCase):
93
+
94
+ def test_sample_size_at_confidence_anchors(self):
95
+ self.assertEqual(audit_sample_size(400, 0.95), 20)
96
+ self.assertEqual(audit_sample_size(400, 0.90), 16)
97
+ self.assertEqual(audit_sample_size(400, 0.99), 24)
98
+
99
+ def test_sample_size_validation(self):
100
+ with self.assertRaises(ValueError):
101
+ audit_sample_size(0)
102
+ with self.assertRaises(ValueError):
103
+ audit_sample_size(10, 0.4)
104
+
105
+ def test_audit_due_date_risk_scaling(self):
106
+ # 12-month base scaled by risk: high 0.5, low 1.5.
107
+ self.assertEqual(audit_due_date("2026-03-15", "high"), "2026-09-15")
108
+ self.assertEqual(audit_due_date("2026-03-15", "medium"), "2027-03-15")
109
+ self.assertEqual(audit_due_date("2026-03-15", "low"), "2027-09-15")
110
+
111
+ def test_audit_due_date_clamps_month_end(self):
112
+ self.assertEqual(audit_due_date("2026-01-31", "medium"), "2027-01-31")
113
+ self.assertEqual(audit_due_date("2024-01-31", "high"), "2024-07-31")
114
+
115
+
116
+ class TestFindingsBuilder(unittest.TestCase):
117
+
118
+ def test_example_audit_covers_all_classifications(self):
119
+ item = example_item()
120
+ model = audit_findings(item)
121
+ cls = {f["classification"] for f in model["findings"]}
122
+ self.assertTrue({"major", "minor", "observation"} <= cls)
123
+ self.assertGreaterEqual(model["counts"]["major"], 1)
124
+ self.assertGreaterEqual(model["counts"]["minor"], 1)
125
+ self.assertGreaterEqual(model["counts"]["observation"], 1)
126
+ self.assertEqual(model["counts"]["total"], len(item.issues))
127
+
128
+ def test_findings_model_complete(self):
129
+ model = audit_findings(example_item())
130
+ self.assertEqual(model["document_type"],
131
+ "AS9100 Internal Audit Findings Report")
132
+ self.assertIn("AS9100D", " ".join(model["audit"]["criteria"]))
133
+ for f in model["findings"]:
134
+ self.assertIn(f["clause"], CLAUSE_BY_ID)
135
+ self.assertIn(f["classification"], NC_CLASSIFICATIONS)
136
+ self.assertTrue(f["objective_evidence"])
137
+ self.assertTrue(f["requirement"])
138
+ if f["classification"] in ("major", "minor"):
139
+ ca = f["corrective_action"]
140
+ self.assertTrue(containment_ok(ca["containment"]))
141
+ self.assertTrue(root_cause_chain_ok(ca["whys"]))
142
+ self.assertTrue(ca["corrective_action"])
143
+ self.assertEqual(f["ca_status"], "effectiveness-pending")
144
+ else:
145
+ self.assertIsNone(f["corrective_action"])
146
+ self.assertEqual(f["ca_status"], "not-required")
147
+
148
+ def test_clause_ids_are_real(self):
149
+ # Example NCs cite only leaf-verified AS9100D clause ids.
150
+ model = audit_findings(example_item())
151
+ cited = {f["clause"] for f in model["findings"]}
152
+ self.assertTrue({"8.7", "10.2"} <= cited)
153
+ self.assertTrue(cited <= set(CLAUSE_BY_ID))
154
+ self.assertGreaterEqual(len(AS9100D_SECTIONS), 7) # sections 4-10
155
+
156
+ def test_example_numbers_match_formulas(self):
157
+ item = example_item()
158
+ model = audit_findings(item)
159
+ self.assertEqual(model["sampling"]["sample_size"],
160
+ audit_sample_size(item.record_population,
161
+ item.confidence_level))
162
+ self.assertEqual(model["sampling"]["sample_size"], 20)
163
+ self.assertEqual(model["audit"]["next_audit_due"],
164
+ audit_due_date(item.audit_date, item.process_risk))
165
+
166
+ def test_build_findings_matches_audit_findings(self):
167
+ item = example_item()
168
+ self.assertEqual(build_findings(item), audit_findings(item))
169
+
170
+
171
+ class TestGatesAndRender(unittest.TestCase):
172
+
173
+ def test_core_gates_all_pass(self):
174
+ model = audit_findings(example_item())
175
+ gates = check_findings(model)
176
+ self.assertTrue(gates["all_pass"], gates)
177
+
178
+ def test_markdown_gates_all_pass(self):
179
+ md = example_findings_markdown()
180
+ gates = check_findings_markdown(md)
181
+ self.assertTrue(gates["all_pass"], gates)
182
+
183
+ def test_render_has_no_blanks(self):
184
+ md = example_findings_markdown()
185
+ low = md.lower()
186
+ self.assertNotIn("___", md)
187
+ self.assertNotIn("| |", md)
188
+ self.assertNotIn("| - |", md)
189
+ self.assertIn("proposed", low)
190
+ self.assertIn("not a", low)
191
+
192
+ def test_standalone_no_skills_repo(self):
193
+ # Core must work with no AeroSkills present: set env to a bad path.
194
+ os.environ["AEROSKILLS_DEV"] = "/nonexistent"
195
+ item = example_item()
196
+ model = build_findings(item)
197
+ md = render_findings_markdown(model)
198
+ self.assertGreater(len(md), 1500)
199
+ self.assertTrue(check_findings(model)["all_pass"])
200
+ self.assertTrue(check_findings_markdown(md)["all_pass"])
201
+
202
+
203
+ if __name__ == "__main__":
204
+ unittest.main()
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/env python3
2
+ """Role test: AS9100 Quality / Internal Auditor.
3
+
4
+ Offline verification: bound skills resolve, workflow order, findings
5
+ template fields, boundaries, sources register.
6
+ """
7
+ import os
8
+ import unittest
9
+
10
+ ROLES_REPO = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(
11
+ os.path.abspath(__file__)))))
12
+ AEROSKILLS = os.environ.get("AEROSKILLS_DEV", os.path.expanduser("~/AeroSkills"))
13
+ # Bound-skill resolution requires the Aero Agent Skills checkout (cross-repo
14
+ # dev check); skip when absent so fresh public clones can still run make validate.
15
+ HAS_SKILLS = os.path.isdir(os.path.join(AEROSKILLS, "skills"))
16
+ ROLE_DIR = os.path.join(ROLES_REPO, "roles", "as9100-quality-auditor")
17
+ FINDINGS = os.path.join(ROLE_DIR, "templates", "findings-report-template.md")
18
+
19
+ EXPECTED_BOUND = [
20
+ "manufacturing-quality/as9100/internal-quality-audit",
21
+ "manufacturing-quality/as9100/document-control",
22
+ "manufacturing-quality/as9100/management-review",
23
+ "manufacturing-quality/as9100/nonconformance-control",
24
+ "manufacturing-quality/as9100/corrective-action",
25
+ "manufacturing-quality/as9100/risk-management",
26
+ "manufacturing-quality/as9100/supplier-control",
27
+ "manufacturing-quality/as9100/order-requirements-review",
28
+ "manufacturing-quality/as9100/calibration-control",
29
+ "manufacturing-quality/as9100/counterfeit-prevention",
30
+ "manufacturing-quality/as9100/fod-control",
31
+ "manufacturing-quality/as9100/quality",
32
+ "manufacturing-quality/as9102/first-article-inspection",
33
+ "manufacturing-quality/as9102/delta-fai",
34
+ "manufacturing-quality/as9102/fai-revalidation",
35
+ ]
36
+
37
+ STAGES = ["Audit planning", "Document control check", "Management review check",
38
+ "Risk + ops review", "Nonconformance + corrective action",
39
+ "Supplier + purchasing", "Calibration + counterfeit + FOD",
40
+ "FAI (AS9102)", "Findings + report"]
41
+
42
+
43
+ def role_text():
44
+ p = os.path.join(ROLE_DIR, "ROLE.md")
45
+ return open(p).read() if os.path.exists(p) else None
46
+
47
+
48
+ class TestAs9100Role(unittest.TestCase):
49
+
50
+ def test_bound_skills_resolve(self):
51
+ if not HAS_SKILLS:
52
+ self.skipTest("Aero Agent Skills checkout not present (cross-repo dev check)")
53
+ for leaf in EXPECTED_BOUND:
54
+ self.assertTrue(
55
+ os.path.exists(os.path.join(AEROSKILLS, "skills", leaf, "SKILL.md")),
56
+ f"bound skill missing: {leaf}")
57
+
58
+ def test_stages_ordered(self):
59
+ role = role_text()
60
+ self.assertIsNotNone(role)
61
+ idx = [role.find(s) for s in STAGES]
62
+ self.assertTrue(all(i >= 0 for i in idx))
63
+ self.assertEqual(idx, sorted(idx), "stage order not deterministic")
64
+
65
+ def test_findings_fields_present(self):
66
+ if not os.path.exists(FINDINGS):
67
+ self.fail("findings-report-template.md missing")
68
+ text = open(FINDINGS).read()
69
+ for field in ["NC ID", "Clause", "Classification", "Objective evidence",
70
+ "Root cause", "Corrective action", "Verification"]:
71
+ self.assertIn(field, text, f"field missing: {field}")
72
+ low = text.lower()
73
+ self.assertIn("proposed", low)
74
+ self.assertIn("not a", low)
75
+
76
+ def test_boundaries(self):
77
+ role = role_text()
78
+ self.assertIsNotNone(role)
79
+ for phrase in ["issue certification", "claim audit closure",
80
+ "recommend supplier approval", "sign_off_required: true"]:
81
+ self.assertIn(phrase, role)
82
+
83
+ def test_sources_register(self):
84
+ self.assertTrue(
85
+ os.path.exists(os.path.join(ROLE_DIR, "SOURCES.md")),
86
+ "SOURCES.md missing")
87
+
88
+
89
+ if __name__ == "__main__":
90
+ unittest.main()
@@ -0,0 +1,146 @@
1
+ ---
2
+ type: role
3
+ name: data-bus-avionics-engineer
4
+ title: "Data Bus / Avionics Network Engineer"
5
+ status: draft
6
+ domain: avionics
7
+ deliverable_type: "avionics data bus loading + protocol assessment"
8
+ standards_bound:
9
+ - id: arinc-429
10
+ tier: TIER-2
11
+ reference-only: true
12
+ - id: arinc-664
13
+ tier: TIER-2
14
+ reference-only: true
15
+ - id: mil-std-1553
16
+ tier: TIER-1
17
+ reference-only: false
18
+ skills_bound:
19
+ - avionics/data-bus/arinc429-protocol
20
+ - avionics/data-bus/arinc429-bus-loading
21
+ - avionics/data-bus/arinc664-afdx
22
+ - avionics/data-bus/mil-std-1553
23
+ - avionics/data-bus/mil-std-1553-bus-loading
24
+ tools_allowed: [stdlib, offline-file-processing]
25
+ forbidden:
26
+ - "issue bus architecture sign-off"
27
+ - "claim network qualification approval"
28
+ - "assert a loading margin without the computed budget"
29
+ - "reproduce proprietary ARINC standard text"
30
+ sign_off_required: true
31
+ license: Apache-2.0
32
+ compatibility: "agentskills.io ROLE.md; any SKILL.md host"
33
+ metadata:
34
+ version: 0.1.0
35
+ author: ashfordeOU
36
+ skills_release: "v1.3.0+"
37
+ ---
38
+
39
+ # Data Bus / Avionics Network Engineer
40
+
41
+ ## Role identity
42
+
43
+ This role is the avionics data bus / network engineer for an aircraft
44
+ program: it decodes ARINC 429 and MIL-STD-1553 words, budgets ARINC 429
45
+ label-rate transmit schedules, computes MIL-STD-1553 bus-controller
46
+ minor-frame loading, sizes ARINC 664 AFDX virtual links, and assembles
47
+ the evidence that bus loading and protocol conformance gates are met.
48
+ Use when a project must verify a data bus architecture against loading
49
+ guidelines (ARINC 429 36 bit-times per word against the 80% design
50
+ guideline; MIL-STD-1553 schedule time over the minor frame against the
51
+ 80% budget; AFDX VL bandwidth against the 100 Mbps link). Do NOT use for
52
+ generic Ethernet networking (non-avionics), for the RF/antenna side of
53
+ avionics, or when no bus architecture or ICD exists.
54
+
55
+ ## Deliverable contract
56
+
57
+ The role produces:
58
+ 1. **Avionics Data Bus Loading and Protocol Assessment** — per the
59
+ filled `templates/bus-assessment-template.md`: the bus architecture
60
+ inventory, ARINC 429 per-line loading (word rate, bus load, %
61
+ utilization, capacity and design-guideline verdicts, headroom), the
62
+ MIL-STD-1553 BC minor-frame loading (wire words, schedule time, %
63
+ utilization, budget headroom), the AFDX VL bandwidth budget (BAG,
64
+ frame, bandwidth, link utilization, latency and jitter margins), and
65
+ the received-word protocol conformance checks.
66
+ 2. **Findings / observations** — buses over or near the design
67
+ guidelines, VL sets over the link budget, conformance mismatches.
68
+ 3. **Evidence bundle** — `evidence/{model,gates,provenance}.json`
69
+ (docs/PROTOCOL.md) so any harness can consume the computed numbers.
70
+
71
+ ## Workflow (stages → bound skills)
72
+
73
+ | Stage | Loads skill | Produces |
74
+ |---|---|---|
75
+ | 1. Architecture inventory | data-bus/arinc429-protocol, data-bus/mil-std-1553 | bus list: TX lines, BC/RT schedule, AFDX VLs |
76
+ | 2. ARINC 429 decode review | data-bus/arinc429-protocol | word decode of received traffic: label, SDI, SSM, parity, BNR/BCD |
77
+ | 3. ARINC 429 bus loading | data-bus/arinc429-bus-loading | per-line total word rate, load bps, % utilization, headroom |
78
+ | 4. MIL-STD-1553 word review | data-bus/mil-std-1553 | command/status/data decode + message classification |
79
+ | 5. MIL-STD-1553 bus loading | data-bus/mil-std-1553-bus-loading | BC minor-frame wire words, schedule time, % utilization |
80
+ | 6. AFDX bandwidth check | data-bus/arinc664-afdx | VL bandwidth from BAG/frame, link budget, latency/jitter margins |
81
+ | 7. Conformance gate | all five leaves | parity/label/classification checks vs ICD expectations |
82
+ | 8. Assessment package | arinc429-bus-loading + arinc664-afdx | filled deliverable + findings + evidence bundle |
83
+
84
+ ## Evidence gates
85
+
86
+ - Stage 3 done = every ARINC 429 line has a computed utilization % and a
87
+ verdict against the 80% guideline.
88
+ - Stage 5 done = the BC minor-frame schedule has wire-word counts, total
89
+ schedule time, and % utilization with budget headroom.
90
+ - Stage 6 done = every AFDX VL has BAG-consistent bandwidth and the VL
91
+ set fits the 100 Mbps link (or the overrun is a recorded finding).
92
+ - Stage 7 done = received words decode with parity OK and match the ICD
93
+ label/classification expectation.
94
+ - FINAL = every computed number in the deliverable comes from the bound
95
+ leaf formulas (36 bit-times/word, 24 us/1553 wire word, frame x 8 / BAG)
96
+ and is present in the evidence model.
97
+
98
+ ## Boundary / forbidden
99
+
100
+ - NEVER issue bus architecture sign-off or claim network qualification
101
+ approval — the program's systems/data-bus sign-off chain signs.
102
+ - NEVER assert a loading margin without the computed budget behind it
103
+ (the core computes it; the doc quotes it).
104
+ - NEVER reproduce ARINC 429 / ARINC 664 / MIL-STD-1553 standard text —
105
+ summaries and original structures only.
106
+ - Output is a DRAFT for human review — mark it draft.
107
+
108
+ ## Verification
109
+
110
+ The role runs STANDALONE: `core/data_bus_avionics_core.py` is an
111
+ executable engine that decodes ARINC 429 and MIL-STD-1553 words,
112
+ computes ARINC 429 bus load %, MIL-STD-1553 bus load %, AFDX VL
113
+ bandwidth, BUILDS the assessment, and gate-checks deliverables. No
114
+ AeroSkills checkout required.
115
+
116
+ Run the role:
117
+ ```bash
118
+ python3 cli.py build --out assessment.md # example item
119
+ python3 cli.py build --bundle --out assessment.md # + evidence bundle
120
+ python3 cli.py build --profile <program>.json # customer tailoring
121
+ python3 cli.py check --file assessment.md # gate-check
122
+ ```
123
+
124
+ Tests:
125
+ - tests/test_data_bus_avionics_core.py: domain rules with real computed
126
+ anchors (ARINC 429 word 1611876616 decodes to label 010/SDI 1/data
127
+ 1234; 1553 command word 93316; AFDX VL 4 ms/1518 -> 3.036 Mbps; 30 VLs
128
+ at 4 ms/1518 = 91.08% of the link) + builder + gates + standalone
129
+ (no skills repo)
130
+ - tests/test_role_data_bus_avionics_engineer.py: bound-skill resolution
131
+ (skips if the skills repo is absent) + workflow + template present +
132
+ boundaries
133
+ - tests/test_bundle_protocol.py: --bundle emits valid evidence; when the
134
+ skills library is present the five bound leaf logic modules dispatch
135
+ and agree with the core within 1e-6
136
+
137
+ Bound skills in Aero Agent Skills deepen individual stages when the
138
+ library is present (word decode, BNR/BCD coding, schedule budgets, AFDX
139
+ sizing); the core engine does not depend on them.
140
+
141
+ ## Compliance
142
+
143
+ - arinc-429 / arinc-664 TIER-2 reference-only, mil-std-1553 TIER-1
144
+ public domain, per standards-map; no verbatim anywhere.
145
+ - SOURCES.md records acquisition/extraction/verification status.
146
+ - Author: ashfordeOU (roles wave R1).