Create an aerospace concept
Treat the text after /create-aero as the concept argument.
Resolve the argument
- Require exactly one concept path. Accept:
designs/<name>
<name> as shorthand for designs/<name>
- an existing
design.yaml
- Work from the repository root.
- Reject
.., absolute paths outside this repository, and names that would
write outside designs/ or results/.
Scaffold a missing concept
If the resolved concept directory does not exist:
Do not copy the template or create the concept directory from this skill.
Offer both supported bootstrap paths:
For an intent plus requirement documents, sketches, and optionally a
reference 3D model (a triangle mesh of the real aircraft), invoke the
dedicated initializer so it measures, authors, and runs the bounded
geometry checkpoint:
/initialize-aero <name> "<intent>" @requirements.md @sketches @reference.stl
For direct visual authoring, start the schema-driven Studio:
python -m openair.designer new <name> --open
For the Studio-first path, ask them to write the brief and inference
record, trace the sketch photos, and click Create concept. A successful
save creates designs/<name>/design.yaml, brief.md with the
auto-generated Sketch measurement worksheet, and original/rectified sketch
PNGs.
For the initializer path, inspect design.yaml .sketch.treatment.
requirement mode still requires the reviewed Studio save.
inspiration mode may proceed without Studio when the user requests the
autonomous/no-manual-review flow; the measured worksheet and hard identity
bounds are then the source contract.
Ask them to re-invoke /create-aero designs/<name> after saving, or proceed
directly in an explicitly autonomous initializer invocation.
Stop. Do not run solvers against unconfirmed template requirements, and do
not treat an abandoned Studio session as a source concept.
Establish sketch evidence before optimization
Do not start MDO from an image and an undocumented guess. Before the full
pipeline:
Require a Sketch measurement worksheet in brief.md that records:
source image and view; four rectification/control points or an explanation
of why none are needed; dimensional scale reference; fuselage length,
width, height, and stations; wing span, root/tip chords, sweep, and root
location; fin geometry; every inferred value; and measurement tolerances.
Use python -m openair.designer <name> --open to revise the brief,
four-point graph-paper rectification, tracing, and auto-generated
worksheet. The browser's derived values are preflight guidance, not gate
evidence.
Confirm design.yaml .sketch contains those measured targets and
tolerances. A non-reference planform must not inherit the template
envelope.
When wing.sections is present, require
sketch.treatment: reproduction, 3–12 strictly increasing eta stations
from 0 to 1, and scalar root/taper/sweep/dihedral values matching
WingSpec.equivalent_trapezoid. The measured sections—not the scalar
trapezoid—must drive OpenVSP, OAS, and Studio.
Run the baseline geometry checkpoint:
python -m openair.geometry run designs/<name>
In interactive or requirement mode, open
results/<name>/baseline/threeview.png beside every
designs/<name>/sketch-*.png. Compare span/length, root and tip chord,
sweep direction and magnitude, wing station, body silhouette, and fin
placement. If the artifact is visibly outside the worksheet tolerance,
update the source design and repeat this checkpoint; do not let MDO hide an
input-shape error. In autonomous inspiration mode this is an automated
evidence checkpoint, not a request for user approval: require geometry
truth and the hard identity bound, then let MDO repair soft-prior mistakes.
When the concept carries a reference model
(designs/<name>/reference/reference.json, guidebook chapter 13), the
baseline checkpoint must also show
results/<name>/baseline/geometry.json .reference_fidelity.ok == true
(mandatory for reproduction; disclosed for other treatments), and you
must open results/<name>/baseline/reference_overlay.png. Departures are
acceptable only where the brief lists the feature as unrepresentable. For
a sectioned wing, also read geometry.json .wing.planform_mode,
.openvsp.readback.wing_sections, and
.reference_fidelity.disclosed.p95_model_to_reference_exposed_components_m.wing;
this is model-to-reference only. Do not
mistake the buried centreline carry-through's component p95 for exposed
shape error.
When fuselage.fairings is present, also require
.openvsp.readback.fairings_match,
.openvsp.readback.vtail_root_extensions_match,
mesh_checks rows fairing_*_contained and fin_*_attached, and
.reference_fidelity.checks.p95_body.basis == "fuselage + measured fairing components".
Fairings and fin_*_root are loft-only/non-lifting. The fairing remains
in body-union fidelity; verify only buried-root components are marked
excluded from component fidelity.
Require the concept inputs (brief.md, design.yaml, sketches, and
reference/) to be committed before the full run. If they are
uncommitted, stop and ask the user to commit them or explicitly authorize a
commit.
Run an existing concept
Activate the repository environment before Python starts:
source .venv/bin/activate
export LD_LIBRARY_PATH="$PWD/tools/libs/usr/lib/x86_64-linux-gnu:${LD_LIBRARY_PATH:-}"
export PATH="$PWD/tools/openvsp/opt/OpenVSP:$PWD/tools/su2/bin:${PATH:-}"
export PYTHONPATH="$PWD/src:${PYTHONPATH:-}"
export MAMBA_ROOT_PREFIX="$PWD/tools/mamba"
export OPENMDAO_REPORTS=0
python -m openair run designs/<name>
pytest
The geometry-only call above is the required pre-MDO checkpoint. After it
passes (or is manually accepted in interactive mode), do not substitute a
sequence of hand-picked stages: the concept
orchestrator owns phase ordering, stale-artifact cleanup, optimized-design
publication, stretch runs, and presentation generation.
QA review
After a successful run:
- Read
.cursor/skills/aero-qa/SKILL.md.
- Review
results/<name>/baseline/ and results/<name>/optimized/ as
different aircraft. Execute every gate in
docs/guidebook/00-qa-workflow.md; never infer a verdict from ok: true.
- Inspect
results/<name>/optimized/threeview.png and the interactive mesh
in results/<name>/report.html. Confirm the displayed artifact agrees
with the configuration and mesh-truth checks.
- Recompute at least one headline value independently.
- For
inspiration concepts, inspect baseline/mdo.json:
- all
branches, including airfoil selection and any htail fallback;
- a converged
calibration_history with NP error ≤ 0.05 MAC and stable dash;
fidelity_sweep weights 2.0/1.0/0.25 with weight 1.0 delivered;
- every beyond-tolerance row in
sketch_departures, including its clamp
study reason; and
- fin volume plus
fin_te_overhang_m <= 0.
- Report gate, evidence path + JSON key + value, and verdict for any failure.
Distinguish TACS/SU2 calibration results from flight-worthiness gates.
Finish with a concise concept verdict, headline performance, validation count,
the optimized three-view image, and links to:
results/<name>/report.html
results/<name>/executive_brief.pdf
results/<name>/optimized/design.yaml
When publishing a new committed preview, add its curated title, summary, kind,
and optional featured status to site/designs.yaml. The Pages build is
deliberately fail-closed when that manifest and the
results/*/report.html set differ.
To make the delivered geometry the explicit source for another iteration, use
python -m openair promote <name> <new-name>; never copy generated YAML over
the current source concept.
1---2name: create-aero3description: Runs or scaffolds an open-air aircraft concept, executes the complete baseline-to-optimized pipeline, and reviews every AERO QA gate. Use only when explicitly invoked as /create-aero.4---56# Create an aerospace concept78Treat the text after `/create-aero` as the concept argument.910## Resolve the argument11121. Require exactly one concept path. Accept:13 - `designs/<name>`14 - `<name>` as shorthand for `designs/<name>`15 - an existing `design.yaml`162. Work from the repository root.173. Reject `..`, absolute paths outside this repository, and names that would18 write outside `designs/` or `results/`.1920## Scaffold a missing concept2122If the resolved concept directory does not exist:23241. Do not copy the template or create the concept directory from this skill.25 Offer both supported bootstrap paths:2627 - For an intent plus requirement documents, sketches, and optionally a28 reference 3D model (a triangle mesh of the real aircraft), invoke the29 dedicated initializer so it measures, authors, and runs the bounded30 geometry checkpoint:3132 ```text33 /initialize-aero <name> "<intent>" @requirements.md @sketches @reference.stl34 ```3536 - For direct visual authoring, start the schema-driven Studio:3738 ```bash39 python -m openair.designer new <name> --open40 ```41422. For the Studio-first path, ask them to write the brief and inference43 record, trace the sketch photos, and click **Create concept**. A successful44 save creates `designs/<name>/design.yaml`, `brief.md` with the45 auto-generated Sketch measurement worksheet, and original/rectified sketch46 PNGs.473. For the initializer path, inspect `design.yaml .sketch.treatment`.48 `requirement` mode still requires the reviewed Studio save.49 `inspiration` mode may proceed without Studio when the user requests the50 autonomous/no-manual-review flow; the measured worksheet and hard identity51 bounds are then the source contract.524. Ask them to re-invoke `/create-aero designs/<name>` after saving, or proceed53 directly in an explicitly autonomous initializer invocation.545. Stop. Do not run solvers against unconfirmed template requirements, and do55 not treat an abandoned Studio session as a source concept.5657## Establish sketch evidence before optimization5859Do not start MDO from an image and an undocumented guess. Before the full60pipeline:61621. Require a **Sketch measurement worksheet** in `brief.md` that records:63 source image and view; four rectification/control points or an explanation64 of why none are needed; dimensional scale reference; fuselage length,65 width, height, and stations; wing span, root/tip chords, sweep, and root66 location; fin geometry; every inferred value; and measurement tolerances.67 Use `python -m openair.designer <name> --open` to revise the brief,68 four-point graph-paper rectification, tracing, and auto-generated69 worksheet. The browser's derived values are preflight guidance, not gate70 evidence.712. Confirm `design.yaml .sketch` contains those measured targets and72 tolerances. A non-reference planform must not inherit the template73 envelope.74 When `wing.sections` is present, require75 `sketch.treatment: reproduction`, 3–12 strictly increasing eta stations76 from 0 to 1, and scalar root/taper/sweep/dihedral values matching77 `WingSpec.equivalent_trapezoid`. The measured sections—not the scalar78 trapezoid—must drive OpenVSP, OAS, and Studio.793. Run the baseline geometry checkpoint:8081 ```bash82 python -m openair.geometry run designs/<name>83 ```84854. In interactive or `requirement` mode, open86 `results/<name>/baseline/threeview.png` beside every87 `designs/<name>/sketch-*.png`. Compare span/length, root and tip chord,88 sweep direction and magnitude, wing station, body silhouette, and fin89 placement. If the artifact is visibly outside the worksheet tolerance,90 update the source design and repeat this checkpoint; do not let MDO hide an91 input-shape error. In autonomous `inspiration` mode this is an automated92 evidence checkpoint, not a request for user approval: require geometry93 truth and the hard identity bound, then let MDO repair soft-prior mistakes.945. When the concept carries a reference model95 (`designs/<name>/reference/reference.json`, guidebook chapter 13), the96 baseline checkpoint must also show97 `results/<name>/baseline/geometry.json .reference_fidelity.ok == true`98 (mandatory for `reproduction`; disclosed for other treatments), and you99 must open `results/<name>/baseline/reference_overlay.png`. Departures are100 acceptable only where the brief lists the feature as unrepresentable. For101 a sectioned wing, also read `geometry.json .wing.planform_mode`,102 `.openvsp.readback.wing_sections`, and103 `.reference_fidelity.disclosed.p95_model_to_reference_exposed_components_m.wing`;104 this is model-to-reference only. Do not105 mistake the buried centreline carry-through's component p95 for exposed106 shape error.107 When `fuselage.fairings` is present, also require108 `.openvsp.readback.fairings_match`,109 `.openvsp.readback.vtail_root_extensions_match`,110 `mesh_checks` rows `fairing_*_contained` and `fin_*_attached`, and111 `.reference_fidelity.checks.p95_body.basis == "fuselage + measured fairing components"`.112 Fairings and `fin_*_root` are loft-only/non-lifting. The fairing remains113 in body-union fidelity; verify only buried-root components are marked114 excluded from component fidelity.1156. Require the concept inputs (`brief.md`, `design.yaml`, sketches, and116 `reference/`) to be committed before the full run. If they are117 uncommitted, stop and ask the user to commit them or explicitly authorize a118 commit.119120## Run an existing concept121122Activate the repository environment before Python starts:123124```bash125source .venv/bin/activate126export LD_LIBRARY_PATH="$PWD/tools/libs/usr/lib/x86_64-linux-gnu:${LD_LIBRARY_PATH:-}"127export PATH="$PWD/tools/openvsp/opt/OpenVSP:$PWD/tools/su2/bin:${PATH:-}"128export PYTHONPATH="$PWD/src:${PYTHONPATH:-}"129export MAMBA_ROOT_PREFIX="$PWD/tools/mamba"130export OPENMDAO_REPORTS=0131python -m openair run designs/<name>132pytest133```134135The geometry-only call above is the required pre-MDO checkpoint. After it136passes (or is manually accepted in interactive mode), do not substitute a137sequence of hand-picked stages: the concept138orchestrator owns phase ordering, stale-artifact cleanup, optimized-design139publication, stretch runs, and presentation generation.140141## QA review142143After a successful run:1441451. Read `.cursor/skills/aero-qa/SKILL.md`.1462. Review `results/<name>/baseline/` and `results/<name>/optimized/` as147 different aircraft. Execute every gate in148 `docs/guidebook/00-qa-workflow.md`; never infer a verdict from `ok: true`.1493. Inspect `results/<name>/optimized/threeview.png` and the interactive mesh150 in `results/<name>/report.html`. Confirm the displayed artifact agrees151 with the configuration and mesh-truth checks.1524. Recompute at least one headline value independently.1535. For `inspiration` concepts, inspect `baseline/mdo.json`:154 - all `branches`, including airfoil selection and any htail fallback;155 - a converged `calibration_history` with NP error ≤ 0.05 MAC and stable dash;156 - `fidelity_sweep` weights 2.0/1.0/0.25 with weight 1.0 delivered;157 - every beyond-tolerance row in `sketch_departures`, including its clamp158 study reason; and159 - fin volume plus `fin_te_overhang_m <= 0`.1606. Report gate, evidence path + JSON key + value, and verdict for any failure.161 Distinguish TACS/SU2 calibration results from flight-worthiness gates.162163Finish with a concise concept verdict, headline performance, validation count,164the optimized three-view image, and links to:165166- `results/<name>/report.html`167- `results/<name>/executive_brief.pdf`168- `results/<name>/optimized/design.yaml`169170When publishing a new committed preview, add its curated title, summary, kind,171and optional featured status to `site/designs.yaml`. The Pages build is172deliberately fail-closed when that manifest and the173`results/*/report.html` set differ.174175To make the delivered geometry the explicit source for another iteration, use176`python -m openair promote <name> <new-name>`; never copy generated YAML over177the current source concept.