Research and Development · 7 min read

We built a digital twin with AI agents and no CAD software

AI agents built a digital twin of a two-seat aircraft as code, with no CAD software. We checked it step by step, and the 3D model is live on the page.

Darkmatter
João MontenegroClaudeCodexDarkmatter
0:00 / 13:53

We built a digital twin of an aircraft with AI agents, and without traditional CAD software. No Fusion, no SolidWorks, no Alias. The agents wrote the geometry as code, and Blender, which is free, rendered it.

A digital twin is a computer model detailed enough to be inspected, moved and simulated like the physical machine. Ours is an independent reconstruction of the Blackshape Prime, a two-seat light aircraft, made from public documents: a brochure, a flight manual and photographs. Blackshape, the manufacturer, is not involved. The modelling was done by GPT-6 Astra and Claude Opus 5.5, working in a harness we built that lets an agent construct geometry as code, mathematically. It took 30 numbered revisions over 41 hours, from the first save to the last.

A model written by an agent can look perfect and still be wrong. The errors tend to show up late: when the model is simulated, when its parts are fitted together, when someone tries to sit in the cockpit. So we checked it in stages, starting with its outer shape. The model is on this page: you can drag it around, cut it open and move its controls.

Why we started with the outer skin

Everything else in the model depends on the skin. An airflow simulation reads the skin's shape to compute the forces on it. The seats, engine and fuel tanks have to fit inside it. A flaw in the skin carries into each of those, and finding it late means redoing everything built on it.

Car designers call the top tier of surface quality Class A. Aircraft skin is built from curved patches, and on a Class A surface neighbouring patches match along every seam meant to be smooth, in position, in angle and in how sharply they bend, so a reflection runs across the seam with no jump and no kink. Smoothness also affects airflow: the thin layer of air that clings to the skin, the boundary layer, helps set drag and the point where a wing loses lift, and its behaviour depends on the surface it flows over. We built the skin with Class A discipline.

Designers check this with zebra stripes, parallel stripes reflected in the surface: stripes that flow on across a seam mean the patches match smoothly, and a stripe that jumps or turns sharply marks a flaw.

Zebra stripes

The skin reflecting a striped light

Drag to turn the aircraft. The sliders change the stripe spacing, the stripe tilt and the light angle.

The aircraft covered in black and white zebra stripes, bending around the nose and the wing-root blends.
Independent reconstruction · Revision 30

Reflection

Overlay

The patch lines mark the boundaries between the surface patches the skin is built from.

Why passing the numerical tests was not enough

In revision 1, the agents built curved patches that blend each wing into the fuselage, and the patches passed every numerical test we had, matching the surfaces on either side to within 3 micrometres in position, and in angle and bend as well. A review rejected them anyway. The tests measured the match at the edges of the patches. None of them showed that highlights would flow cleanly across the shape or that the patches were laid out sensibly. We removed the blends in revision 2 and rebuilt them later.

Why curvature matters

A seam can look smooth and still hide a flaw in curvature, which is how sharply a surface bends. A pipe bends in one direction, and a saddle bends up one way and down the other. On an aircraft skin the bending should change gradually. Two patches can meet at the same position and the same angle and still bend at different rates. Ordinary shaded rendering hides that mismatch. Reflections show it as a flaw in the finish, and airfoil designers also try to avoid abrupt changes in curvature, because they can disturb the boundary layer near stall.

In revision 6 the stripes caught a curvature mismatch on the nose. The upper and lower patches met there with matching positions and angles, yet the curvature on the two sides differed by a factor of 10. We rebuilt a band 76 mm wide on each side of the seam to match the surrounding surface. The repair moved the surface by at most 1.04 mm.

Curvature

Where the skin bends

Colour shows how the skin curves. On the Gaussian setting, ochre areas bulge outward, like the nose and canopy, blue areas dip like a saddle, as in the blends at the wing roots, and grey areas are flat in one direction, like the wing panels. The Mean setting colours outward bends ochre and inward bends blue. Show the patch lines to see where the colours change across a seam.

The aircraft shaded by curvature: ochre on the nose and canopy, blue in the saddles at the wing roots, grey on the flat wing panels.
Independent reconstruction · Revision 30
SaddleDome

Curvature map

Overlay

Curvature is computed patch by patch from each patch's own shape, wherever that calculation works, so the triangles of the mesh do not show up as curvature and a seam can show a different value on each side. The colour scale is symmetric and logarithmic.

We then measured the 44 fuselage seams that are long enough to measure, taking for each the angle between the surface on its two sides. The median is 0.09 degrees, and nine in ten are within 0.43 degrees. As a control, we cut one smooth patch in two and ran the same test: it gives 0.05 degrees, the test's own noise and close to the typical seam. Three seams on one fuselage section measure 0.8 to 1.5 degrees, and they are the first to review.

