FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
Review issues — fhsim_base

Findings from code review that await an owner decision or an implementation. Each issue is one file in issues/details/, which holds the evidence, the effect, the possible fix, the test that would prove it and the risk. Resolved issues are kept in issues/resolved/ so that their numbers are never reused. Issues that concern a SimObject are also shown on that model's documentation page. Audit notes that are not issues are in issues/notes.md.

How to work an item

  1. Reproduce the Evidence at the file:line given in the detail file, at HEAD.
  2. For a blocked item, get the owner's answer to "Decision needed" first, then set Status to ready.
  3. Write the proving test, apply the fix, check the Risk paragraph.
  4. git mv the file to issues/resolved/, add a **Resolved:** <commit>, <date> paragraph after the table, delete the matching \xrefitem reviewissue "Review issues" "Review issues" \ref fhsim_base_issue_<ID> lines from the headers, rerun the script and commit it all together.

New issue: --new <slug> "<title>", or add issues/details/<slug>.md with the metadata table but no ID row; the script assigns the next free number, writes the heading and renames the file to <TAG>-<ID>-<slug>.md.

Legend

  • Class
    • BUG code does something other than its documentation or sibling code says
    • KNOWN-LIMITATION behaviour gap by design or omission, document rather than fix silently
    • ARCHITECTURE structure, dependencies, build layout, dead code and stale artefacts
    • DOCUMENTATION missing or wrong documentation or example
    • TEST test coverage or infrastructure
    • API public name (port, state, parameter, registration string) whose change breaks input files
    • SECURITY credentials and supply chain
  • Severity
    • 3 wrong numbers, a crash or a secret exposure reaches a user
    • 2 a documented interface does not work as documented
    • 1 tidiness, readers and tools only
  • Status
    • blocked needs the owner decision named in the file
    • ready fully specified

Open issues (2)

ID Class Severity Status
BASE-0064 ARCHITECTURE 1 ready
BASE-0065 ARCHITECTURE 1 ready

