Skip to content

Read and write awesIO's materials, slimmer core and wing frames, and load SymbolicAWEModels' YAML with the kite at zenith - #54

Merged
1-Bart-1 merged 4 commits into
mainfrom
agent/53-kitegeometry-jl-each-wing-s-frame-read-w
Oct 15, 2026
Merged

1-Bart-1 merged 4 commits into
mainfrom
agent/53-kitegeometry-jl-each-wing-s-frame-read-w

Conversation

@1-Bort-1

@1-Bort-1 1-Bort-1 commented Oct 15, 2026 •

Copy link
Copy Markdown
Member

KiteGeometry now reads and writes the structure documents awesIO main defines. Three schema changes landed there since the version vendored here: a materials table (1-Bart-1/awesIO#28), a slimmer core (1-Bart-1/awesIO#32), and a frame for each wing (1-Bart-1/awesIO#36). Both V3 example documents load and write back unchanged.

A segment, a tube and a wing's canopy now name a material: a stiffness law and its parameters. A point is its name, whether it is fixed, the body it rides and its position. Rest length, diameter, mass, inertia, pressure and a winch's drum are optional columns. A document that leaves one out gets it back left out, not written as zero.

What the slimmer core dropped is no longer a field here: a point's type and drag, a station's and a body's type, a pulley's type and efficiency. SymbolicAWEModels reads those through the models it registers. The tests register stand-ins for those models until it does.

Each wing now records where its own frame is: the origin and rotation of the frame its aerodynamic mesh is drawn in. One new function puts a world position into that frame:

pos_KA(wing, point.pos_ENU)    # the point in the wing's own frame

Loading SymbolicAWEModels' authoring YAML no longer turns the kite to its launch elevation. It shifts the authored positions so the tether's ground point sits where the file puts it, with the kite straight above, as awesIO's convention places it. The wing's frame is the authored frame, shifted, with no rotation. The file's transforms are kept in the document as an extra block, for SymbolicAWEModels to apply when a run starts. Each line's stiffness and density become a material, named after the variables entry that gives them (dyneema, wing_element). Two different materials that would share a name get _2, _3 added. A Breukels tube gets its own copy of SymbolicAWEModels' constants.

Breaking. Reading refuses awesIO 1.0.0 documents; awesIO is at 0.1.0. Station is now SpanwiseStation and DynamicsType is gone. A body's rotation is Q_KA2ENU and a segment's rest length rest_length.

Where you may push back. The writer used to name a table's default model in a model column on every row. It now leaves that column out when every row reads its block's default, and it leaves out a model column no row fills. Otherwise neither V3 document writes back equal while SymbolicAWEModels' pulley model, which reads their efficiency column, is registered: every pulley row would gain a model cell. Reading the file back gives the same models.

Not covered. Points a tether adds still carry no SymbolicAWEModels model, so their type and drag cells are empty. Choosing them is SymbolicAWEModels' to do when it adopts this, as is applying the transforms at run start. Which points a transform moves is not in the document.

Before adding the materials table and its naming, I searched the package for existing material, variable-lookup and name-deduplication helpers. The only one was the YAML variables resolver, which the naming now reuses.

Stacked on #52, which merges first.

Verification

  • Reproduced first: n/a, new schema and new behaviour
  • The 2-plate kite (rigid and particle) loaded and put back into its wing's frame gives its authored positions to 1e-12. The wing sits at [0, 0, 20] with the identity rotation, straight above the ground point at the origin.
  • The distances between every two of its points and bodies match SymbolicAWEModels' golden document, which its transforms placed at 50°, to 1e-12.
  • Every golden column still carried agrees cell by cell, and the 12 that moved are listed in the test. Each segment's material gives its golden density exactly and its stiffness to 1e-12. Its connectivity hash matches.
  • pos_KA reproduces the conventions page's worked example ([3, 6, 51] about [3, 4, 50], turned 90° about z, is [2, 0, 1]).
  • Both vendored V3 documents load and write back equal, also through YAML, JSON and a log. Every document written from authoring YAML validates against the vendored schema.
  • test/test-authoring.jl in the worktree session: 431 pass. That includes new tests: two materials of one law and different parameters get distinct names, and a Breukels tube's material is not the shared constant. Neither test was run against the code before the fix.
  • Local full suite (Pkg.test, Julia 1.13, one cell): red at 56535a0, Package LinearAlgebra not found in current path, because the test environment did not list a package the authoring test uses. Green after declaring it (1 min, exit 0). Rerun on the review fixes: pending.
  • Docs build clean; only the page-size warning main already has · up to date with Read a model column that holds one number or one per axis #52 and main
  • REUSE lint: not run locally (reuse is not installed on the box); CI runs it · GitHub CI: pending
  • Risk: the stand-in models in the tests say which columns SymbolicAWEModels must register. If its real models name them differently, its own documents will not load until they match.

Opened by 1-Bort-1, an AI agent working for @1-Bart-1.
Closes #53 · task KiteGeometry.jl-53

1-Bort-1 and others added 2 commits October 15, 2026 15:42
Re-vendors the schema and the V3 documents at 1-Bart-1/awesIO@99a36e2 and
regenerates the types: optional columns become fields that may be unset and
are written only where a row fills them, materials are a block segments,
tubes and a wing's canopy refer into, and a wing carries its KA frame.
pos_KA puts a world position into a wing's KA frame. The authoring loader
follows in the next commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
load_authoring writes segment stiffness and density as linear materials,
named after the variables mapping giving them, and a breukels2011 tube law as
a material with SAM's constants. A point's type becomes fixed and SAM's
column; drag, station, pulley and body types are read only by SAM's models.
Transforms only shift their members to the base position, so each wing's KA
frame is the authoring frame shifted, with the identity rotation, and the
transforms block stays as an extra.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@1-Bort-1 1-Bort-1 added agent:running Agent task state agent:ci Agent task state agent:queued Agent task state and removed agent:running Agent task state agent:ci Agent task state agent:queued Agent task state labels Oct 15, 2026

@1-Bort-1 1-Bort-1 left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Independent review (advisory)

Verdict: APPROVE WITH COMMENTS · 3 inline, 0 off the diff

Good

  • Tracks the plan: materials table, slimmer core, per-wing pos_ENU/Q_KA2ENU, kite at zenith with transforms kept as an extra block, and the BREAKING renames all appear in the generated types, the loader and the changelog fragment.
  • Generated header and AWESIO_VERSION match gen/awesio.toml (99a36e2, 0.1.0), so schema, generated file and pin agree.
  • model_value was moved, not lost: rg shows it in src/models.jl:69, used by both document.jl and authoring_model.
  • Rewriting resolve_material in Young's modulus keeps the damping the same: damping_per_stiffness * stiffness * area equals the old damping_per_stiffness * unit_stiffness.
  • Nothing was left orphaned when transforms stopped rotating: WingFrame/authored_frame are still used by wing_body_pose, and wrap2pi was dropped from the imports.
  • Point type and drag still reach SymbolicAWEModels through the stand-in models in the tests (POINT_MODEL_COLUMNS in test/test-authoring.jl:145), as the card says.

Not good

  • src/authoring.jl:482 — A nonlinear line material is always named after its law, but material! only reuses a row when law and parameters both match. Two segments with the same law and different densities therefore push two Material rows with the same name, which writes a document that breaks name uniqueness and makes the material reference ambiguous.
  • src/authoring.jl:804 — Every breukels2011 material holds the module-level BREUKELS2011 OrderedDict itself, not a copy. Any change to one document's material parameters therefore silently changes the constant for every later load.
  • src/authoring.jl:529 — extra_mass is forced to 0.0 when a row leaves it out (and passed as 0.0 for tether points at line 724). Every authored document therefore writes the optional column as zeros, against the card's 'left out, not written as zero'.
  • docs/src/structure.md:10-11: one paragraph is now half hard-wrapped (old line breaks, then one long line); §6 says prose is never hard-wrapped.
  • docs/src/structure.md:51 and :76 each gained several clauses in one paragraph; the authoring paragraph now repeats what the load_authoring docstring says (§7 accretion).
  • The variables block is resolved twice: yaml_variables(authored) at authoring.jl:850 redoes what resolve_yaml_variables just did; it could return the resolved variables instead.
  • load_authoring works out each wing's origin by diffing body_pos before and after place! (authoring.jl:873-875); Placement could record its own shift instead of the caller rebuilding it.
  • Every wing's Q_KA2ENU is written as identity, while the wing's body keeps the rotation from its reference points; if those points tilt the frame, the wing's KA and its body's KA disagree, and nothing tests that case.
  • Materials (load accumulator), Material (row type) and the materials keyword/field sit very close in name in one file; a name like MaterialTable would separate them.
  • The card does not say what was searched before adding Materials, material!, variable_name and yaml_variables (§2).
  • A linear material falls back to the first segment's name; that name could match a variable-named or law-named material and reuse the duplicate-name path below.

claude, rubric CLEAN_CODE.md. A different lab from the implementer
on purpose: a reviewer sharing its blind spots would not flag its mistakes.

Comment thread src/authoring.jl
Comment thread src/authoring.jl Outdated
Comment thread src/authoring.jl
The authoring test computes pairwise distances with LinearAlgebra.norm;
Pkg.test loads only what test/Project.toml lists, so it failed with
"Package LinearAlgebra not found in current path".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@1-Bort-1

1-Bort-1 commented Oct 15, 2026 •

Copy link
Copy Markdown
Member Author

Local full suite: PASS (2 min, Julia 1.13.0, one cell of the matrix)

Two materials of one law and different parameters, or a linear one
falling back to a name already taken, now get name_2, name_3, ...
A breukels2011 tube's material copies the module constant. The YAML
variables are resolved once. Materials is renamed MaterialTable, and
the structure page's authoring paragraph no longer repeats the
load_authoring docstring.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@1-Bort-1 1-Bort-1 added agent:ci Agent task state agent:review Agent task state and removed agent:running Agent task state agent:ci Agent task state labels Oct 15, 2026
Base automatically changed from agent/SymbolicAWEModels.jl-412 to main October 15, 2026 16:39
@1-Bort-1
1-Bort-1 marked this pull request as ready for review October 15, 2026 16:41
@1-Bort-1 1-Bort-1 added agent:ci Agent task state agent:review Agent task state and removed agent:review Agent task state agent:ci Agent task state labels Oct 15, 2026
@1-Bort-1
1-Bort-1 requested a review from 1-Bart-1 October 15, 2026 16:42
@1-Bort-1 1-Bort-1 added the priority Open work waits on this label Oct 15, 2026
@1-Bart-1
1-Bart-1 merged commit 7e9ba20 into main Oct 15, 2026
2 checks passed
@1-Bart-1
1-Bart-1 deleted the agent/53-kitegeometry-jl-each-wing-s-frame-read-w branch October 15, 2026 17:07
@1-Bort-1 1-Bort-1 added agent:done Agent task state and removed agent:review Agent task state labels Oct 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agent:done Agent task state priority Open work waits on this

Projects

None yet

Development

Successfully merging this pull request may close these issues.

KiteGeometry.jl: follow awesIO main — materials, the slimmer core, and each wing's frame

2 participants