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,162 @@
1
+ ---
2
+ type: role
3
+ name: flight-mechanics-engineer
4
+ title: "Flight Mechanics Engineer"
5
+ status: draft
6
+ domain: flight-mechanics
7
+ deliverable_type: "performance + stability and control analysis report"
8
+ standards_bound:
9
+ - id: far-25
10
+ tier: TIER-1
11
+ reference-only: false
12
+ - id: mil-std-1797a
13
+ tier: TIER-1
14
+ reference-only: false
15
+ skills_bound:
16
+ - flight-mechanics/performance/breguet-range
17
+ - flight-mechanics/performance/breguet-endurance
18
+ - flight-mechanics/performance/specific-range
19
+ - flight-mechanics/performance/climb-performance
20
+ - flight-mechanics/performance/descent-performance
21
+ - flight-mechanics/performance/glide-performance
22
+ - flight-mechanics/performance/takeoff-performance
23
+ - flight-mechanics/performance/landing-performance
24
+ - flight-mechanics/performance/turn-performance
25
+ - flight-mechanics/performance/thrust-required
26
+ - flight-mechanics/performance/oei-climb-gradient
27
+ - flight-mechanics/performance/energy-height
28
+ - flight-mechanics/performance/speed-stability
29
+ - flight-mechanics/performance/wind-effects
30
+ - flight-mechanics/performance/windshear-analysis
31
+ - flight-mechanics/performance/rotorcraft-hover-performance
32
+ - flight-mechanics/performance/rotorcraft-forward-flight-performance
33
+ - flight-mechanics/performance/rotorcraft-blade-element-hover-performance
34
+ - flight-mechanics/performance/rotorcraft-autorotative-descent
35
+ - flight-mechanics/performance/rotorcraft-tail-rotor-sizing
36
+ - flight-mechanics/performance/rotorcraft-vertical-climb-performance
37
+ - flight-mechanics/stability-control/longitudinal-stability
38
+ - flight-mechanics/stability-control/lateral-directional-stability
39
+ - flight-mechanics/stability-control/dynamic-stability
40
+ - flight-mechanics/stability-control/short-period-mode-analysis
41
+ - flight-mechanics/stability-control/phugoid-mode-analysis
42
+ - flight-mechanics/stability-control/trim-analysis
43
+ - flight-mechanics/stability-control/stability-derivatives-avl
44
+ - flight-mechanics/stability-control/control-surface-effectiveness
45
+ - flight-mechanics/stability-control/aileron-reversal
46
+ - flight-mechanics/stability-control/deep-stall-analysis
47
+ - flight-mechanics/stability-control/spin-recovery
48
+ - flight-mechanics/handling-qualities/cooper-harper-rating
49
+ - flight-mechanics/handling-qualities/mil-std-1797a
50
+ - flight-mechanics/handling-qualities/pilot-induced-oscillation
51
+ - flight-mechanics/handling-qualities/pitch-bandwidth-criteria
52
+ - flight-mechanics/flight-dynamics-sim/point-mass-trajectory
53
+ - flight-mechanics/flight-dynamics-sim/six-dof-simulation
54
+ tools_allowed: [stdlib, offline-file-processing, avl-cli, jsbsim-cli]
55
+ forbidden:
56
+ - "claim certification approval"
57
+ - "declare a compliance finding"
58
+ - "reproduce proprietary standard text"
59
+ sign_off_required: true
60
+ license: Apache-2.0
61
+ compatibility: "agentskills.io ROLE.md; any SKILL.md host"
62
+ metadata:
63
+ version: 0.1.0
64
+ author: Aero Agent Roles
65
+ skills_release: "v1.3.0+"
66
+ ---
67
+
68
+ # Flight Mechanics Engineer
69
+
70
+ ## Role identity
71
+
72
+ Owns aircraft performance and stability/control analysis: range,
73
+ endurance, climb, takeoff/landing, turn, OEI gradients, static/dynamic
74
+ stability, mode characteristics, handling qualities, and trajectory
75
+ simulation (fixed-wing and rotorcraft). Use when a vehicle must show it
76
+ can meet performance requirements and behave acceptably across the
77
+ envelope. Do NOT use for control LAW design (GNC role), aero shape
78
+ (aero role), or loads (structures role).
79
+
80
+ ## Deliverable contract
81
+
82
+ 1. **Performance + S&C report** - mission performance numbers, stability
83
+ derivatives, mode characteristics, handling qualities assessment,
84
+ trim conditions, and trajectory results. The worked example
85
+ (templates/perf-sc-report-template.md) is the complete generated
86
+ deliverable for the example transport: range, endurance, ROC,
87
+ takeoff/landing field, static margin, and short-period/phugoid/Dutch
88
+ roll mode numbers all computed from real domain rules with their
89
+ input basis stated.
90
+ 2. **Analysis evidence set** - the calculations, derivative builds, and
91
+ simulation runs behind the results (per-section equations and input
92
+ basis in the report; open items name the deeper bound-skill stages).
93
+
94
+ ## Workflow (stages -> bound skills)
95
+
96
+ | Stage | Loads skill | Produces |
97
+ |---|---|---|
98
+ | 1. Range/endurance | breguet-range + breguet-endurance + specific-range | range/endurance vs payload |
99
+ | 2. Mission performance | climb-performance + descent-performance + glide-performance + takeoff-performance + landing-performance + turn-performance + thrust-required | segment performance |
100
+ | 3. Safety performance | oei-climb-gradient + energy-height + speed-stability + wind-effects + windshear-analysis | OEI/climb margins |
101
+ | 4. Rotorcraft performance | rotorcraft-hover-performance + rotorcraft-forward-flight-performance + rotorcraft-blade-element-hover-performance + rotorcraft-autorotative-descent + rotorcraft-tail-rotor-sizing + rotorcraft-vertical-climb-performance | rotorcraft numbers |
102
+ | 5. Static stability | longitudinal-stability + lateral-directional-stability + trim-analysis + stability-derivatives-avl | static margins, derivatives |
103
+ | 6. Dynamic stability | dynamic-stability + short-period-mode-analysis + phugoid-mode-analysis | mode frequencies/damping |
104
+ | 7. Control effectiveness | control-surface-effectiveness + aileron-reversal + deep-stall-analysis + spin-recovery | control checks |
105
+ | 8. Handling qualities | cooper-harper-rating + mil-std-1797a + pilot-induced-oscillation + pitch-bandwidth-criteria | HQR assessment |
106
+ | 9. Simulation | point-mass-trajectory + six-dof-simulation | trajectory/6DOF runs |
107
+ | 10. Report | (all above) | the performance + S&C report |
108
+
109
+ ## Evidence gates
110
+
111
+ - Stage 1 done = range/endurance with the Breguet assumptions stated.
112
+ - Stage 6 done = short-period/phugoid damping within MIL-STD/FAR
113
+ context or with a stated rationale.
114
+ - FINAL = every result has a stated input basis (mass, CG, altitude);
115
+ the computed numbers are present (range, ROC, takeoff field, static
116
+ margin, mode damping) and the document is marked draft, not approval.
117
+ The core `check_*` functions verify all of this on the deliverable.
118
+
119
+ ## Boundary / forbidden
120
+
121
+ - NEVER claim certification approval or compliance findings.
122
+ - Handling qualities conclusions are assessments (HQR scale), not
123
+ certification findings.
124
+ - Derivatives come from AVL or stated data; never invent stability data
125
+ without a source.
126
+ - The rendered deliverable ALWAYS carries the DRAFT + human-review +
127
+ not-an-approval marker (enforced by the core renderer and gate checks).
128
+
129
+ ## Verification
130
+
131
+ The role runs STANDALONE: `core/flight_mechanics_core.py` is an
132
+ executable engine that encodes the domain rules from the bound
133
+ flight-mechanics leaves (Breguet range/endurance, specific range,
134
+ ROC/time-to-climb, takeoff/landing field estimates, static margin and
135
+ neutral point, short period / phugoid / Dutch roll / spiral / roll
136
+ modes, MIL-STD-1797A summary level bands), computes the example
137
+ transport numbers, BUILDS the report, and gate-checks deliverables.
138
+ No AeroSkills checkout required (`AEROSKILLS_DEV=/nonexistent` works).
139
+
140
+ Run the role:
141
+ ```bash
142
+ python3 cli.py build --out perf-sc-report.md # build the example report
143
+ python3 cli.py check --file perf-sc-report.md # gate-check a report
144
+ ```
145
+
146
+ Tests:
147
+ - tests/test_flight_mechanics_core.py (34 tests): domain rules +
148
+ builder + gates + standalone (no skills repo)
149
+ - tests/test_role_flight_mechanics_engineer.py: bound-skill resolution
150
+ (skips if the skills repo is absent) + workflow + filled template +
151
+ boundaries + core/cli presence
152
+
153
+ Bound skills in Aero Agent Skills deepen individual stages when the
154
+ library is present (per the workflow table); the core engine does not
155
+ depend on them.
156
+
157
+ ## Compliance
158
+
159
+ - far-25 + mil-std-1797a TIER-1 context (quotable with citation);
160
+ standards-map summary only, no verbatim regulation text.
161
+ - SOURCES.md records the standards and the bound leaves whose rules the
162
+ core encodes.
@@ -0,0 +1,51 @@
1
+ # SOURCES.md - Flight Mechanics Engineer
2
+
3
+ Summary-not-copy per STANDARDS.md. The core (core/flight_mechanics_core.py)
4
+ encodes the equations of the bound AeroSkills leaves below (paraphrase of
5
+ common flight-mechanics practice); every number in the generated report
6
+ traces to one of these rules or to the stated example input basis.
7
+
8
+ ## Standards / regulations referenced (context, quotable with citation)
9
+
10
+ | Source | Role use | Gated |
11
+ |---|---|---|
12
+ | 14 CFR Part 25 (FAR/CS 25.121, 25.125, 25.181) | minimum climb gradients; landing field length factor; dynamic stability context | true (gradients, landing factor, heavy-damping context) |
13
+ | MIL-STD-1797A | flying qualities levels, mode criteria tables (summary paraphrase) | true (level bands used by the gates) |
14
+ | MIL-F-8785C style level-1 bands (as summarized by the short-period leaf) | short-period damping/frequency bands | true |
15
+ | ISA atmosphere (public standard model) | density/temperature/speed of sound at altitude | false |
16
+
17
+ ## Bound AeroSkills leaves whose rules the core encodes
18
+
19
+ | Leaf (rule the core encodes) | Role use | Gated |
20
+ |---|---|---|
21
+ | flight-mechanics/performance/breguet-range | R = (V/(TSFC*g))*(L/D)*ln(m0/m1) | true |
22
+ | flight-mechanics/performance/breguet-endurance | jet loiter endurance | true |
23
+ | flight-mechanics/performance/specific-range | SAR = V*(L/D)/(TSFC*W) | false |
24
+ | flight-mechanics/performance/climb-performance | ROC=(T-D)V/W; gradient; time to climb; service ceiling | true |
25
+ | flight-mechanics/performance/takeoff-performance | Vs, V_LOF=1.2*Vs, ground roll | true |
26
+ | flight-mechanics/performance/landing-performance | Vref=1.3*Vs, air distance, ground roll, 1.67 factor | true |
27
+ | flight-mechanics/performance/glide-performance | glide ratio/angle/sink | false |
28
+ | flight-mechanics/performance/turn-performance | n=1/cos(phi), rate, radius | false |
29
+ | flight-mechanics/performance/oei-climb-gradient | T_oei derate; FAR 25.121 gradients | true |
30
+ | flight-mechanics/performance/energy-height | h_e, kinetic height, Ps | false |
31
+ | flight-mechanics/performance/wind-effects | wind triangle/groundspeed | false |
32
+ | flight-mechanics/stability-control/longitudinal-stability | neutral point, static margin | true |
33
+ | flight-mechanics/stability-control/dynamic-stability | short period/phugoid/lateral mode formulas, criteria | true |
34
+ | flight-mechanics/stability-control/short-period-mode-analysis | SP frequency/damping, level bands | true |
35
+ | flight-mechanics/stability-control/phugoid-mode-analysis | Lanchester phugoid characteristics | true |
36
+ | flight-mechanics/stability-control/lateral-directional-stability | fin/dihedral derivative build, DR/roll/spiral | true |
37
+ | flight-mechanics/stability-control/trim-analysis | CL_trim, elevator to trim | false |
38
+ | flight-mechanics/handling-qualities/mil-std-1797a | category/class/level mode criteria tables | true |
39
+ | flight-mechanics/handling-qualities/cooper-harper-rating | HQR decision tree (flight-test campaign) | false |
40
+
41
+ ## Reference books (method context for the derivative builds)
42
+
43
+ | Source | Role use | Gated |
44
+ |---|---|---|
45
+ | Stevens & Lewis, Aircraft Control and Simulation | dynamics/derivative conventions | false |
46
+ | Roskam, Airplane Flight Dynamics | S&C methods, class-range derivative data | false |
47
+
48
+ Example-configuration data (mass, geometry, thrust, polar, derivative
49
+ coefficients) are stated per-run inputs in the class range of a 150-seat
50
+ twin-engine transport and are flagged in the report as open items pending
51
+ project data and the AVL derivative build.
@@ -0,0 +1,149 @@
1
+ #!/usr/bin/env python3
2
+ """cli.py - run the Flight Mechanics Engineer role.
3
+
4
+ Usage:
5
+ python3 cli.py build [--out <file.md>] [--bundle] [--profile <file.json>]
6
+ # build the Performance + S&C report for the example transport
7
+ # --bundle also emit evidence/{model,gates,provenance}.json (PROTOCOL.md)
8
+ # --profile program profile JSON for customer tailoring
9
+ # (docs/PROFILE-SCHEMA.md) -> prepended context header
10
+ python3 cli.py check --file <file.md> # gate-check an existing report
11
+
12
+ The role ENGINE (core/flight_mechanics_core.py) does the work standalone
13
+ (real domain rules -> real numbers); bound flight-mechanics skills in Aero
14
+ Agent Skills deepen individual stages when present.
15
+ """
16
+ import argparse
17
+ import dataclasses
18
+ import os
19
+ import sys
20
+
21
+ sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)),
22
+ "core"))
23
+ sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)),
24
+ "..", "..", "scripts"))
25
+ import flight_mechanics_core as core # noqa: E402
26
+ import evidence # noqa: E402
27
+
28
+ ROLE_SLUG = "flight-mechanics-engineer"
29
+
30
+
31
+ def _jsonable(obj):
32
+ """Recursively convert the content model to plain JSON types.
33
+
34
+ The model embeds the ExampleTransport configuration dataclass inside
35
+ results['aircraft']; the evidence bundle (PROTOCOL.md v1) requires
36
+ plain JSON that round-trips, so dataclass instances become dicts.
37
+ """
38
+ if dataclasses.is_dataclass(obj) and not isinstance(obj, type):
39
+ return _jsonable(dataclasses.asdict(obj))
40
+ if isinstance(obj, dict):
41
+ return {k: _jsonable(v) for k, v in obj.items()}
42
+ if isinstance(obj, (list, tuple)):
43
+ return [_jsonable(v) for v in obj]
44
+ return obj
45
+
46
+
47
+ def _provenance():
48
+ """Provenance for the bundle: role core, no skill dispatch in this
49
+ role yet (core ran standalone), same honesty boundary as the report."""
50
+ return {
51
+ "role": ROLE_SLUG,
52
+ "core": {
53
+ "file": "core/flight_mechanics_core.py",
54
+ "functions": ["analyze_vehicle", "build_report",
55
+ "check_report", "render_report_markdown"],
56
+ "version": "0.1.0",
57
+ },
58
+ "skills": [],
59
+ "cross_checked": False,
60
+ "disclaimer": "DRAFT for human review. Not an approval document.",
61
+ }
62
+
63
+
64
+ def cmd_build(args):
65
+ results = core.analyze_vehicle(core.example_vehicle())
66
+ model = core.build_report(core.example_vehicle(), results)
67
+ md = core.render_report_markdown(model)
68
+
69
+ # program profile (customer tailoring): load + apply context header
70
+ profile = None
71
+ try:
72
+ profile = evidence.load_profile(args.profile)
73
+ except ValueError as e:
74
+ print(f"error: bad profile: {e}")
75
+ return 1
76
+ if profile:
77
+ model["profile"] = {
78
+ "customer": profile.get("customer"),
79
+ "program": profile.get("program"),
80
+ "basis": profile.get("basis"),
81
+ "authority": profile.get("authority"),
82
+ "der": profile.get("der"),
83
+ "document_prefix": profile.get("document_prefix"),
84
+ "revision": profile.get("revision"),
85
+ }
86
+ md = evidence.profile_header_block(profile) + md
87
+
88
+ gates = core.check_report(results)
89
+ if args.out:
90
+ with open(args.out, "w") as f:
91
+ f.write(md)
92
+ print(f"built Performance + S&C report for {model['aircraft']} "
93
+ f"-> {args.out}")
94
+ if profile:
95
+ print(f"profile: {profile.get('customer')} / "
96
+ f"{profile.get('program')}")
97
+ print(f"gates: all_pass={gates['all_pass']} {gates}")
98
+ if args.bundle:
99
+ paths = evidence.write_bundle(
100
+ args.out, ROLE_SLUG, "Performance and S&C Analysis Report",
101
+ _jsonable(model), gates, _provenance())
102
+ print(f"bundle: model={paths['model']}")
103
+ print(f" gates={paths['gates']}")
104
+ print(f" provenance={paths['provenance']}")
105
+ else:
106
+ print(md)
107
+ return 0 if gates["all_pass"] else 1
108
+
109
+
110
+ def cmd_check(args):
111
+ if not os.path.exists(args.file):
112
+ print(f"file not found: {args.file}")
113
+ return 1
114
+ md = open(args.file).read()
115
+ gates = core.check_report_markdown(md)
116
+ for name, ok in gates.items():
117
+ if name != "all_pass":
118
+ print(f"{'PASS' if ok else 'FAIL'} {name}")
119
+ print(f"RESULT: {'PASS' if gates['all_pass'] else 'FAIL'}")
120
+ return 0 if gates["all_pass"] else 1
121
+
122
+
123
+ def main():
124
+ p = argparse.ArgumentParser(
125
+ description="Flight Mechanics Engineer role: performance + S&C "
126
+ "analysis report")
127
+ sub = p.add_subparsers(dest="cmd", required=True)
128
+
129
+ b = sub.add_parser("build")
130
+ b.add_argument("--out", default="",
131
+ help="output file (default: stdout)")
132
+ b.add_argument("--bundle", action="store_true",
133
+ help="emit evidence/{model,gates,provenance}.json")
134
+ b.add_argument("--profile", default="",
135
+ help="program profile JSON (customer tailoring, "
136
+ "docs/PROFILE-SCHEMA.md)")
137
+ b.set_defaults(fn=cmd_build)
138
+
139
+ c = sub.add_parser("check")
140
+ c.add_argument("--file", required=True,
141
+ help="Performance + S&C report markdown to gate-check")
142
+ c.set_defaults(fn=cmd_check)
143
+
144
+ args = p.parse_args()
145
+ sys.exit(args.fn(args))
146
+
147
+
148
+ if __name__ == "__main__":
149
+ main()