We also measured the five joints where the wing, tail and fin meet the fuselage. The table at the end has the numbers. Class A acceptance is a review of the whole aircraft, and that review is still ahead of us.

Checking that the moving parts clear each other

A model whose controls and landing gear collide when they move is no use for design, because the real parts have to clear each other through their whole travel. We moved them. The tail controls went through 91 sampled positions, one control at a time, with no detected contact between moving and fixed parts. The six gear covers and twelve hinges went through 49 recorded positions with no unintended contact. The flight manual gives how far each control travels but not where its hinges sit, so we reconstructed the hinge positions from the hardware we modelled. Measured hinge play, the looseness in each hinge, is the next input.

Moving parts

Controls, canopy and landing gear

Move the controls, or play the landing gear cycle to watch the covers and legs go through their sequence.

The aircraft in white paint with the canopy raised over the two seats and the landing gear down.
Independent reconstruction · Revision 30

Flight controls

Canopy, gear and propeller

Control travel is from the flight manual. The gear sequence, hinge positions and clearances are inferred from our hardware model.

Fitting the engine, seats and fuel tanks inside the skin

A twin is only useful if everything fits under the skin. Inside ours are two seats and their controls, a Rotax engine with its cooling, two 33-litre fuel tanks and three landing gear units in their wells.

Interior

Seats, engine, fuel tanks and landing gear

See through the skin, switch the layers on, and cut the model along any axis.

The aircraft seen through its skin: two tandem seats, the engine with its cylinders, the nose wheel and the fuel tanks at the wing roots.
Independent reconstruction · Revision 30

Layers

Section

The engine is a packaging model, not manufacturer CAD. The harnesses and pilots are left out of this view.

Three problems are still open. In the engine layout we modelled, called installation F, the engine's output flange, where its power comes out, sits 245 mm behind the propeller. The modelled propeller hub covers 85 mm of that distance, so a 160 mm drive connection remains to be designed. The same layout has 21 places where hoses, a cooler line and the exhaust pipes touch their neighbours. And the harness belts, drawn as worn by the three pilot sizes, pass through the pilots' bodies.

Do pilots of different sizes fit in the cockpit?

A cockpit has to fit the people who fly in it: they must reach the stick and the throttle, sit with their heads clear of the canopy, and move the pedals through their range. In a fit study we put three pilot sizes, 1.60, 1.75 and 1.90 metres tall, in each of the two seats and recorded where each body sits relative to the controls and the canopy.

Cockpit fit

Three pilot sizes in two seats

Pick a pilot height and a seat. The vertical line marks the gap between the top of the head, or cap, and the canopy glass. The table gives the study's numbers for the pilots shown.

The aircraft seen through its skin with a seated pilot in each seat and a vertical dimension line from each head to the canopy.
Independent reconstruction · Revision 30

Occupants

Show

1.75 m, front
Head to canopy
132 mm
Reach reserve, stick
114 mm
Reach reserve, throttle
84 mm
Knee angle
154°
Pedal adjustment
0 mm
1.75 m, rear
Head to canopy
147 mm
Reach reserve, stick
120 mm
Reach reserve, throttle
98 mm
Knee angle
138°
Pedal adjustment
−10 mm

The body is the pilot model from the FlightGear DG-101G glider (the aircraft is by Nikolaus Kerner and FlightGear contributors, github.com/FGMEMBERS/DG-101G), rescaled by the study to three statures with the model's shoes and cap, and reduced here to 14,000 triangles each. It stands in for body shape and is not measured anthropometry. Head clearance is measured to the top of the cap. Pedal adjustment is how far the study moved the pedals from their modelled position to fit each pilot.

All six cases reach both controls with room to spare. With the stick and throttle at neutral, the arm has 105 to 129 mm of reach left at the stick and 62 to 118 mm at the throttle. The head clears the canopy by 77 to 211 mm, least for the tallest pilots (77 mm in the front seat, 82 mm in the rear). Between the shortest and the tallest pilot, the pedals need 160 mm of adjustment in the front seat and 85 mm in the rear.

This was a fit study of one body shape scaled to three heights, with a check for surfaces passing through each other. Ergonomic acceptance is the step after it. Still to do are hands that grip the controls, full control travel, a line of sight from each eye, harness routing, contacts with the panel and footwell, and headroom for the tallest pilots.

Running the first airflow simulation on the wing and tail

A solver is a program that computes the forces on a shape as air flows past it. Ours reads the wing and tail from the model and returns the lift slope: how much more lift the wing and tail make for every degree they tilt into the air, a tilt called the angle of attack. Designers use that number to find the angle a wing needs for a given lift, and to predict how an aircraft responds when the pilot pulls the stick back.

