Repository navigation
Read structure documents written against awesIO main (0.1.0), and draw their canopy faces - #10
Merged
Conversation
Vendor structure_schema.yml and the beam and PSM V3 examples from 1-Bart-1/awesIO@99a36e2, the merge of awesIO#36, and follow the schema: - tables carry units, so a block a file leaves out reads as empty with its required headers and units; - an optional column a file leaves out reads as absent, and tubes without a diameter are drawn as lines rather than cylinders; - a point's `fixed` marks the ground anchor the cone is drawn on; - stations are `spanwise_stations`; - canopy faces are drawn as a translucent surface, since the canopy springs the examples carried as segments are now faces; - connectivity_sha hashes the canopy faces as its third section. The viewer reads awesIO 0.1.0, so a run written at awesIO 1.0.0 is refused with a message naming both versions. The examples are vendored with their bare `-` units quoted: `[-, -, m]` is not valid YAML 1.2 and the yaml package refuses it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1-Bort-1
commented
Oct 18, 2026
1-Bort-1
left a comment
Member
Author
There was a problem hiding this comment.
Independent review (advisory)
Verdict: APPROVE WITH COMMENTS · 1 inline, 0 off the diff
Good
- The renames are carried through everywhere:
fixed→anchorPoints(parts.ts:106),stations→spanwise_stations(PointGroupBlock, pointPick),Q_KA2ENU/units in readBlocks defaults. Checked by grepping src and test for the old names; none remain. - Optional columns read as absent, as the card says:
optionalColumnValuesreturns undefined when the header is missing,tubeMatricesreturns [] then, and parts.test.ts covers it by deleting thediametercolumn and checking the tubes become lines with the same ends. - The connectivity hash gets one generalised
connectivitySection(n-aryjoinColumn, explicitcount) rather than a third copy for canopy faces. Tested against the schema's three-section worked example. tubeEndstakes over the body-row lookuptubeMatricesused to do inline, so cylinders and line fallback share one codepath.bodyRows/bodyPositionsstay single-sourced.- The card names every API-visible change (block name, palette entry, cone source), the vendored-fixture dash quoting and the 1.0.0-refusal message, and each one matches the diff.
- The
bodyRowsmissing-semicolon fix (parts.ts:116) is in-file tidy-up around the change and fits §1.
Not good
src/Structure.tsx:114—tubeEnds(run, frame)now runs twice per frame: once insidetubeMatrices(line 73) and again here, and here it also builds a line buffer that goes unused whenever cylinders are drawn. Passing the ends intotubeMatrices, or computing them once inTubes, removes the duplicated per-frame body averaging.- The minor-version rule only warns, and under 0.x semver a minor bump is breaking, so a 0.2.0 document is read with a warning. The card defers to the schema's rule, but the move to 0.x makes this question real and it deserves an issue.
- The anchor legend reads 'fixed point, the ground anchor' in the singular whatever
anchorCountis, while the tube and canopy swatches beside it give counts. - The canopy
<mesh>is mounted even whencanopy_facesis empty. It's harmless, but it doesn't match thefaceCount > 0guard the legend uses. - README prose stays hard-wrapped (§6 says one paragraph per line). This follows the file's existing style, so a
cleanup:PR is the right home, not this one. - The card doesn't name the
rgsearches done before addinganchorPoints,tubeEnds,canopyPositionsandoptionalColumnValues(§2).
claude, rubric CLEAN_CODE.md. A different lab from the implementer
on purpose: a reviewer sharing its blind spots would not flag its mistakes.
Tubes computed each tube's two ends twice per frame, once for the cylinders and once for the line fallback; tubeMatrices now takes the ends. The canopy mesh mounts only when there are faces, and the anchor legend counts its fixed points as the other swatches do. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1-Bort-1
marked this pull request as ready for review
October 18, 2026 13:41
11 of 12 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The viewer now reads the structure document awesIO
maindefines, the one SymbolicAWEModels writes through KiteGeometry. The schema and both V3 examples are vendored from 1-Bart-1/awesIO@99a36e2, the merge of 1-Bart-1/awesIO#36 and the commit KiteGeometry generates its types from, so both readers use the same schema. Before this, the viewer refused every such document, because it was built against an older schema.The renames are followed through: a point's
fixedflag now places the ground-anchor cone, and stations are read fromspanwise_stations. A column the schema makes optional and a file leaves out is read as absent, never as zero. A tube is still drawn as a cylinder at its diameter. Where a file gives tubes no diameter, they are drawn as plain lines between their bodies.The canopy has moved out of the line elements into canopy faces, so the beam kite only draws as it did before if those faces are drawn. They are now drawn as a translucent surface, with a palette colour and a legend entry of their own.
The version rule is the schema's own: a document whose major version is not the vendored schema's is refused, naming both versions. These documents are at awesIO 0.1.0, so one at awesIO 1.0.0 is refused with:
run.arrow is written against awesIO 1.0.0; this viewer reads the awesIO 0.1.0 schema, and so awesIO 0.x only. No run worth keeping was written against the old schema, so the viewer carries no second reader for it. A newer minor version is still only warned about; whether that should change while awesIO is below 1.0 is #11.The two examples are vendored with one edit: their bare
-units are quoted. As awesIO writes them (units: [-, -, m]) they are not valid YAML 1.2, and the YAML reader these tests use refuses them. Read with that edit, they hold the same data PyYAML reads from the originals. The one exception is a coordinate written1e-12, which PyYAML reads as a string. Both are passed on to 1-Bart-1/awesIO#30, which regenerates these examples.For code built on the viewer, three things change. A highlighted group's block is now named
spanwise_stationswhere it wasstations. The palette has acanopyentry. The cone is placed from thefixedflag rather than from the winch point. In both examples these are the same point.Before:
mainwith the beam document it vendors (awesIO@2568e27). After: this branch with the beam document from awesIO@99a36e2. Both use the same camera offset from the kite's centre, the same field of view and the same render code. The documents differ in one more way than the canopy: the new one places the kite at zenith, and the old one placed it at about 70° elevation, so the kite is tilted differently.Verification
main, both awesIOmainexamples are refused withv3_psm_structure is written against awesIO 0.1.0; this viewer reads awesIO 1.x onlytest/topology.test.ts,test/parts.test.ts: red onmain's code with the new examples (both files fail at load, on that error), green on this branch: 29 passed (vitest run, vitest, exit 0)mainbefore adding helpers (git grepforanchor|fixed|winch_point,tubeEnds|bodyPositions|tubeMatrices,canopy,optional|columnValues): the anchor lookup and the tube-end averaging existed inline and were moved out rather than copied; nothing on canopy faces or optional columns existedpnpm typecheckclean ·pnpm buildclean · up to date withmain1e-12abovevitest run, exit 0) ·tsc --noEmitclean · GitHub CI on Read structure documents written against awesIO main (0.1.0), and draw their canopy faces #10: PASSOpened by
1-Bort-1, an AI agent working for @1-Bart-1.Closes #9 · task
SymAWEViewer-9