Repository navigation
Conversation
Toggles over the 3D view colour segments on a diverging scale of spring force, with a legend in N, and draw aero and drag force arrows. Compute the framing once per run. It was rebuilt on every render, and each new target vector sent the camera back to the run's centre, so a toggle or a scrub undid any pan. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7 tasks
1-Bort-1
commented
Nov 3, 2026
1-Bort-1
left a comment
Member
Author
There was a problem hiding this comment.
Independent review (advisory)
Verdict: APPROVE WITH COMMENTS · 4 inline, 0 off the diff
Good
- Spring colouring meets #13:
forceColorsruns compression, zero, tension on a symmetric limit, and the legend gives scale and true range in N (read the code andtest/forces.test.tsx). - Sign convention is pinned to data: the test equates the winch-end tether segment with logged
winch_forceon the V3 fixture (test/forces.test.tsx:54). - Camera fix is sound by reading:
scenememoisescentreper run, soOrbitControlskeeps one target object across redraws (src/SymAWEViewer.tsx:127,:266). - Reading arrow positions from
X,Y,Zinstead ofrun.framesis not duplication:decodeRuncuts frames down to the points (src/topology.ts:217). - A force the run lacks is not offered: missing axis, all zeros and wrong slot or segment count each have a test.
- Leaving the selected-segment screenshot and spring force panel out fits #13, which asks only for forces on; #8 is the issue that wants the selection.
Not good
src/SymAWEViewer.tsx:126—shownForcesis not cleared by the load effect that resetshighlightandcursor, so changingsrcordataopens the next run with forces still on. This contradicts the card's 'All are off when a run opens' and has no test.src/quantities.ts:106—ARROW_COLUMNSis a second table of what columns hold, besideCOLUMNS, andspring_forceis named nowhere in the catalogue; #13 says to extendsrc/quantities.tsand not add a second catalogue. When #14 pins spring force as a panel, these names and labels will exist in two places.src/SymAWEViewer.tsx:127— The camera fix has no test that fails before it, which §8 requires of a bug fix; the card defers this to the DOM environment in #17. Nothing in CI stops the target from jumping again ifcentreloses its stable identity.src/SymAWEViewer.tsx:245— The toggle wiring is untested, including #13's 'role colours back when it is off', though §8 wants a test for new behaviour and #8's Done-when wants one per feature against V3. A brokenshownForcestosegmentColorslink would pass all 89 tests, so #17 must name this test.- The card does not say what was searched for (§2).
- The card does not name the cleanups
spanMatrix,Instances, thevectorRowschange inaeroQuantities, or therunOfextension (§1). forceColorsandarrowEndsrun inline in JSX, so every viewer render allocates new arrays and a newBufferAttribute, defeating theuseMemocalls inStructureandForceArrowsView.newtonLengthis a per-run constant recomputed each render and evaluates to -0 on a run with no arrows; it belongs inscene.ForceControlsignoresshowOverlay, so a host that hides the overlay still gets the box with no opt-out, and the card's 'Who it affects' does not say so.ForceControlsPropsandForceArrowsViewPropshave no doc comment (§4), andForceArrowsViewhas no README row of its own, leavingspanundocumented.aeroQuantitiesspells out the threeaero_force_*names whilerunForcesbuilds the same names fromXYZ.test/forces.test.tsxholds bothPOINTS = 44andpointCount, and itsrowshelper repeats the privatelistRows.- README and card disagree: README says off 'when a viewer opens', the card says 'when a run opens'.
- Drawing arrows on slots behind the points is a stated decision with no test, because no test run has a force there.
- The card admits its browser checks predate the last tidy and that GitHub CI was not read, so the final commit has no browser or CI evidence.
claude, rubric CLEAN_CODE.md. A different lab from the implementer
on purpose: a reviewer sharing its blind spots would not flag its mistakes.
A new src or data now opens with every force off, as the README says. Colours and arrows are computed only when the frame, toggles or run change, and the metres per newton once per run. The aero quantities and the arrows read force columns through one helper. Pins an arrow on a slot behind the points, and the longest arrow's share of the span. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.
Reading where a kite's lines carry load, or how aero and drag act on it, still meant going back to Makie. Three toggles over the 3D view now show this at the time cursor. Spring force colours each segment from compression through zero to tension, with a legend in N, and switching it off brings the role colours back. The other two draw aero force arrows and drag force arrows. All are off when a run opens, and a force the run does not hold is not offered.
Also fixed: the camera no longer jumps. Any redraw of the viewer sent the camera's target back to the centre of the run. A scrub undid any pan on the base branch, and each toggle would have done the same. The target now stays where you put it.
Decisions
Also tidied. A search of the base for spring, arrow and force found only the aero panels, which read the same columns, so both now read them one way. Tubes and arrows now share the code that places them. The test helper that builds a one-frame run can now add columns.
What it does not cover. At the opening camera the kite sits at the top edge of the view, so aero arrows leave the frame until you orbit or zoom; I left that camera alone. Selecting a segment arrives with #14, so these screenshots show none, and the screenshot #8 asks for with a segment selected belongs there. Spring force is not yet a 2D panel; #14 carries that too.
Who it affects. The palette type has five new colours, so a host building a complete palette object must add them; a partial one is unaffected. A host that hides the overlay still gets the toggles, because they are controls like the scrubber rather than part of that read-out. With forces off, the opening view matches the base branch apart from the new toggle box and faint text smoothing in the panels.
Stacked on #19, which merges first.
Verification
test/forces.test.tsxagainst the V3 fixture: red before (Cannot find module '../src/ForceControls'), 28 passed after. It pins tension as positive: the winch-end tether segment equals the logged winch force. The test for a force behind the points failed when arrows were cut off at the points (expected [] to deeply equal [ 1, 2, 3, 6, 7, 8 ]).tscboth configs clean,pnpm buildclean. The repo has noCHANGELOG.md, so the README carries the change.At phone width
Opened by
1-Bort-1, an AI agent working for @1-Bart-1.Closes #13 · task
SymAWEViewer-13Refs #8