Resolved issues (76)

  • BASE-0001 (API) — TorpedoAnchor registers its angular-velocity output port as lowercase omega. Resolved: 4fa41d3, 2026-09-16. File: resolved/BASE-0001-torpedoanchor-omega-port-lowercase.md
  • BASE-0002 (BUG) — TorpedoAnchor documents a ShankFlukeAngle parameter it never reads. Resolved: e2dad78, 2026-09-15. File: resolved/BASE-0002-torpedoanchor-documents-a-shankflukeangle-parameter.md
  • BASE-0003 (DOCUMENTATION) — CLinearSpring documents two output ports it never registers. Resolved: e58d24e, 2026-09-15. File: resolved/BASE-0003-clinearspring-documents-two-output-ports.md
  • BASE-0004 (DOCUMENTATION) — CLowPass claims no initial conditions but seeds its state from its input. Resolved: 8a8d9e6, 2026-09-15. File: resolved/BASE-0004-clowpass-claims-no-initial-conditions.md
  • BASE-0005 (DOCUMENTATION) — Shipped models say LibName="base", all documentation says LibName="fhsim_base". Resolved: 4fa41d3, 2026-09-16. File: resolved/BASE-0005-libname-base-versus-fhsim-base.md
  • BASE-0006 (DOCUMENTATION) — CNorrbinTanker's option tables are an unfilled template. Resolved: 22efd02, 2026-09-15. File: resolved/BASE-0006-cnorrbintankers-option-tables-are-an-unfilled.md
  • BASE-0007 (BUG) — KalmanPendulum documents AngleVelocityNoise; the code reads AngularVelocityNoise, and MeasurementNoise is undocumented. Resolved: d718b26, 2026-09-15. File: resolved/BASE-0007-kalmanpendulum-documents-anglevelocitynoise-the-code-reads.md
  • BASE-0008 (API) — C6DBody: registered state name Quater — keep or rename?. Resolved: a2da710, 2026-09-16. File: resolved/BASE-0008-c6dbody-quater-state-name.md
  • BASE-0009 (DOCUMENTATION) — CDistArrow and CSimpleBillboardArrow document TextSize; both read TxtSize. Resolved: 939afb4, 2026-09-15. File: resolved/BASE-0009-cdistarrow-and-csimplebillboardarrow-document-textsize-both.md
  • BASE-0010 (DOCUMENTATION) — CCameraController2 documents a Times parameter; the code reads Time. Resolved: 939afb4, 2026-09-15. File: resolved/BASE-0010-ccameracontroller2-documents-a-times-parameter.md
  • BASE-0011 (BUG) — CDistArrow binds its PosA and PosB input ports to the opposite members. Resolved: 4fa41d3, 2026-09-16. File: resolved/BASE-0011-cdistarrow-posa-posb-swapped.md
  • BASE-0012 (DOCUMENTATION) — CIntegrator has an undocumented ICFromPort parameter and a conditional IC input port. Resolved: 8a8d9e6, 2026-09-15. File: resolved/BASE-0012-cintegrator-has-an-undocumented-icfromport-parameter.md
  • BASE-0013 (DOCUMENTATION) — VirtualCurrent reads an undocumented MaximumCurrent parameter. Resolved: dfbac9c, 2026-09-15. File: resolved/BASE-0013-virtualcurrent-reads-an-undocumented-maximumcurrent-parameter.md
  • BASE-0014 (DOCUMENTATION) — CSignalList reads an undocumented PortWidth parameter. Resolved: dfbac9c, 2026-09-15. File: resolved/BASE-0014-csignallist-reads-an-undocumented-portwidth-parameter.md
  • BASE-0015 (DOCUMENTATION) — HydroCable registers two undocumented output ports PosA and PosB. Resolved: e58d24e, 2026-09-15. File: resolved/BASE-0015-hydrocable-registers-two-undocumented-output-ports.md
  • BASE-0016 (ARCHITECTURE) — Samplifier registers a SamplifierDummy state while documenting no initial conditions. Resolved: 8a8d9e6, 2026-09-15. File: resolved/BASE-0016-samplifier-registers-a-samplifierdummy-state-while.md
  • BASE-0017 (DOCUMENTATION) — The visualisation-only Material parameter is undocumented in three classes. Resolved: e2dad78, 2026-09-15. File: resolved/BASE-0017-the-visualisation-only-material-parameter.md
  • BASE-0018 (DOCUMENTATION) — CDemux's parameter table misspells the OutPortWidth<N> range. Resolved: dfbac9c, 2026-09-15. File: resolved/BASE-0018-cdemuxs-parameter-table-misspells-the-outportwidth.md
  • BASE-0019 (BUG) — FlukeAnchor registers its quaternion state with no default, unlike TorpedoAnchor. Resolved: 4fa41d3, 2026-09-16. File: resolved/BASE-0019-flukeanchor-quaternion-no-default.md
  • BASE-0020 (DOCUMENTATION) — Indexed states are documented as Name[i] but registered as Name1 .. NameN. Resolved: 1c6ea37, 2026-09-15. File: resolved/BASE-0020-indexed-states-are-documented-as-name.md
  • BASE-0021 (BUG) — Jacobian callbacks are indexed with global state offsets, so they are wrong for any object that is not first. Resolved: 17344c0, 2026-09-24. File: resolved/BASE-0021-jacobian-callbacks-indexed-with-global-state-offsets.md
  • BASE-0022 (TEST) — CSignalList, CLinearMapping and CProgressBar have no automated test. Resolved: 09ea1c0, 2026-09-24. File: resolved/BASE-0022-base-blocks-no-test.md
  • BASE-0023 (TEST) — The seven camera and billboard SimObjects have no automated test. Resolved: 57e7cfa, 2026-09-24. File: resolved/BASE-0023-base-camera-visual-no-test.md
  • BASE-0024 (TEST) — CIntegrator and CLinearSystem port Jacobians are never checked against a connected neighbour. Resolved: f54c324, 2026-09-24. File: resolved/BASE-0024-base-integrator-linearsystem-port-jacobians-untested.md
  • BASE-0025 (BUG) — C6DBody's analytic Jacobian omits the gravity/quaternion coupling its ODE has, and the check is disabled. Resolved: 0d69b27, 2026-09-24. File: resolved/BASE-0025-base-c6dbody-jacobian-omits-gravity-rotation.md
  • BASE-0026 (TEST) — CBall's Auto Jacobian check never perturbs into the contact regime its Jacobian omits. Resolved: b927e0e, 2026-09-24. File: resolved/BASE-0026-base-cball-jacobian-check-never-engages-contact.md
  • BASE-0027 (TEST) — TorpedoAnchor and FlukeAnchor's partial Jacobians are never checked, even for the implemented terms. Resolved: d125782, 2026-09-24. File: resolved/BASE-0027-base-torpedoanchor-flukeanchor-jacobian-unverified.md
  • BASE-0028 (TEST) — CNorrbinTanker's Jacobian check is disabled, so the implemented terms are never verified. Resolved: 6583d80, 2026-09-24. File: resolved/BASE-0028-base-norrbintanker-jacobian-and-baseline-unverified.md
  • BASE-0029 (TEST) — Nine Example/Kalman/Adaptive SimObjects have zero automated test coverage. Resolved: 9cb9889, 2026-09-24. File: resolved/BASE-0029-base-nine-simobjects-zero-test-coverage.md
  • BASE-0030 (TEST) — Samplifier's regression test is disabled over a cross-platform random-number discrepancy. Resolved: 0aefb86, 2026-09-24. File: resolved/BASE-0030-base-samplifier-test-disabled-cross-platform-rng.md
  • BASE-0031 (ARCHITECTURE) — Six commented-out ADD_SIMOBJECT_REF lines reference dead or nonexistent classes. Resolved: 4d1ccd6, 2026-09-24. File: resolved/BASE-0031-base-dead-simobject-registration-comments.md
  • BASE-0032 (TEST) — CNorrbinTanker's regression baseline may be an unvalidated placeholder. Resolved: d945958, 2026-09-24. File: resolved/BASE-0032-base-norrbintanker-baseline-placeholder.md
  • BASE-0033 (BUG) — Ten more SimObjects index their OdeJacobian with global state offsets, as BASE-0021 did. Resolved: 5ba98d3, 2026-09-24. File: resolved/BASE-0033-jacobian-global-offsets-in-ten-more-simobjects.md
  • BASE-0034 (BUG) — C6DBody's quaternion rows are about twice what finite differences give. Resolved: 73238fb, 2026-09-24. File: resolved/BASE-0034-c6dbody-quaternion-jacobian-twice-finite-difference.md
  • BASE-0035 (KNOWN-LIMITATION) — Cable's Jacobian omits the drag derivatives, and two test inputs start the end segments on the slack/taut kink. Resolved: 132936e, 2026-09-24. File: resolved/BASE-0035-cable-jacobian-omits-drag-and-ic-on-kink.md
  • BASE-0036 (BUG) — CNorrbinTanker's derivative is NaN next to u = 0, and a moving start integrates to NaN within milliseconds. Resolved: 9178605, 2026-09-24. File: resolved/BASE-0036-norrbintanker-nan-at-rest-and-from-moving-state.md
  • BASE-0037 (BUG) — BillboardArrow's destructor deletes uninitialised pointers when RenderInit never ran. Resolved: 57e7cfa, 2026-09-24. File: resolved/BASE-0037-billboardarrow-deletes-uninitialised-pointers-without-rendering.md
  • BASE-0038 (BUG) — CameraShot dereferences an uninitialised screenshot manager when RenderInit never ran. Resolved: 57e7cfa, 2026-09-24. File: resolved/BASE-0038-camerashot-crashes-without-rendering.md
  • BASE-0039 (KNOWN-LIMITATION) — HydroCable and CablePendulum Jacobians omit the drag derivatives. Resolved: db76853, 2026-09-24. File: resolved/BASE-0039-hydrocable-cablependulum-jacobian-omits-drag.md
  • BASE-0040 (BUG) — VirtualCurrent and CablePendulum crash when the model has no Environment. Resolved: 9cb9889, 2026-09-24. File: resolved/BASE-0040-virtualcurrent-cablependulum-crash-without-environment.md
  • BASE-0041 (BUG) — CBall caches its forces by time alone, so a second evaluation at the same time with other states returns stale forces. Resolved: 4d11065, 2026-09-24. File: resolved/BASE-0041-cball-force-cache-keyed-on-time-only.md
  • BASE-0042 (BUG) — Six SimObjects read input ports inside OdeJacobian with their local state slice. Resolved: 2d949b2, 2026-09-24. File: resolved/BASE-0042-jacobian-port-reads-use-local-state-slice.md
  • BASE-0043 (BUG) — CNorrbinTanker's sway force uses Yuvz for Yvvz, and applies Yuvz in deep water. Resolved: 67de080, 2026-09-24. File: resolved/BASE-0043-norrbintanker-sway-shallow-water-terms.md
  • BASE-0044 (BUG) — CNorrbinTanker ignores the shallow-water added mass Xduz, Ydvz and Ndrz. Resolved: 321fb66, 2026-09-24. File: resolved/BASE-0044-norrbintanker-shallow-water-added-mass-unused.md
  • BASE-0045 (DOCUMENTATION) — CNorrbinTanker does not say the units of its EngineRPM state or its Engine input. Resolved: f851e41, 2026-09-24. File: resolved/BASE-0045-norrbintanker-shaft-speed-units-undocumented.md
  • BASE-0046 (DOCUMENTATION) — README names the test conf tools.build:skip_tests, which Conan rejects. Resolved: see commit "Name the Conan test switch tools.build:skip_test in the README", 2026-09-26. File: resolved/BASE-0046-readme-skip-tests-conf-name.md
  • BASE-0047 (BUG) — CNorrbinTanker loads tanker.scene by default, which no repository ships, so the tanker is invisible. Resolved: see commit "Draw the tanker with the shipped hull mesh when no Scene is given", 2026-09-26. File: resolved/BASE-0047-norrbintanker-default-scene-missing.md
  • BASE-0048 (BUG) — CNorrbinTanker applies ScaleX/Y/Z to a loaded scene's root node and again to each of its child nodes. Resolved: 99b71e6, 2026-09-30. File: resolved/BASE-0048-norrbintanker-scene-scale-applied-twice.md
  • BASE-0049 (BUG) — CNorrbinTanker does not report an unknown ModelType and silently uses the bernica data. Resolved: 99b71e6, 2026-09-30. File: resolved/BASE-0049-norrbintanker-unknown-modeltype-silently-bernica.md
  • BASE-0050 (DOCUMENTATION) — CHANGELOG and testing report say the tests need fhsim/3.2.0@sintef/jaccheck; fhsim/3.2.0@sintef/stable already has scopeOverrides. Resolved: b303e2f, 2026-09-30. File: resolved/BASE-0050-changelog-claims-tests-need-jaccheck-fhsim.md
  • BASE-0051 (ARCHITECTURE) — fhsim_base 4.0.1 requires fhsim_environment/[^3.2.0]; consumers of fhsim_environment 4.0 conflict. Resolved: see commit "fhsim_base admits fhsim_environment 4: requirement widened to [>=3.2.0 <5] (BASE-0051)", 2026-09-28. File: resolved/BASE-0051-fhsim-environment-4-range-conflict.md
  • BASE-0052 (ARCHITECTURE) — Installed headers include fhsim_environment, but the requirement does not propagate its headers. Resolved: e7913c2, 2026-09-30. File: resolved/BASE-0052-environment-headers-not-transitive.md
  • BASE-0053 (DOCUMENTATION) — The fhsim_environment range admits two wake semantics, and the CHANGELOG says only "No source change". Resolved: b303e2f, 2026-09-30. File: resolved/BASE-0053-changelog-silent-on-wake-semantics.md
  • BASE-0054 (KNOWN-LIMITATION) — Base objects take water density from the environment, fixed at 1025, while net and fishery objects have a Rho parameter. Resolved: 774b4c8, 2026-09-30. File: resolved/BASE-0054-water-density-not-configurable.md
  • BASE-0055 (BUG) — Cable gives NaN forces for a segment at rest on the seabed. Resolved: see commit "Fix the seabed NaN, the wave-elevation sign and the polyplate water-velocity frame; file BASE-0058 to BASE-0066", 2026-09-28. File: resolved/BASE-0055-cable-nan-at-rest-on-seabed.md
  • BASE-0056 (BUG) — Cable and CHydroCylinder test "in water" with the wrong sign of the wave elevation. Resolved: see commit "Fix the seabed NaN, the wave-elevation sign and the polyplate water-velocity frame; file BASE-0058 to BASE-0066", 2026-09-28. File: resolved/BASE-0056-wave-elevation-sign-in-cable-and-cylinder.md
  • BASE-0057 (BUG) — Polyplate hydrodynamics subtracts a body-frame velocity from a global water velocity. Resolved: see commit "Fix the seabed NaN, the wave-elevation sign and the polyplate water-velocity frame; file BASE-0058 to BASE-0066", 2026-09-28. File: resolved/BASE-0057-polyplate-water-velocity-frame.md
  • BASE-0058 (KNOWN-LIMITATION) — Surface piercing in Cable and the rigid bodies: a step at the mean or wave surface, no shape-correct submerged volume. Resolved: see commit "Cable, CHydroCylinder and the polyplate submerge against the wave surface with their shape (R66)", 2026-09-28. File: resolved/BASE-0058-surface-piercing-against-mean-surface.md
  • BASE-0059 (KNOWN-LIMITATION) — Base Cable and rigid bodies ignore the water particle acceleration: no Froude–Krylov or added-mass excitation in waves. Resolved: see commit "Cable takes the Froude-Krylov and added-mass wave excitation (R67)", 2026-09-28. File: resolved/BASE-0059-no-froude-krylov-excitation.md
  • BASE-0060 (BUG) — Cable applies the normal drag coefficient along the axis; the axial drag drops sevenfold near 1.7°. Resolved: see commit "Cable's axial drag is skin friction (R68)", 2026-09-28. File: resolved/BASE-0060-cable-tangential-drag-equals-normal.md
  • BASE-0061 (BUG) — Cable's Cd(Re) fit is discontinuous at Re = 14, and its constant differs from the one in TrawlCable. Resolved: 7af1a35, 2026-10-04. File: resolved/BASE-0061-cable-drag-fit-discontinuous-at-re-14.md
  • BASE-0062 (BUG) — CHydroCylinder's axial added mass uses the integer division 4 / 3 = 1. Resolved: see commit "CHydroCylinder's axial added mass is (4/3) rho pi R^3 (R73)", 2026-09-28. File: resolved/BASE-0062-hydrocylinder-axial-added-mass-integer-division.md
  • BASE-0063 (BUG) — CHydroCylinder's Gauss quadrature doubles the lateral load, and its end-face drag has an extra length. Resolved: 6f912fe, 2026-09-30. File: resolved/BASE-0063-hydrocylinder-gauss-quadrature-doubles-load.md
  • BASE-0066 (BUG) — Polyplate soil forces place the submerged centroid with q.conjugate(), the inverse rotation. Resolved: see commit "Polyplate soil forces sample the seabed with q, not its inverse (R74)", 2026-09-28. File: resolved/BASE-0066-polyplate-soil-centroid-rotated-with-conjugate.md
  • BASE-0067 (KNOWN-LIMITATION) — The anchors' rigid bodies have no buoyancy: CRigidCylinder and CRigidPolyplate apply their dry weight in water. Resolved: see commit "The anchors' shank and flukes carry the buoyancy of their wetted volume (R94)", 2026-09-28. File: resolved/BASE-0067-anchors-rigid-bodies-have-no-buoyancy.md
  • BASE-0068 (KNOWN-LIMITATION) — Cable's node inertia has no added mass: the R67 wave excitation acts without the added-mass reaction. Resolved: see commit "Cable's nodes carry the added mass of their wetted half-segments (R93)", 2026-09-28. File: resolved/BASE-0068-cable-no-added-mass-in-node-inertia.md
  • BASE-0069 (BUG) — Polyplate soil skin friction divides by a zero in-plane speed: NaN forces for a fluke at rest in the seabed. Resolved: see commit "Polyplate soil friction has direction 0 at rest, not 0/0 (BASE-0069)", 2026-09-28. File: resolved/BASE-0069-polyplate-soil-friction-nan-at-rest.md
  • BASE-0070 (BUG) — Cable's node mass is cableLength/numElements of cable while its loads come from numElements+1 segments: a free cable falls at g N/(N+1). Resolved: see commit "Cable's free nodes carry one segment's mass, as its loads are lumped (R96)", 2026-09-28. File: resolved/BASE-0070-cable-node-mass-and-segment-loads-disagree.md
  • BASE-0071 (TEST) — Template-Input_Cable samples an arbitrary phase of an undamped ringing: its baseline jumps with every inertia change. Resolved: see commit "Template-Input_Cable compares resolved and settled forces (R97)" and "Baselines for R97", 2026-09-28. File: resolved/BASE-0071-template-input-cable-samples-a-ringing-phase.md
  • BASE-0072 (BUG) — C6DBody integrates its body-frame velocities without the rigid-body ω × terms. Resolved: see commit "C6DBody integrates with the rigid-body omega terms (R100)", 2026-09-28. File: resolved/BASE-0072-c6dbody-missing-rigid-body-omega-terms.md
  • BASE-0073 (BUG) — CHydroCylinder pairs the three-point Gauss-Legendre weights with the two-point nodes ±1/√3. Resolved: e97f462, 2026-09-30. File: resolved/BASE-0073-hydrocylinder-gauss-nodes-are-two-point.md
  • BASE-0074 (BUG) — CablePendulum divides the cable's pull on the ball by the cable's mass. Resolved: dbb159c, 2026-10-04. File: resolved/BASE-0074-cablependulum-ball-accelerated-by-cable-mass.md
  • BASE-0075 (BUG) — CablePendulum's MidpointPosition is one internal point too far down for an odd count, and out of range for one. Resolved: d22aa6e, 2026-10-04. File: resolved/BASE-0075-cablependulum-midpoint-off-by-one.md
  • BASE-0076 (BUG) — Cable's normal drag acts on the full relative velocity and overstates the axial drag in oblique flow. Resolved: 33feee4, 2026-10-04. File: resolved/BASE-0076-cable-normal-drag-on-full-relative-velocity.md
  • BASE-0077 (BUG) — HydroCable and CablePendulum's cable drag scales both components with |v| (1.1 w_perp + 0.1 w_par). Resolved: f742789 (fix), b04a076 (baselines), 2026-10-04. File: resolved/BASE-0077-hydrocable-cablependulum-drag-not-independence.md
  • BASE-0078 (KNOWN-LIMITATION) — Sink/Progress rewrites its output file on every accepted step. Resolved: commits "Sink/Progress writes its file only when the percentage changes (BASE-0078)" (99c2559) and "Sink/Progress writes its file at most every 0.5 s and at the end (BASE-0078)", 2026-10-11. File: resolved/BASE-0078-progress-file-write-per-step.md