We used VSPAERO, the solver that ships with the open-source design tool OpenVSP. In the mode we used, it treats the wing and tail as sheets of panels, called a mesh. We ran it at 51 metres per second, about 184 kilometres an hour, at angles of attack from minus 2 to 6 degrees. The six cases, one with a finer mesh at 2 degrees, took about 14 minutes of solver time. The input is the wing and horizontal tail from revision 9, an earlier revision of the model. Away from the root, where the wing meets the fuselage, revision 30 matches that shape seen from above to within 6 mm, so the run applies to the final wing and tail. It covers those two surfaces only, with the controls neutral.

Airflow simulation

Lift on the wing and horizontal tail

Pick a case. The model shows the solver's own panels and the lift it computed for each strip of the wing and tail. The charts below use the same data.

The aircraft seen through its skin with the solver's panel mesh on the wing and tail and a translucent wall of section lift standing above the wing.
Independent reconstruction · Revision 30

Solver case, angle of attack

* Did not pass our residual screen. Shown for completeness and kept out of every fit.

Draw on the model

Lift against angle of attack

-0.20.00.20.40.6-2°0°2°4°6°

Solid points are within the residual limit and hollow points are not. The steel diamond is the finer mesh at 2 degrees. The dashed line extends the fit through the three passing cases.

Pitching moment against angle of attack

-0.10-0.050.000.04-2°0°2°4°6°

Moment about the centre of gravity at 26.6% of the modelled chord, the middle of the published envelope mapped onto our model.

Which cases meet the residual limit

−3−2−10-2°0°2°4°6°Limit: at or below −2

The solver's leftover error at its last of 12 iterations, on a log10 scale where lower is better. A case meets the limit if this is at or below −2 and the largest single residual is at or below −0.5, which the 4 and 6 degree cases miss as well.

Lift along the wing

0.00.5−3−2−10123

Local lift coefficient times chord, from the solver's strip loads, for the 2 degree case. Faint lines are the other cases. Metres.

How the solver settled

−0.20.00.20.40.614812-2°0°2°4°6°

Lift coefficient after each of the 12 solver iterations. The forces settle in every case; the residuals above separate the cases that meet the limit.

The figure shows the first run, with 12 solver iterations. The wing and tail are from revision 9, drawn on the revision 30 model. Mass and centre of gravity are published reference values mapped onto the modelled wing.

For every degree of tilt, the lift coefficient, the standard measure of a wing's lift, rises by 0.088: that is the lift slope. The pitching moment slope, which says how strongly the nose is pushed back down as the angle increases, is minus 0.0169 per degree. A case counts only if the solver's leftover error, the residual, has fallen below a limit we chose for this study. Three of the five angles pass, at minus 2, 0 and 2 degrees, and the slopes come from them. The finer mesh moved lift by about 1.8% and pitching moment by about 6%.

A textbook estimate for the same wing and tail treated as thin sheets, as the solver treats them, gives a lift slope of 0.091 to 0.094 per degree, 3% to 7% above the solver's. The pitching moment slope agrees less well: a hand estimate and a second solver we wrote both give a steeper slope, by about 20% and 45%. That slope is the next number to examine, along with the drag caused by lift, where the solver's two estimates disagree.

A second run, with the solver repeating its calculation 36 times (iterations) instead of 12, reproduces the first at minus 2, 0 and 2 degrees. It adds a 3 degree case that narrowly passes the limit, with about 97% of the lift needed to carry the aircraft's maximum mass of 472.5 kg, so lift on this wing and tail reaches the aircraft's weight a little above 3 degrees. The 4 degree case has steady forces but does not pass yet, so the exact angle comes from the next run.

Explore the model yourself

The same model opens in one viewer with drawing styles, the mesh, sections, layers and views. The zebra and metal shading follow the approach of our open-source CAD Viewer.

Explore

The whole model in one viewer

Switch render modes, show the triangle mesh or the patch boundaries, cut sections, and jump between views.

The aircraft in a three-quarter view from the front, shaded in paint with a soft shadow on a dark ground.
Independent reconstruction · Revision 30

Render

Layers, section and view

Drag to orbit, shift-drag to pan, Ctrl or Command and scroll to zoom.

The checks in one table

The table puts the checks in one place, so you can see what has been measured and what is still open: 19 measured on the model, 2 inferred from stated assumptions and 9 that are the next piece of work, 30 in all. Measured means measured on the digital model or in the solver output. No measurement here came from the physical aircraft.

