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,154 @@
1
+ ---
2
+ type: role
3
+ name: engineering-analysis-engineer
4
+ title: "Engineering Analysis and Data Engineer"
5
+ status: draft
6
+ domain: cross-cutting
7
+ deliverable_type: "analysis verification + engineering report"
8
+ standards_bound:
9
+ - id: asme-y14-5
10
+ tier: TIER-2
11
+ reference-only: true
12
+ skills_bound:
13
+ - cross-cutting/units-atmos/isa-atmosphere
14
+ - cross-cutting/units-atmos/density-altitude
15
+ - cross-cutting/units-atmos/airspeed-conversion
16
+ - cross-cutting/units-atmos/unit-conversion
17
+ - cross-cutting/units-atmos/dimensional-analysis
18
+ - cross-cutting/units-atmos/temperature-conversion
19
+ - cross-cutting/numerics/finite-difference-derivatives
20
+ - cross-cutting/numerics/numerical-integration
21
+ - cross-cutting/numerics/ode-solvers
22
+ - cross-cutting/numerics/root-finding
23
+ - cross-cutting/numerics/interpolation
24
+ - cross-cutting/numerics/least-squares-regression
25
+ - cross-cutting/numerics/optimization-algorithms
26
+ - cross-cutting/numerics/eigenvalue-decomposition
27
+ - cross-cutting/numerics/singular-value-decomposition
28
+ - cross-cutting/numerics/matrix-operations
29
+ - cross-cutting/numerics/complex-number-algebra
30
+ - cross-cutting/numerics/quaternion-algebra
31
+ - cross-cutting/numerics/fast-fourier-transform
32
+ - cross-cutting/numerics/fir-filter-design
33
+ - cross-cutting/numerics/digital-filter-design
34
+ - cross-cutting/numerics/power-spectral-density
35
+ - cross-cutting/numerics/uncertainty-propagation
36
+ - cross-cutting/numerics/monte-carlo-sampling
37
+ - cross-cutting/numerics/probability-distributions
38
+ - cross-cutting/numerics/confidence-interval-estimation
39
+ - cross-cutting/numerics/hypothesis-testing
40
+ - cross-cutting/numerics/descriptive-statistics
41
+ - cross-cutting/numerics/cross-correlation-analysis
42
+ - cross-cutting/numerics/information-entropy
43
+ - cross-cutting/numerics/convergence-verification
44
+ - cross-cutting/numerics/grubbs-outlier-test
45
+ - cross-cutting/numerics/runs-test
46
+ - cross-cutting/numerics/rank-based-hypothesis-testing
47
+ - cross-cutting/tolerancing/gdandt-basics
48
+ - cross-cutting/tolerancing/datum-reference-frames
49
+ - cross-cutting/tolerancing/position-tolerance-calc
50
+ - cross-cutting/tolerancing/tolerance-stackup
51
+ - cross-cutting/documentation/engineering-report
52
+ - cross-cutting/documentation/engineering-margins
53
+ - cross-cutting/data-sources/aeronautical-data-sources
54
+ - cross-cutting/export-control/export-control-awareness
55
+ tools_allowed: [stdlib, offline-file-processing]
56
+ forbidden:
57
+ - "issue engineering approval"
58
+ - "declare compliance"
59
+ - "reproduce proprietary standard text"
60
+ sign_off_required: true
61
+ license: Apache-2.0
62
+ compatibility: "agentskills.io ROLE.md; any SKILL.md host"
63
+ metadata:
64
+ version: 0.1.0
65
+ author: Aero Agent Roles
66
+ skills_release: "v1.3.0+"
67
+ ---
68
+
69
+ # Engineering Analysis and Data Engineer
70
+
71
+ ## Role identity
72
+
73
+ Owns the cross-cutting analysis layer every aerospace deliverable
74
+ depends on: unit/atmosphere discipline, numerical methods with
75
+ verification, statistical treatment of data, tolerance analysis, and
76
+ the engineering-report/margin conventions that make results
77
+ auditable. Use when a calculation, dataset, or report needs to be
78
+ correct, verifiable, and presented with margins. Do NOT use for
79
+ domain-specific design (use the domain roles).
80
+
81
+ ## Deliverable contract
82
+
83
+ 1. **Analysis verification memo** - numerical convergence/verification,
84
+ unit consistency, uncertainty/statistics treatment, tolerance result,
85
+ and the engineering report with margins.
86
+
87
+ ## Workflow (stages -> bound skills)
88
+
89
+ | Stage | Loads skill | Produces |
90
+ |---|---|---|
91
+ | 1. Unit/atmosphere | isa-atmosphere + density-altitude + airspeed-conversion + unit-conversion + dimensional-analysis + temperature-conversion | consistent units, ISA conditions |
92
+ | 2. Numerics | finite-difference-derivatives + numerical-integration + ode-solvers + root-finding + interpolation | validated numerical result |
93
+ | 3. Regression/opt | least-squares-regression + optimization-algorithms | fitted/optimized result |
94
+ | 4. Linear algebra | eigenvalue-decomposition + singular-value-decomposition + matrix-operations + complex-number-algebra + quaternion-algebra | matrix/rotation results |
95
+ | 5. Signal | fast-fourier-transform + fir-filter-design + digital-filter-design + power-spectral-density + cross-correlation-analysis | signal analysis |
96
+ | 6. Uncertainty | uncertainty-propagation + monte-carlo-sampling + probability-distributions + confidence-interval-estimation | uncertainty bands |
97
+ | 7. Statistics | hypothesis-testing + descriptive-statistics + grubbs-outlier-test + runs-test + rank-based-hypothesis-testing + information-entropy | statistical verdicts |
98
+ | 8. Convergence | convergence-verification | mesh/step convergence evidence |
99
+ | 9. Tolerancing | gdandt-basics + datum-reference-frames + position-tolerance-calc + tolerance-stackup | tolerance stack result |
100
+ | 10. Data sourcing | aeronautical-data-sources | sourced data with citation |
101
+ | 11. Export control | export-control-awareness | classification of output |
102
+ | 12. Report | engineering-report + engineering-margins | the analysis memo |
103
+
104
+ ## Evidence gates
105
+
106
+ - Stage 1 done = every quantity unit-consistent with the ISA basis
107
+ stated.
108
+ - Stage 8 done = convergence/verification evidence accompanies any
109
+ numerical result.
110
+ - Stage 12 done = margins stated per engineering-margins convention;
111
+ report follows the report standard.
112
+
113
+ ## Boundary / forbidden
114
+
115
+ - NEVER issue engineering approval or declare compliance.
116
+ - The memo is analysis support; design release is a human decision.
117
+ - Export-control awareness is applied; no controlled data is included.
118
+
119
+ ## Verification
120
+
121
+ The role runs STANDALONE: `core/engineering_analysis_engineer_core.py` is an
122
+ executable engine that computes ISA atmosphere reference values, propagates
123
+ measurement uncertainty (GUM first-order law), builds Student t confidence
124
+ intervals, runs worst-case + RSS tolerance stack-ups, verifies numerical
125
+ convergence (Richardson extrapolation + GCI), states margins per the
126
+ engineering-margins convention, BUILDS the Analysis Verification Memo, and
127
+ gate-checks deliverables. No AeroSkills checkout required
128
+ (`AEROSKILLS_DEV=/nonexistent` still builds correctly).
129
+
130
+ Run the role:
131
+ ```bash
132
+ python3 cli.py build --out memo.md # example chain
133
+ python3 cli.py build --altitude 6000 --out memo.md # other test point
134
+ python3 cli.py build --pressure 70100 --temperature 270.5 # override inputs
135
+ python3 cli.py check --file memo.md # gate-check a memo
136
+ ```
137
+
138
+ Tests:
139
+ - tests/test_engineering_analysis_engineer_core.py (36 tests): ISA model,
140
+ uncertainty propagation, t confidence intervals, tolerance stack-up,
141
+ convergence verification, margins, memo builder, gates, standalone
142
+ (no skills repo), and the filled template byte-matches the core example.
143
+ - tests/test_role_engineering_analysis_engineer.py: bound-skill resolution
144
+ (skips if the skills repo is absent) + workflow + template present +
145
+ boundaries.
146
+
147
+ Bound skills in Aero Agent Skills deepen individual stages when the library
148
+ is present (atmosphere leaves, uncertainty/statistics leaves, tolerance and
149
+ numerics leaves); the core engine does not depend on them.
150
+
151
+ ## Compliance
152
+
153
+ - asme-y14-5 TIER-2 reference-only (GD&T). References summary-not-copy.
154
+ - SOURCES.md records standards referenced.
@@ -0,0 +1,15 @@
1
+ # SOURCES.md - Engineering Analysis and Data Engineer
2
+
3
+ | Source | Role use | Gated |
4
+ |---|---|---|
5
+ | ASME Y14.5 | GD&T conventions (dimensioning/tolerancing basis for stacks) | true |
6
+ | ISO 2533 / ICAO Doc 7488 | Standard atmosphere: ISA constants and lapse model (sea level 288.15 K / 101325 Pa / 1.225 kg/m3, 6.5 K/km to 11 km) | false |
7
+ | JCGM 100:2008 (GUM) | Measurement uncertainty: first-order law u_c = sqrt(sum((df/dx_i * u_i)^2)), coverage factor k, expanded uncertainty | false |
8
+ | JCGM 101 (GUM Supp. 1) | Monte Carlo uncertainty evaluation context (bound leaf monte-carlo-sampling) | false |
9
+ | Student t distribution (standard statistics) | Small-sample confidence intervals: xbar +/- t_{1-alpha/2, n-1} * s/sqrt(n) | false |
10
+ | Richardson extrapolation / GCI (AIAA V&V practice) | Numerical convergence verification: observed order p, grid convergence index, Fs = 1.25 | false |
11
+ | MIL-STD-810 / DO-160 (context) | Data context where applicable | true |
12
+
13
+ Summary-not-copy per STANDARDS.md: public standards (ISO 2533, JCGM 100)
14
+ are used as common-knowledge method summaries, never reproduced verbatim;
15
+ ASME Y14.5 and MIL-STD-810 / DO-160 are reference-only.
@@ -0,0 +1,151 @@
1
+ #!/usr/bin/env python3
2
+ """cli.py - run the Engineering Analysis and Data Engineer role.
3
+
4
+ Usage:
5
+ python3 cli.py build [--out <file.md>] [--altitude 3000] [--pressure 70050]
6
+ [--pressure-unc 35] [--temperature 271]
7
+ [--temperature-unc 1.2] [--bundle]
8
+ # build the Analysis Verification Memo for the example
9
+ # measurement chain (overrides optional)
10
+ # --bundle also emit evidence/{model,gates,provenance}.json
11
+ # (docs/PROTOCOL.md v1)
12
+ python3 cli.py check --file <file.md> # gate-check an existing memo
13
+
14
+ The role ENGINE (core/engineering_analysis_engineer_core.py) does the work
15
+ standalone; bound skills in Aero Agent Skills deepen individual stages
16
+ when present.
17
+ """
18
+ import argparse
19
+ import os
20
+ import sys
21
+
22
+ sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)),
23
+ "core"))
24
+ sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)),
25
+ "..", "..", "scripts"))
26
+ import engineering_analysis_engineer_core as core # noqa: E402
27
+ import evidence # noqa: E402
28
+
29
+ ROLE_SLUG = "engineering-analysis-engineer"
30
+
31
+
32
+ def cmd_build(args):
33
+ chain = core.example_chain()
34
+ if args.altitude is not None:
35
+ chain.altitude_m = args.altitude
36
+ if args.pressure is not None:
37
+ chain.pressure_pa = args.pressure
38
+ if args.pressure_unc is not None:
39
+ chain.pressure_unc_pa = args.pressure_unc
40
+ if args.temperature is not None:
41
+ chain.temperature_k = args.temperature
42
+ if args.temperature_unc is not None:
43
+ chain.temperature_unc_k = args.temperature_unc
44
+ model = core.build_memo(chain)
45
+ md = core.render_memo_markdown(model)
46
+
47
+ # program profile (customer tailoring): load + apply context header
48
+ profile = None
49
+ try:
50
+ profile = evidence.load_profile(args.profile)
51
+ except ValueError as e:
52
+ print(f"error: bad profile: {e}")
53
+ return 1
54
+ if profile:
55
+ model["profile"] = {
56
+ "customer": profile.get("customer"),
57
+ "program": profile.get("program"),
58
+ "basis": profile.get("basis"),
59
+ "authority": profile.get("authority"),
60
+ "der": profile.get("der"),
61
+ "document_prefix": profile.get("document_prefix"),
62
+ "revision": profile.get("revision"),
63
+ }
64
+ md = evidence.profile_header_block(profile) + md
65
+
66
+ gates = core.check_memo(model)
67
+ if args.out:
68
+ with open(args.out, "w") as f:
69
+ f.write(md)
70
+ print(f"built Analysis Verification Memo -> {args.out}")
71
+ print(f"density {model['density_kgm3']:.6g} +/- "
72
+ f"{model['expanded_U']:.6g} kg/m3; "
73
+ f"gates: all_pass={gates['all_pass']}")
74
+ if profile:
75
+ print(f"profile: {profile.get('customer')} / "
76
+ f"{profile.get('program')}")
77
+ if args.bundle:
78
+ prov = {
79
+ "role": ROLE_SLUG,
80
+ "core": {
81
+ "file": "core/engineering_analysis_engineer_core.py",
82
+ "functions": ["isa_reference_values",
83
+ "combined_standard_uncertainty",
84
+ "confidence_interval_mean",
85
+ "rss_total", "convergence_verdict",
86
+ "density_altitude_m", "margin_of_safety"],
87
+ "version": "0.1.0",
88
+ },
89
+ "skills": [],
90
+ "cross_checked": False,
91
+ "disclaimer": "DRAFT for human review. Not an approval "
92
+ "document.",
93
+ }
94
+ paths = evidence.write_bundle(
95
+ args.out, ROLE_SLUG,
96
+ "Analysis Verification Memo", model, gates, prov)
97
+ print("bundle: model=%s" % paths["model"])
98
+ print(" gates=%s" % paths["gates"])
99
+ print(" provenance=%s" % paths["provenance"])
100
+ else:
101
+ print(md)
102
+ return 0 if gates["all_pass"] else 1
103
+
104
+
105
+ def cmd_check(args):
106
+ if not os.path.exists(args.file):
107
+ print(f"file not found: {args.file}")
108
+ return 1
109
+ md = open(args.file).read()
110
+ gates = core.check_memo_markdown(md)
111
+ for name, ok in gates.items():
112
+ if name != "all_pass":
113
+ print(f"{'PASS' if ok else 'FAIL'} {name}")
114
+ print(f"RESULT: {'PASS' if gates['all_pass'] else 'FAIL'}")
115
+ return 0 if gates["all_pass"] else 1
116
+
117
+
118
+ def main():
119
+ p = argparse.ArgumentParser(
120
+ description="Engineering Analysis and Data Engineer role")
121
+ sub = p.add_subparsers(dest="cmd", required=True)
122
+
123
+ b = sub.add_parser("build")
124
+ b.add_argument("--out", default="", help="output file (default: stdout)")
125
+ b.add_argument("--altitude", type=float, default=None,
126
+ help="test point geometric altitude in m")
127
+ b.add_argument("--pressure", type=float, default=None,
128
+ help="measured static pressure in Pa")
129
+ b.add_argument("--pressure-unc", type=float, default=None,
130
+ help="static pressure 1-sigma uncertainty in Pa")
131
+ b.add_argument("--temperature", type=float, default=None,
132
+ help="measured temperature in K")
133
+ b.add_argument("--temperature-unc", type=float, default=None,
134
+ help="temperature 1-sigma uncertainty in K")
135
+ b.add_argument("--bundle", action="store_true",
136
+ help="emit evidence/{model,gates,provenance}.json")
137
+ b.add_argument("--profile", default="",
138
+ help="program profile JSON (customer tailoring, "
139
+ "docs/PROFILE-SCHEMA.md)")
140
+ b.set_defaults(fn=cmd_build)
141
+
142
+ c = sub.add_parser("check")
143
+ c.add_argument("--file", required=True, help="memo markdown file")
144
+ c.set_defaults(fn=cmd_check)
145
+
146
+ args = p.parse_args()
147
+ sys.exit(args.fn(args))
148
+
149
+
150
+ if __name__ == "__main__":
151
+ main()