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,141 @@
1
+ ---
2
+ type: role
3
+ name: gnc-engineer
4
+ title: "Guidance, Navigation and Control (GNC) Engineer"
5
+ status: draft
6
+ domain: gnc-autonomy
7
+ deliverable_type: "control design + guidance/navigation analysis report"
8
+ standards_bound:
9
+ - id: mil-std-1797a
10
+ tier: TIER-1
11
+ reference-only: false
12
+ skills_bound:
13
+ - gnc-autonomy/control/pid-control-design
14
+ - gnc-autonomy/control/lead-lag-compensation
15
+ - gnc-autonomy/control/frequency-response-design
16
+ - gnc-autonomy/control/digital-control-design
17
+ - gnc-autonomy/control/observer-design
18
+ - gnc-autonomy/control/control-allocation
19
+ - gnc-autonomy/control/gain-scheduling
20
+ - gnc-autonomy/control/adaptive-control
21
+ - gnc-autonomy/navigation/navigation-frames
22
+ - gnc-autonomy/navigation/inertial-navigation
23
+ - gnc-autonomy/navigation/kalman-filter-design
24
+ - gnc-autonomy/navigation/gnss-pseudorange-positioning
25
+ - gnc-autonomy/navigation/gnss-raim-fde
26
+ - gnc-autonomy/navigation/dilution-of-precision
27
+ - gnc-autonomy/guidance/pursuit-guidance
28
+ - gnc-autonomy/optimal-control/lqr-design
29
+ - gnc-autonomy/optimal-control/model-predictive-control
30
+ - gnc-autonomy/optimal-control/bang-bang-control
31
+ - gnc-autonomy/optimal-control/dymos-trajectory
32
+ - gnc-autonomy/space/attitude-dynamics
33
+ - gnc-autonomy/space/orbit-dynamics
34
+ - gnc-autonomy/space/orbit-determination
35
+ - gnc-autonomy/space/rendezvous-phasing
36
+ tools_allowed: [stdlib, offline-file-processing]
37
+ forbidden:
38
+ - "claim certification approval"
39
+ - "release flight software"
40
+ - "reproduce proprietary standard text"
41
+ sign_off_required: true
42
+ license: Apache-2.0
43
+ compatibility: "agentskills.io ROLE.md; any SKILL.md host"
44
+ metadata:
45
+ version: 0.1.0
46
+ author: Aero Agent Roles
47
+ skills_release: "v1.3.0+"
48
+ ---
49
+
50
+ # Guidance, Navigation and Control (GNC) Engineer
51
+
52
+ ## Role identity
53
+
54
+ Owns the GNC chain for a vehicle: navigation state estimation (INS,
55
+ GNSS, filtering), guidance law selection, and control law design
56
+ (inner/outer loops) with stability margins and handling-qualities
57
+ context; plus attitude/orbit dynamics for space applications. Use when
58
+ a vehicle needs a designed, analyzed control system or a navigation/
59
+ guidance architecture with quantified performance. Do NOT use for
60
+ aerodynamic/structural analysis or avionics software certification
61
+ (DO-178C role).
62
+
63
+ ## Deliverable contract
64
+
65
+ 1. **GNC design report** (per templates/gnc-report-template.md, a FILLED
66
+ worked example generated by the core for the reference autopilot
67
+ item) - control architecture, plant model, loop gains, stability
68
+ margins, disturbance response, navigation error budget, guidance
69
+ performance, and (for space) attitude/orbit control.
70
+ 2. **Analysis evidence set** - the design calculations, frequency
71
+ responses, covariance runs, and Monte Carlo results, delivered as
72
+ the report's "Calculation traceability" appendix plus the computed
73
+ tables (gains, margins, budgets) in each section.
74
+
75
+ The core engine computes every number from the domain rules of the
76
+ bound leaves; nothing is asserted without a calculation.
77
+
78
+ ## Workflow (stages -> bound skills)
79
+
80
+ | Stage | Loads skill | Produces |
81
+ |---|---|---|
82
+ | 1. Frames + plant | navigation-frames + space/attitude-dynamics + space/orbit-dynamics | reference frames, plant dynamics |
83
+ | 2. Navigation filter | kalman-filter-design + inertial-navigation + gnss-pseudorange-positioning + gnss-raim-fde + dilution-of-precision | nav architecture + error budget |
84
+ | 3. Inner loop | pid-control-design + lead-lag-compensation + frequency-response-design | inner loop gains + margins |
85
+ | 4. Digital implementation | digital-control-design | discrete design |
86
+ | 5. State estimation | observer-design | observer gains |
87
+ | 6. Allocation/scheduling | control-allocation + gain-scheduling + adaptive-control | allocator + schedule |
88
+ | 7. Guidance | pursuit-guidance | guidance law |
89
+ | 8. Optimal control | lqr-design + model-predictive-control + bang-bang-control + dymos-trajectory | optimal/trajectory solution |
90
+ | 9. Space GNC | space/orbit-determination + space/rendezvous-phasing | orbit determination, rendezvous |
91
+ | 10. Report | (all above) | the GNC design report |
92
+
93
+ ## Evidence gates
94
+
95
+ - Stage 1 done = plant + frames documented; states/inputs defined.
96
+ - Stage 2 done = navigation error budget with sensor noise assumptions.
97
+ - Stage 3 done = gain/phase margins meet the stated requirement.
98
+ - Stage 5 done = observer poles placed with a rationale.
99
+ - FINAL = every gain and margin traces to a calculation; Monte Carlo/
100
+ covariance results stated where relevant.
101
+
102
+ ## Boundary / forbidden
103
+
104
+ - NEVER claim certification approval or release flight software (that is
105
+ the software/hardware cert + program authority).
106
+ - Margins are design predictions; flight test and formal verification
107
+ are separate.
108
+ - Navigation/guidance results assume the stated sensor models.
109
+
110
+ ## Verification
111
+
112
+ The role runs STANDALONE: `core/gnc_core.py` is an executable engine
113
+ that computes PID/LQR/observer gains, phase and gain margins from the
114
+ loop gains, Kalman steady-state covariance and gain, PN guidance
115
+ commands, sample-rate and discrete-design checks, and a seeded Monte
116
+ Carlo robustness pass, then BUILDS the GNC design report and
117
+ gate-checks deliverables. No AeroSkills checkout required.
118
+
119
+ Run the role:
120
+ ```bash
121
+ python3 cli.py build --out gnc-report.md # example item
122
+ python3 cli.py build --vehicle "My UAV" --bandwidth 4 # override facts
123
+ python3 cli.py check --file gnc-report.md # gate-check a report
124
+ ```
125
+
126
+ Tests:
127
+ - tests/test_gnc_engineer_core.py (20 tests): domain rules (pole
128
+ placement anchors, bandwidth factor, margins, Riccati, Kalman,
129
+ observer, PN), builder correctness, gate pass/fail, standalone mode
130
+ (no skills repo).
131
+ - tests/test_role_gnc_engineer.py: bound-skill resolution (skips if
132
+ the skills repo is absent) + workflow + filled template + boundaries.
133
+
134
+ Bound skills in Aero Agent Skills deepen individual stages when the
135
+ library is present (navigation leaves, guidance leaves, space GNC);
136
+ the core engine does not depend on them.
137
+
138
+ ## Compliance
139
+
140
+ - mil-std-1797a context where HQ applies. References summary-not-copy.
141
+ - SOURCES.md records standards referenced.
@@ -0,0 +1,35 @@
1
+ # SOURCES.md - GNC Engineer
2
+
3
+ | Source | Role use | Gated |
4
+ |---|---|---|
5
+ | MIL-STD-1797A | handling qualities context (Level-1 margins/bandwidth context where HQ applies) | false |
6
+ | Stevens & Lewis, Aircraft Control and Simulation | control methods (book) | true |
7
+ | Tewari, Modern Control Design | control reference (book) | true |
8
+ | Groves, Principles of GNSS, Inertial, and Multisensor Navigation | navigation reference (book) | true |
9
+ | Vallado, Fundamentals of Astrodynamics | orbit methods (book) | true |
10
+
11
+ Summary-not-copy per STANDARDS.md.
12
+
13
+ ## Encoded domain rules (computed by core/gnc_core.py)
14
+
15
+ The engine's numbers come from the textbook methods carried by the
16
+ bound Aero Agent Skills leaves (which encode the books above as
17
+ practice); no standard text is reproduced:
18
+
19
+ | Rule | Formula | Bound leaf |
20
+ |---|---|---|
21
+ | Second-order bandwidth | w_bw = f(z) wn, f(z) = sqrt(1-2z^2+sqrt(2-4z^2+4z^4)) | control/frequency-response-design |
22
+ | PID pole placement | match (s^2+2zwn s+wn^2)(s+p3) to plant b/(s^2+a1 s+a0) | control/pid-control-design |
23
+ | Type-1 loop margins | L = K/(s(s+a)): PM = 90-atan(wc/a), GM = inf | control/pid-control-design |
24
+ | Loop margins (general) | |L(jw)| and root-sum unwrapped phase on jw | control/frequency-response-design |
25
+ | LQR | K = R^-1 B' P from the ARE closed form | optimal-control/lqr-design |
26
+ | Kalman steady state | P = Riccati root, K = hP/(h^2P+r) | navigation/kalman-filter-design |
27
+ | Observer | L = phi(A) O^-1 e_n (Ackermann, 2-state) | control/observer-design |
28
+ | Guidance | a_c = N Vc lam_dot | guidance/pursuit-guidance |
29
+ | Digital | 10-20 samples per closed-loop cycle; velocity-form PID | control/digital-control-design |
30
+
31
+ Margins requirements (PM >= 45 deg, GM >= 6 dB) are the conventional
32
+ flight-control design targets recorded as project requirements in the
33
+ example; MIL-STD-1797A adds handling-qualities context where the
34
+ program requires it. All example plant/sensor numbers are stated
35
+ project facts (verify against the vehicle data).
@@ -0,0 +1,141 @@
1
+ #!/usr/bin/env python3
2
+ """cli.py - run the GNC Engineer role.
3
+
4
+ Usage:
5
+ python3 cli.py build [--out <file.md>] [--bandwidth <rad/s>] \
6
+ [--phase-margin <deg>] [--gain-margin <dB>] [--bundle]
7
+ # build the GNC design report
8
+ # --bundle also emit evidence/{model,gates,provenance}.json (PROTOCOL.md)
9
+ python3 cli.py check --file <file.md> # gate-check a report
10
+
11
+ The role ENGINE (core/gnc_core.py) does the work standalone; bound
12
+ skills in Aero Agent Skills deepen individual stages when present.
13
+ """
14
+ import argparse
15
+ import os
16
+ import sys
17
+
18
+ sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)),
19
+ "core"))
20
+ sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)),
21
+ "..", "..", "scripts"))
22
+ import gnc_core as core # noqa: E402
23
+ import evidence # noqa: E402
24
+
25
+ ROLE_SLUG = "gnc-engineer"
26
+
27
+
28
+ def cmd_build(args):
29
+ proj = core.example_project()
30
+ # allow overriding requirements / vehicle from the CLI
31
+ if args.vehicle:
32
+ proj.vehicle = args.vehicle
33
+ if args.bandwidth:
34
+ proj.req_bandwidth_rad_s = float(args.bandwidth)
35
+ if args.phase_margin:
36
+ proj.req_phase_margin_deg = float(args.phase_margin)
37
+ if args.gain_margin:
38
+ proj.req_gain_margin_db = float(args.gain_margin)
39
+ model = core.build_gnc_report(proj)
40
+ md = core.render_gnc_report_markdown(model)
41
+
42
+ # program profile (customer tailoring): load + apply context header
43
+ profile = None
44
+ try:
45
+ profile = evidence.load_profile(args.profile)
46
+ except ValueError as e:
47
+ print("error: bad profile: %s" % e)
48
+ return 1
49
+ if profile:
50
+ model["profile"] = {
51
+ "customer": profile.get("customer"),
52
+ "program": profile.get("program"),
53
+ "basis": profile.get("basis"),
54
+ "authority": profile.get("authority"),
55
+ "der": profile.get("der"),
56
+ "document_prefix": profile.get("document_prefix"),
57
+ "revision": profile.get("revision"),
58
+ }
59
+ md = evidence.profile_header_block(profile) + md
60
+
61
+ gates = core.check_gnc_report(model)
62
+ if args.out:
63
+ with open(args.out, "w") as f:
64
+ f.write(md)
65
+ print("built GNC design report (%s) -> %s"
66
+ % (model["vehicle"], args.out))
67
+ if profile:
68
+ print("profile: %s / %s" % (profile.get("customer"),
69
+ profile.get("program")))
70
+ print("gates: all_pass=%s %s" % (gates["all_pass"], gates))
71
+ if args.bundle:
72
+ prov = {
73
+ "role": ROLE_SLUG,
74
+ "core": {
75
+ "file": "core/gnc_core.py",
76
+ "functions": ["pid_gains_second_order", "loop_margins",
77
+ "type1_margins", "riccati_solution",
78
+ "kalman_steady_state", "observer_gain_2state",
79
+ "pn_acceleration", "sample_rate_rule",
80
+ "monte_carlo_outer_margins",
81
+ "build_gnc_report"],
82
+ "version": "0.1.0",
83
+ },
84
+ "skills": [],
85
+ "cross_checked": False,
86
+ "disclaimer": "DRAFT for human review. Not an approval document.",
87
+ }
88
+ paths = evidence.write_bundle(
89
+ args.out, ROLE_SLUG, "GNC design report", model, gates, prov)
90
+ print("bundle: model=%s" % paths["model"])
91
+ print(" gates=%s" % paths["gates"])
92
+ print(" provenance=%s" % paths["provenance"])
93
+ else:
94
+ print(md)
95
+ return 0 if gates["all_pass"] else 1
96
+
97
+
98
+ def cmd_check(args):
99
+ if not os.path.exists(args.file):
100
+ print("file not found: %s" % args.file)
101
+ return 1
102
+ md = open(args.file).read()
103
+ gates = core.check_gnc_report_markdown(md)
104
+ for name, ok in gates.items():
105
+ if name != "all_pass":
106
+ print("%s %s" % ("PASS" if ok else "FAIL", name))
107
+ print("RESULT: %s" % ("PASS" if gates["all_pass"] else "FAIL"))
108
+ return 0 if gates["all_pass"] else 1
109
+
110
+
111
+ def main():
112
+ p = argparse.ArgumentParser(description="GNC Engineer role")
113
+ sub = p.add_subparsers(dest="cmd", required=True)
114
+
115
+ b = sub.add_parser("build")
116
+ b.add_argument("--out", default="", help="output file (default: stdout)")
117
+ b.add_argument("--vehicle", default="", help="vehicle / project name")
118
+ b.add_argument("--bandwidth", default="",
119
+ help="attitude bandwidth requirement (rad/s)")
120
+ b.add_argument("--phase-margin", default="",
121
+ help="phase margin requirement (deg)")
122
+ b.add_argument("--gain-margin", default="",
123
+ help="gain margin requirement (dB)")
124
+ b.add_argument("--bundle", action="store_true",
125
+ help="emit evidence/{model,gates,provenance}.json")
126
+ b.add_argument("--profile", default="",
127
+ help="program profile JSON (customer tailoring, "
128
+ "docs/PROFILE-SCHEMA.md)")
129
+ b.set_defaults(fn=cmd_build)
130
+
131
+ c = sub.add_parser("check")
132
+ c.add_argument("--file", required=True,
133
+ help="GNC design report markdown to gate-check")
134
+ c.set_defaults(fn=cmd_check)
135
+
136
+ args = p.parse_args()
137
+ sys.exit(args.fn(args))
138
+
139
+
140
+ if __name__ == "__main__":
141
+ main()