Checks, results and status
StageCheckResultStatus
SurfaceRevision 1 wing root blends passed the numerical match tests (position error 2.8 micrometres) and were rejected on review2.8 micrometres, rejected on reviewMeasured
SurfaceNose seam: curvature ratio across the seam, found in the zebra view (revision 6)10.2 to 1Measured
SurfaceNose repair (revision 7): largest change to the surface1.04 mmMeasured
SurfaceFuselage seams (44): angle between the surface on the two sides, median (test noise 0.05 degrees)0.09 degreesMeasured
SurfaceFuselage seams (44): difference in curvature between the two sides, median (test noise 0.05 per metre)0.02 per metreMeasured
SurfaceJoints where wing, tail and fin meet the fuselage: worst mismatch in how quickly the curvature changes, at the wing root (the test's own error is 0.0008)0.00007Measured
SurfaceWhole-aircraft Class A reviewNextNext
MotionTail control sweep (elevator −10 to +20 degrees, rudder ±20, trim −30 to +6, one channel at a time): detected contacts across 91 sampled positions (89 distinct poses)0Measured
MotionGear covers and hinges: unintended contacts across 49 recorded positions (48 distinct)0Measured
MotionViewer against the Blender 3D model it was built from, 13 tail and canopy poses0.98 micrometresMeasured
MotionHinge positions, hinge play and clearancesInferred from our hardware modelInferred
InsidePropeller drive connection, installation F160 mm gap, drive connection to designNext
InsideService-detail contacts, installation F21 touching, to resolveNext
InsideWorn-harness belts intersecting the body24 belt and body pairs, to resolveNext
ErgonomicsReach reserve at the stick and throttle, six cases (1.60, 1.75 and 1.90 m in both seats; one body shape scaled)62 to 129 mmMeasured
ErgonomicsHead to canopy clearance, six cases (least: 1.90 m, front seat; measured to the top of the cap)77 to 211 mmMeasured
ErgonomicsPedal range needed between 1.60 and 1.90 m, front seat160 mmMeasured
ErgonomicsLine of sight from each eye, gripping hands, full control travel, harness routing, panel and footwell contacts, tallest-occupant headroom, comfort and egressNextNext
SolverRevision 30 wing and horizontal tail against the revision 9 solver outline (plan view, outboard of the root)Within 6 mmMeasured
SolverCases within the solver's residual limit, first run (12 iterations)3 of 5Measured
SolverSecond run (36 iterations): lift at −2, 0 and 2 degrees against the first runSame to 0.00002Measured
SolverSecond run: 3 degree case, lift as a share of the lift needed to carry 472.5 kg (narrowly within the residual limit)About 97%Measured
SolverFiner mesh against coarse at 2 degrees: lift and pitching moment+1.8%, +6%Measured
SolverLift slope against a textbook estimate for the same wing and tail as thin sheets0.091 to 0.094 per degree, against 0.088Inferred
SolverPitching moment slope against a hand estimate and a second solver we wroteBoth steeper than the solverNext
SolverDrag caused by lift (induced drag): the solver's two estimates, finer meshDisagree by 72%, drag not reportedNext
SolverLift equal to weight at 51 m/s on the wing and tail (needs a lift coefficient of 0.31): the 4 degree case is outside the residual limit, its forces are steadyA little above 3 degreesNext
SolverComparison with flight-test dataNot yetNext
BuildNew revision 30 parts: 209 meshes, each one a single connected piece0 mesh errorsMeasured
BuildRebuild from saved inputs: 14 stages, model files identical byte for byte187 s, 4 of 4 identicalMeasured

What this took and what comes next

This took 41 hours of wall-clock time, two AI agents and a harness we built for them. Because the geometry is code, the revision 30 aircraft rebuilds from its saved inputs in about three minutes, and the four model files come out identical, byte for byte. The article, the viewer and the audit scripts were written with Claude.

Next we need reference data to compare against: the manufacturer's design data and production wing profile, measured hinge play, a weighed mass and centre of gravity, flight-test records, and a solver run that includes the fuselage.

Darkmatter helps hardware and advanced-design teams use AI in their own work, from the harness that lets an agent build geometry as code to the checks that decide whether to trust the result. If you build hardware and want to see what that looks like on one of your own subsystems, talk to us.

The model was built with GPT-6 Astra and Claude Opus 5.5, and rendered in Blender. Blackshape is the name of the aircraft's manufacturer. This model is an independent reconstruction from public material. It is not endorsed by or affiliated with them, and it is not a source of flight or maintenance data. Dimensions and control travel come from the flight manual (BPU/FM003 Rev 3, 2014): dimensions on page 4, control travel on page 5, maximum mass on page 21 and the centre of gravity range on page 22. The solver is VSPAERO 7.2.2 in OpenVSP 3.51.3, first run on 14 September 2026 and second run on 1 October 2026. Every other figure comes from the project's verification reports and review notes, or from the audit scripts we ran on the revision 30 export and the solver geometry. Revision times are file save times, because the project's Git history begins after revision 30.