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.
- package/NOTICE +18 -0
- package/README.md +49 -0
- package/bin/aero-agent-roles.js +127 -0
- package/lib/catalog.js +97 -0
- package/lib/install.js +48 -0
- package/lib/mcp.js +199 -0
- package/manifest.json +516 -0
- package/package.json +44 -0
- package/roles/aerodynamics-engineer/ROLE.md +153 -0
- package/roles/aerodynamics-engineer/SOURCES.md +12 -0
- package/roles/aerodynamics-engineer/cli.py +143 -0
- package/roles/aerodynamics-engineer/core/aerodynamics_core.py +1218 -0
- package/roles/aerodynamics-engineer/templates/aero-design-report-template.md +72 -0
- package/roles/aerodynamics-engineer/tests/test_aerodynamics_core.py +227 -0
- package/roles/aerodynamics-engineer/tests/test_role_aerodynamics.py +94 -0
- package/roles/aircraft-design-engineer/ROLE.md +138 -0
- package/roles/aircraft-design-engineer/SOURCES.md +12 -0
- package/roles/aircraft-design-engineer/cli.py +152 -0
- package/roles/aircraft-design-engineer/core/aircraft_design_core.py +1278 -0
- package/roles/aircraft-design-engineer/templates/concept-design-template.md +99 -0
- package/roles/aircraft-design-engineer/tests/test_aircraft_design_core.py +269 -0
- package/roles/aircraft-design-engineer/tests/test_role_aircraft_design_engineer.py +106 -0
- package/roles/airworthiness-compliance-engineer/ROLE.md +122 -0
- package/roles/airworthiness-compliance-engineer/SOURCES.md +16 -0
- package/roles/airworthiness-compliance-engineer/cli.py +146 -0
- package/roles/airworthiness-compliance-engineer/core/airworthiness_core.py +894 -0
- package/roles/airworthiness-compliance-engineer/templates/compliance-matrix-template.md +46 -0
- package/roles/airworthiness-compliance-engineer/tests/test_airworthiness_core.py +224 -0
- package/roles/airworthiness-compliance-engineer/tests/test_role_airworthiness.py +85 -0
- package/roles/as9100-quality-auditor/ROLE.md +128 -0
- package/roles/as9100-quality-auditor/SOURCES.md +16 -0
- package/roles/as9100-quality-auditor/cli.py +136 -0
- package/roles/as9100-quality-auditor/core/as9100_core.py +857 -0
- package/roles/as9100-quality-auditor/templates/findings-report-template.md +119 -0
- package/roles/as9100-quality-auditor/tests/test_as9100_cli_profile.py +105 -0
- package/roles/as9100-quality-auditor/tests/test_as9100_core.py +204 -0
- package/roles/as9100-quality-auditor/tests/test_role_as9100.py +90 -0
- package/roles/data-bus-avionics-engineer/ROLE.md +146 -0
- package/roles/data-bus-avionics-engineer/SOURCES.md +23 -0
- package/roles/data-bus-avionics-engineer/cli.py +311 -0
- package/roles/data-bus-avionics-engineer/core/data_bus_avionics_core.py +1121 -0
- package/roles/data-bus-avionics-engineer/templates/bus-assessment-template.md +134 -0
- package/roles/data-bus-avionics-engineer/tests/test_bundle_protocol.py +137 -0
- package/roles/data-bus-avionics-engineer/tests/test_data_bus_avionics_core.py +261 -0
- package/roles/data-bus-avionics-engineer/tests/test_role_data_bus_avionics_engineer.py +121 -0
- package/roles/do160-environmental-engineer/ROLE.md +136 -0
- package/roles/do160-environmental-engineer/SOURCES.md +30 -0
- package/roles/do160-environmental-engineer/cli.py +147 -0
- package/roles/do160-environmental-engineer/core/do160_environmental_core.py +1246 -0
- package/roles/do160-environmental-engineer/templates/environmental-qualification-plan-template.md +114 -0
- package/roles/do160-environmental-engineer/tests/test_do160_environmental_core.py +312 -0
- package/roles/do160-environmental-engineer/tests/test_role_do160_environmental_engineer.py +281 -0
- package/roles/do178c-cert-engineer/ROLE.md +120 -0
- package/roles/do178c-cert-engineer/SOURCES.md +16 -0
- package/roles/do178c-cert-engineer/cli.py +129 -0
- package/roles/do178c-cert-engineer/core/do178c_core.py +411 -0
- package/roles/do178c-cert-engineer/templates/psac-template.md +74 -0
- package/roles/do178c-cert-engineer/tests/test_do178c_cert_engineer_core.py +91 -0
- package/roles/do178c-cert-engineer/tests/test_role_do178c.py +109 -0
- package/roles/do254-hardware-engineer/ROLE.md +127 -0
- package/roles/do254-hardware-engineer/SOURCES.md +19 -0
- package/roles/do254-hardware-engineer/cli.py +308 -0
- package/roles/do254-hardware-engineer/core/do254_hardware_core.py +761 -0
- package/roles/do254-hardware-engineer/templates/phac-template.md +87 -0
- package/roles/do254-hardware-engineer/tests/test_do254_bundle_profile.py +152 -0
- package/roles/do254-hardware-engineer/tests/test_do254_hardware_core.py +200 -0
- package/roles/do254-hardware-engineer/tests/test_role_do254_hardware.py +108 -0
- package/roles/engineering-analysis-engineer/ROLE.md +154 -0
- package/roles/engineering-analysis-engineer/SOURCES.md +15 -0
- package/roles/engineering-analysis-engineer/cli.py +151 -0
- package/roles/engineering-analysis-engineer/core/engineering_analysis_engineer_core.py +866 -0
- package/roles/engineering-analysis-engineer/templates/analysis-memo-template.md +73 -0
- package/roles/engineering-analysis-engineer/tests/test_engineering_analysis_engineer_core.py +367 -0
- package/roles/engineering-analysis-engineer/tests/test_role_engineering_analysis_engineer.py +113 -0
- package/roles/flight-management-engineer/ROLE.md +160 -0
- package/roles/flight-management-engineer/SOURCES.md +30 -0
- package/roles/flight-management-engineer/cli.py +258 -0
- package/roles/flight-management-engineer/core/flight_management_core.py +1473 -0
- package/roles/flight-management-engineer/templates/route-assessment-template.md +94 -0
- package/roles/flight-management-engineer/tests/test_flight_management_core.py +437 -0
- package/roles/flight-management-engineer/tests/test_role_flight_management_engineer.py +123 -0
- package/roles/flight-mechanics-engineer/ROLE.md +162 -0
- package/roles/flight-mechanics-engineer/SOURCES.md +51 -0
- package/roles/flight-mechanics-engineer/cli.py +149 -0
- package/roles/flight-mechanics-engineer/core/flight_mechanics_core.py +1507 -0
- package/roles/flight-mechanics-engineer/templates/perf-sc-report-template.md +82 -0
- package/roles/flight-mechanics-engineer/tests/test_flight_mechanics_core.py +277 -0
- package/roles/flight-mechanics-engineer/tests/test_role_flight_mechanics_engineer.py +141 -0
- package/roles/flight-test-engineer/ROLE.md +137 -0
- package/roles/flight-test-engineer/SOURCES.md +24 -0
- package/roles/flight-test-engineer/cli.py +135 -0
- package/roles/flight-test-engineer/core/flight_test_core.py +931 -0
- package/roles/flight-test-engineer/templates/flight-test-template.md +143 -0
- package/roles/flight-test-engineer/tests/test_flight_test_engineer_core.py +227 -0
- package/roles/flight-test-engineer/tests/test_role_flight_test_engineer.py +150 -0
- package/roles/flight-test-performance-engineer/ROLE.md +165 -0
- package/roles/flight-test-performance-engineer/SOURCES.md +20 -0
- package/roles/flight-test-performance-engineer/cli.py +319 -0
- package/roles/flight-test-performance-engineer/core/flight_test_performance_core.py +1398 -0
- package/roles/flight-test-performance-engineer/templates/performance-report-template.md +105 -0
- package/roles/flight-test-performance-engineer/tests/test_flight_test_performance_engineer_core.py +308 -0
- package/roles/flight-test-performance-engineer/tests/test_role_flight_test_performance_engineer.py +165 -0
- package/roles/gnc-engineer/ROLE.md +141 -0
- package/roles/gnc-engineer/SOURCES.md +35 -0
- package/roles/gnc-engineer/cli.py +141 -0
- package/roles/gnc-engineer/core/gnc_core.py +1074 -0
- package/roles/gnc-engineer/templates/gnc-report-template.md +105 -0
- package/roles/gnc-engineer/tests/test_gnc_engineer_core.py +238 -0
- package/roles/gnc-engineer/tests/test_role_gnc_engineer.py +142 -0
- package/roles/guidance-engineer/ROLE.md +156 -0
- package/roles/guidance-engineer/SOURCES.md +43 -0
- package/roles/guidance-engineer/cli.py +280 -0
- package/roles/guidance-engineer/core/guidance_core.py +820 -0
- package/roles/guidance-engineer/templates/guidance-report-template.md +70 -0
- package/roles/guidance-engineer/tests/test_guidance_engineer_core.py +269 -0
- package/roles/guidance-engineer/tests/test_role_guidance_engineer.py +146 -0
- package/roles/high-speed-aerodynamics-engineer/ROLE.md +161 -0
- package/roles/high-speed-aerodynamics-engineer/SOURCES.md +18 -0
- package/roles/high-speed-aerodynamics-engineer/cli.py +282 -0
- package/roles/high-speed-aerodynamics-engineer/core/high_speed_aero_core.py +1566 -0
- package/roles/high-speed-aerodynamics-engineer/templates/high-speed-memo-template.md +75 -0
- package/roles/high-speed-aerodynamics-engineer/tests/test_bundle_protocol.py +103 -0
- package/roles/high-speed-aerodynamics-engineer/tests/test_high_speed_aero_core.py +280 -0
- package/roles/high-speed-aerodynamics-engineer/tests/test_role_high_speed_aerodynamics.py +125 -0
- package/roles/ndt-engineer/ROLE.md +157 -0
- package/roles/ndt-engineer/SOURCES.md +18 -0
- package/roles/ndt-engineer/cli.py +316 -0
- package/roles/ndt-engineer/core/ndt_core.py +1590 -0
- package/roles/ndt-engineer/templates/ndt-plan-template.md +109 -0
- package/roles/ndt-engineer/tests/test_ndt_cli_bundle.py +183 -0
- package/roles/ndt-engineer/tests/test_ndt_core.py +437 -0
- package/roles/ndt-engineer/tests/test_role_ndt_engineer.py +148 -0
- package/roles/numerical-analysis-engineer/ROLE.md +158 -0
- package/roles/numerical-analysis-engineer/SOURCES.md +19 -0
- package/roles/numerical-analysis-engineer/cli.py +414 -0
- package/roles/numerical-analysis-engineer/core/numerical_analysis_core.py +1220 -0
- package/roles/numerical-analysis-engineer/templates/verification-memo-template.md +120 -0
- package/roles/numerical-analysis-engineer/tests/test_bundle_protocol.py +157 -0
- package/roles/numerical-analysis-engineer/tests/test_numerical_analysis_core.py +337 -0
- package/roles/numerical-analysis-engineer/tests/test_role_numerical_analysis_engineer.py +117 -0
- package/roles/propulsion-engineer/ROLE.md +163 -0
- package/roles/propulsion-engineer/SOURCES.md +15 -0
- package/roles/propulsion-engineer/cli.py +168 -0
- package/roles/propulsion-engineer/core/propulsion_core.py +1291 -0
- package/roles/propulsion-engineer/templates/propulsion-report-template.md +92 -0
- package/roles/propulsion-engineer/tests/test_propulsion_engineer_core.py +294 -0
- package/roles/propulsion-engineer/tests/test_role_propulsion_engineer.py +106 -0
- package/roles/space-systems-engineer/ROLE.md +161 -0
- package/roles/space-systems-engineer/SOURCES.md +49 -0
- package/roles/space-systems-engineer/cli.py +173 -0
- package/roles/space-systems-engineer/core/space_systems_core.py +980 -0
- package/roles/space-systems-engineer/templates/space-systems-template.md +88 -0
- package/roles/space-systems-engineer/tests/test_role_space_systems_engineer.py +117 -0
- package/roles/space-systems-engineer/tests/test_space_systems_engineer_core.py +247 -0
- package/roles/state-estimation-engineer/ROLE.md +154 -0
- package/roles/state-estimation-engineer/SOURCES.md +27 -0
- package/roles/state-estimation-engineer/cli.py +326 -0
- package/roles/state-estimation-engineer/core/state_estimation_core.py +958 -0
- package/roles/state-estimation-engineer/templates/nav-state-estimator-design-template.md +76 -0
- package/roles/state-estimation-engineer/tests/test_bundle_protocol.py +110 -0
- package/roles/state-estimation-engineer/tests/test_role_state_estimation_engineer.py +127 -0
- package/roles/state-estimation-engineer/tests/test_state_estimation_engineer_core.py +231 -0
- package/roles/structures-loads-engineer/ROLE.md +171 -0
- package/roles/structures-loads-engineer/SOURCES.md +44 -0
- package/roles/structures-loads-engineer/cli.py +219 -0
- package/roles/structures-loads-engineer/core/structures_loads_core.py +1112 -0
- package/roles/structures-loads-engineer/templates/loads-strength-report-template.md +96 -0
- package/roles/structures-loads-engineer/tests/test_bundle_protocol.py +101 -0
- package/roles/structures-loads-engineer/tests/test_role_structures_loads_engineer.py +147 -0
- 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()
|