This program was developed with the help of Claude Code. I did not want to, nor had the skills to, build an actual lifting-line model, so from the start this project was going to be a shell put on top of aerodynamics software. AeroSandbox was chosen over similar software like XFLR5 mainly because its API is easier to use, and because it works well with the structure of the app, which runs until a design converges.
The general workflow with Claude is the following, and each stage is its own document inside the repo. First, the idea and formulation: what the tool might look like, the programming language, and the choice of AeroSandbox. Then the per module equations and where their data comes from. Each module is given a contract of what goes in and what comes out, and every constant is traced back to a source. The propeller comes from published APC performance data fitted as smooth curves. The motor is an equivalent circuit built from its vendor Kv, resistance and no load current. The battery is held at discharge average voltage rather than full charge. The printed structure is split into skin, ribs and joints with calibrated constants. Anything doubtful is labelled as such in that document. Next is the code structure and milestones, as well as a sample aircraft to calibrate the whole project. Then implementation is done mostly automatically by Claude Code based on the specs written.
Each milestone had an explicit gate and a goal that had to be met, which broke the project into smaller testable pieces. Milestone 1, for instance, shipped with no optimizer at all: geometry, mass, CG, aerodynamics and propulsion, all evaluated on one fixed design. For M1 to count as complete, those numbers had to land inside plausibility bands built from published data on real comparable aircraft, among them an X-UAV Mini Talon, a solar sailplane and two Eclipson printed designs.
Despite working with testable milestones, there was still a lesson to learn here. The problem with AI agents is not that the code fails, it is that the code produces a plausible result which never gets properly checked. Three separate issues came out of this, with the propeller, the winglet and the warm start. None of them were caught by a test suite. They were found because every run is written out as a self-contained artifact, with its inputs and measurements stored beside the result, so eventually each number ran into something further down the line that disagreed with it.