Skip to content
This repository was archived by the owner on Oct 17, 2026. It is now read-only.

Port Craig–Bampton models to the SciML 3 stack - #216

Closed
ChrisRackauckas wants to merge 9 commits into
mainfrom
cb2-sciml3
Closed

ChrisRackauckas wants to merge 9 commits into
mainfrom
cb2-sciml3

Conversation

@ChrisRackauckas

@ChrisRackauckas ChrisRackauckas commented Oct 14, 2026 •

Copy link
Copy Markdown
Member

🚧 UNREVIEWED — awaiting review by @ChrisRackauckas. Opened by an AI agent running as @ChrisRackauckas; Chris has not reviewed this change. Please ignore until he has.
Harness: Codex CLI 0.162.1 · Model: gpt-6.1-sol
Session: codex session 01a1372e-c8ea-7d12-a35c-2e157ee90e3d (local)

@baggepinnen: this includes your five cb2 commits through bb28790. Please decide, after Chris reviews it, whether to merge it or fold the port into cb2.

The branch ports Craig–Bampton and Multibody to SciMLBase 3, ModelingToolkit ≥11.40 and OrdinaryDiffEq v2 subpackages. Version 0.4.0 covers the public behavior changes listed below. Fredrik's original two-boundary sloshing model is restored, including the free top boundary's stabilizing mass and stiffness; the complete example is identical to cb2 and uses normal initialization.

Verification

All Julia jobs are serial with JULIA_NUM_PRECOMPILE_TASKS=4 JULIA_NUM_THREADS=4, Julia +1.12.6, --startup-file=no, a load check that holds launches above 24, and the shared flock /tmp/claude-1000/-home-crackauc-sandbox-tmp-20260922-235304-89102/scratchpad/julia.lock. DISPLAY=:1 exists and is used where needed.

Run Pass Fail Error Inherited broken
Untouched fair cb2 full suite 34 4 18 0
Separate cb2 supplemental groups 34 5 15 2
Round-2 port full suite 1623 33 3 7
Round-3 final full suite 1625 31 3 7
Craig–Bampton in final suite 1124 0 0 0

The untouched cb2 run aborts before the basic tests; the supplemental counts are separate and are not summed. The fair graph is SC2.155.2, MTK11.26.8/Base1.42.2, ODE6.111.0/Default1.14/Rosenbrock1.31.1/NonlinearSolve1.28/Tsit5 1.12. The new full-suite graph is SC3.57.0, MTK11.45.3/Base1.77.4, ODE7.8.1/Default2.6.2/Rosenbrock2.7.5/NonlinearSolve2.9.9/Tsit5 2.1.5.

Commands from work/mb-port, each under the shared flock and load guard:

timeout 14400 julia +1.12.6 --startup-file=no --project=round2/old-env -e 'using Pkg; Pkg.test("Multibody"; allow_reresolve=false)'
timeout 14400 julia +1.12.6 --startup-file=no --project=round2/new-env -e 'using Pkg; Pkg.test("Multibody"; allow_reresolve=false)'
timeout 1800 julia +1.12.6 --startup-file=no --project=integration Multibody.jl/examples/sloshing_tank_cart.jl

The restored two-boundary sloshing command exits 0: Simulation complete: Success, on MTK 11.40.0, OrdinaryDiffEqDefault 2.4.5 and SC3.57.0. The model reduction to one boundary was unnecessary and is reverted.

Corrected attribution: all 36 round-2 red checks

15 a, 7 b, 14 unresolved, 0 c found. Two b checks are repaired in round 3; the final 34 red entries are 15 a / 5 b / 14 unresolved / 0 c found. Thirteen unresolved checks are the ropes, Universal pendulum, wheels and SS/US cases identified by Opus; the exact JointUSR_RRR error also lacks a usable old-stack reference. Unresolved checks have no a/b/c label. An old red block or a source comparison alone does not establish causality.

Attribution of the 36 round-2 red checks

Reference lines and IDs are at 6435c80. Categories: a = observed pre-existing failure; b = observed new-stack behavior with old-port controls where available; c = port-edit regression; unresolved = no discriminating old-stack reference. No c failure was found by Opus. Rows 26–27 are repaired in round 3; all original assertions/tolerances remain.

ID File:line / testset Assertion or error Class Round-3 evidence / status
1 test_quaternions.jl:50 / Harmonic oscillator with Body as root and quaternions as state variables sol(float(pi), idxs = body.r_0[2]) < -2 a Old/new quaternion oscillator diagnostic has NaN RHS at analytical limit 3; direct fair baseline is blocked by prerequisite API errors.
2 test_worldforces.jl:136 / worldforces ≈(sol(1, idxs = testwf.body.frame_a.r_0), [0.572800369240885, 0.4946715021692289, 0.0], atol = 0.001) b Opus: OLD-CB2 and OLD-PORT pass with SCC=0; NEW fails. Our NEW probe returns DtNaN at t=0. Source-edit regression excluded by old-port control.
3 test_worldforces.jl:180 / worldforces ≈(sol(1, idxs = testwf.body.frame_a.r_0), [0.9419246090353689, -0.23388592078659548, 0.0], atol = 0.001) b Same three-configuration result as row 2; NEW DtNaN at t=0. Owner/root cause not reduced.
4 test_worldforces.jl:536 / worldforces ≈(sol(1, idxs = testwf.body.r_0), [0, 0.0, 0.0], atol = 0.001) a Opus reproduces same wrong endpoint value on OLD-CB2, OLD-PORT and NEW.
5 test_worldforces.jl:543 / worldforces ≈(sol(1, idxs = testwf.body.frame_a.r_0), [-0.9300324062366484, 0.25508128572301375, 0.0], atol = 0.001) a Opus reproduces matching wrong endpoint family on all three configurations.
6 test_PlanarMechanics.jl:417 / SimpleWheel SciMLBase.successful_retcode(sol) a Same check/error was observed in the old-stack comparison; Opus did not rerun this row.
7 test_PlanarMechanics.jl:492 / SlipBasedWheel ≈(sol(15, idxs = [ssys.slipBasedWheelJoint.f_lat, ssys.slipBasedWheelJoint.f_long]), [80, -5], rtol = 0.01) a Same check/error was observed in the old-stack comparison; Opus did not rerun this row.
8 test_PlanarMechanics.jl:493 / SlipBasedWheel ≈(sol(20, idxs = [ssys.slipBasedWheelJoint.f_lat, ssys.slipBasedWheelJoint.f_long]), [80, -4.95], rtol = 0.01) a Same check/error was observed in the old-stack comparison; Opus did not rerun this row.
9 test_PlanarMechanics.jl:720 / OneDOFRollingWheelJoint ≈(sol(2pi, idxs = ssys.wheelJoint.frame_a.fy), 0.1 * 9.82, atol = 0.001) a Same check/error was observed in the old-stack comparison; Opus did not rerun this row.
10 test_PlanarMechanics.jl:724 / OneDOFSlippingWheelJoint SystemError: opening file "/home/crackauc/sandbox/tmp_20260922_235304_89102/work/mb-port/Multibody.jl/test/test_OneDOFSlippingWheelJoint.jl": No such file or directory a Same check/error was observed in the old-stack comparison; Opus did not rerun this row.
11 basic_tests.jl:58 / spring - harmonic oscillator SciMLBase.successful_retcode(sol) a Opus: default analytical limit 3 gives NaN; limit 0 passes OLD-CB2, OLD-PORT and NEW. Default retained; finding for Fredrik.
12 basic_tests.jl:62 / spring - harmonic oscillator sol(float(pi), idxs = body.r_0[2]) < -2 a Same identified analytical-SCC cause as row 11.
13 basic_tests.jl:111 / Simple pendulum norm(sol[powersensor.power.u]) < 1.0e-14 b Same check/error was observed in the old-stack comparison; Opus did not rerun this row.
14 basic_tests.jl:403 / Spring damper system SciMLBase.successful_retcode(sol) a Opus: analytical limit 0 passes on all three configurations. Default 3 retained; identified pre-existing finding.
15 basic_tests.jl:416 / Spring damper system SciMLBase.successful_retcode(sol) a Same identified analytical-SCC cause as row 14.
16 basic_tests.jl:478 / Three springs SciMLBase.successful_retcode(sol) a Opus: fails on every configuration, including SCC=0.
17 basic_tests.jl:649 / Universal pendulum SciMLBase.successful_retcode(sol2) unresolved OLD-CB2 cannot convert axis vector to Float64; OLD-PORT NaN; NEW geometry norm is wrong. No usable reference.
18 basic_tests.jl:651 / Universal pendulum norm(sol2(0, idxs = [body.r_0...])) ≈ 1 unresolved Same blocked-reference Universal-pendulum case as row 17.
19 basic_tests.jl:652 / Universal pendulum norm(sol2(10, idxs = [body.r_0...])) ≈ 1 unresolved Same blocked-reference Universal-pendulum case as row 17.
20 test_wheels.jl:100 / wheels SciMLBase.successful_retcode(sol) unresolved Both old configurations stop earlier at test_wheels.jl:42 with SingularException(19); no old reference for this check.
21 test_wheels.jl:102 / wheels ≈(sol(4, idxs = [ssys.wheel.x; ssys.wheel.z]), [0.162547, -2.23778], atol = 0.001) unresolved Both old configurations stop earlier at test_wheels.jl:42 with SingularException(19); no old reference for this check.
22 test_wheels.jl:121 / wheels ≈(sol(tv, idxs = ssys.wheel.body.r_0[1]), sol(tv, idxs = ssys.wheel.body.r_0[2]) .- 0.3 * sqrt(2), rtol = 1.0e-6) unresolved Both old configurations stop earlier at test_wheels.jl:42 with SingularException(19); no old reference for this check.
23 test_wheels.jl:126 / wheels abs(dd[1]) > 5 unresolved Both old configurations stop earlier at test_wheels.jl:42 with SingularException(19); no old reference for this check.
24 test_wheels.jl:220 / wheels SciMLBase.successful_retcode(sol) unresolved Both old configurations stop earlier at test_wheels.jl:42 with SingularException(19); no old reference for this check.
25 test_wheels.jl:222 / wheels ≈(sol(0:0.1:1, idxs = [ssys.wheels.x, ssys.wheels.z]), [0.1 0.0611068 -0.0658862 -0.270161 -0.519216 -0.741042 -0.834663 -0.820189 -0.821855 -0.862654 -0.888457; 0.1 0.101768 0.122277 0.1697 unresolved Both old configurations stop earlier at test_wheels.jl:42 with SingularException(19); no old reference for this check.
26 basic_tests.jl:769 / FreeMotion ≈(y, (-9.81 / 2) .* (0:0.1:10) .^ 2, atol = 0.01) b (fixed) Contradictory body.w_a=[0,1,0] vs joint phid=zeros(3). Drop the redundant body IC; unchanged free-fall assertion passes (4/4 focused). Correct-test input repair, not weakening.
27 basic_tests.jl:875 / Actuated joint SciMLBase.successful_retcode(sol) b (fixed) OLD-CB2/OLD-PORT pass; NEW acceleration-only IC fails. Independent joint phi=0,w=0 makes the unchanged retcode assertion pass (1/1).
28 basic_tests.jl:911 / ropes SciMLBase.successful_retcode(sol) unresolved OLD-CB2 cannot construct undeclared rotation; old-port/new retcodes fail. Reverting damping still fails both ropes (Opus hybrid).
29 basic_tests.jl:951 / ropes SciMLBase.successful_retcode(sol) unresolved Same blocked ropes reference and damping-reversion control as row 28.
30 basic_tests.jl:1259 / basic_tests SciMLBase.successful_retcode(sol) unresolved OLD-CB2 errors on length(Equation); OLD-PORT has five failures and NEW two, even with SCC=0. No usable old reference.
31 basic_tests.jl:1305 / basic_tests SciMLBase.successful_retcode(sol) unresolved Same blocked SS/US reference as row 30.
32 test_fourbar.jl:47 / fourbar SciMLBase.successful_retcode(sol) a Opus: same failed assertion and non-finite matrix on both old configurations.
33 basic_tests.jl:1350 / basic_tests ≈((sol[model.cyl.v])[end], -9.81, atol = 0.01) b OLD-CB2 and OLD-PORT pass; NEW gives v=0. Independent wrapper IC and consistent wrapper/child ICs still return DtNaN. Retained as b; no upstream-owner claim.
34 basic_tests.jl:1351 / basic_tests ≈((sol[model.cyl.phi])[end], 1, atol = 0.01) b Same confirmed new-stack Cylindrical case as row 33; phi remains zero.
35 basic_tests.jl:1355 / JointUSR_RRR LoadError: Differentiation with array expressions is not yet supported unresolved Earlier old-stack API barriers prevent comparison of this exact array-differentiation error; causal attribution unresolved.
36 runtests.jl:59 / basic_tests LoadError: ArgumentError: expression should be of the form sys = foo(a, b) a Same check/error was observed in the old-stack comparison; Opus did not rerun this row.

Test-input corrections

  • FreeMotion (round-2 :769): body.w_a=[0,1,0] contradicted the unchanged joint default phid=zeros(3). Dropping only that redundant start value is a correct-test input repair, not a weakening. The same analytical free-fall assertion and tolerance remain. Before: one failure in the FreeMotion group; after: 4/4, retcode Success, y(10)=-490.4999999999997 (the exact analytical value is -490.5).
  • ActuatedJoint (:875): replace the acceleration-only start D(D(joint.phi))=>0 with independent joint.phi=>0, joint.w=>0. Before the unchanged successful-retcode assertion fails; after it passes 1/1.
  • Cylindrical: choosing the compiled wrapper's velocity, then assigning consistent wrapper/child velocities, both still give DtNaN, velocity zero and angle zero. Those diagnostic changes are not applied to the official test; both assertions remain b.
  • Existing pendulum equivalence inputs start all compared models at the same angle and velocity. This is an input change, explicitly retained so the original equivalence assertions compare the same initial-value problem. The quaternion oscillator has a 1e-5 position perturbation and remains red; this perturbation is disclosed and is not claimed to fix it.

Focused command: timeout 5400 julia +1.12.6 --startup-file=no --project=round2/new-env round3/driver.jl FreeMotionFixed ActuatedFixed CylindricalFixed Worldforces: 7 pass / 4 fail. A final FreeMotion-only run gives 4/4 and the value above. A separate consistent Cylindrical-input run gives 5 pass / 2 fail across FreeMotion/Actuated/Cylindrical. Worldforces :136/:180 both return DtNaN at t=0 with zero initial states; their independent old-port/SCC=0 controls pass, so they are b, not pre-existing numerical failures with the same cause.

Retained public behavior changes and necessity

  • PlanarMechanics.Body/BodyShape default state_priority: 2 → 0. This is retained for the new stack's state selection. --project=round2/old-exposed-env round3/planar_priority.jl 2 passes the old free body 4/4 and pendulum 4/4 (the old BodyShape case is blocked by a parameter-shape API error). --project=round2/new-env ... 2 passes free body 4/4 but fails all four pendulum checks, including the required two-state count; ... 0 passes free body and both pendulums 12/12. This changes state selection for planar callers and requires human review; it is not just an integer-priority formatting change.
  • Spherical stateless w_rel and damping: the relative velocity is always defined from frame velocities, resolved in frame_b. Damping torque in frame_b is d*w_rel, and its opposite reaction is transformed into frame_a. Reverting the cb2 equations in the new stack gives 9 pass / 2 errors: w_rel is absent and the damped stateless case references an undeclared Rrel. The retained equations close that model and give flags 12/12, rotated-frame damping 20/20, rod construction 1/1. This corrects cb2's one-argument append no-op and frame balance, and changes damped-joint simulation results; it is a behavior fix, not merely a rename. The contract is stated in the docstring and joints page.
  • FreeMotion relative rotation symbols: Frame proxies Rrel_f/Rrel_inv_f become declared Rrel/Rrel_inv rotation entries. This removes unrelated unused Frame unknowns from initialization and changes names users may index. Spherical rotation entries are also declared explicitly.
  • RotationMatrix(AbstractMatrix,w) override removed: the override extends an MTK-owned type and forces conversion; removing it changes constructor dispatch/representation. Numeric rotation equivalence checks remain in the suite.
  • Robot guesses are vectors; quaternion defaults are captured before declaring symbolic Q; scalar rotation/quaternion equations and shaped force zeros implement the current symbolic APIs. Solver autodiff uses ADTypes. ADTypes is a MIT-licensed test/docs dependency; Random is a standard-library test dependency.

Identified pre-existing SCC finding for Fredrik

The package-wide analytical_linear_scc_limit=3 remains unchanged. Opus ran NEW, OLD-PORT and OLD-CB2: spring-damper :403/:416 and oscillator :58/:62 pass with limit 0 in all three setups; default 3 gives NaNs/failures. These are identified a failures, not unisolated a* guesses. A global limit change introduced two FreeMotion quaternion failures in round 2 and was reverted. Fredrik should decide whether those individual models should request numerical SCC solves or whether the compiler policy needs an upstream fix. No tolerance or assertion is changed. The positive numerical-loop test is explicitly opt-in and does not prove default robustness.

Unresolved cases and reduction limits

  • Ropes: OLD-CB2 cannot construct the rotation variables. Old-port/new solves are red; Opus's new-stack hybrid with cb2 damping still fails both ropes, so reverting damping does not fix them.
  • Universal pendulum: OLD-CB2 has an axis-type API error; OLD-PORT NaNs; NEW has wrong geometry. No usable old numerical reference.
  • Wheels: both old configurations fail earlier with SingularException(19), before the six checks being compared.
  • SS/US: OLD-CB2 cannot construct; OLD-PORT has five failures versus new two, also with SCC=0. No clean old reference.
  • JointUSR_RRR: earlier old-stack barriers prevent comparison of the exact new array-differentiation exception.
  • A cheap MTK/SciML-only alias-initialization reduction fails on both stacks; it does not identify a new-stack bug and is excluded as an upstream reproducer. The round-2 two-by-two linear-loop reduction likewise did not reproduce the defect. No upstream owner or genuine upstream bug is asserted for the remaining Worldforces/Cylindrical failures.
  • The existing standalone unused-array MWE (MTK + InteractiveUtils only) passes MTK11.26/SC2 and fails MTK11.40/SC3 and MTK11.45, independently reproduced by Opus. No upstream issue has been posted.

Docs, formatting and CI limits

No full docs build is run in round 3. The two prior builds timed out in quad.md, grew to roughly 34 GB and drove shared load to 40. quad.md and later pages remain unverified. The round-2 final build recorded seven failed example blocks; three exposed causes masked by earlier baseline errors, and their causal classification remains unresolved. The changed joints documentation is prose/docstrings; its behavior is checked by the standalone joint tests. The restored sloshing example runs standalone with timeout1800. No example or assertion is disabled, no warnonly added, and all twelve inherited skip/broken lines match cb2.

JuliaFormatter 1.0.62 ran on previews of every changed Julia file and checked the edited initial-condition statements with SciMLStyle. The final helper exits 0; preview formatting reports existing style differences in all four files, so this is not a clean whole-file formatter gate. A first helper attempt had a local-scope error after completing its preview; the read-only retry corrects that harness error without modifying the tested source. Broad formatting is left for a separate mechanical change. git diff --check passes. No QA group or formatter workflow is configured; typos is not installed.

Main CI reported 46/4/27 on old majors; no retained successful main/cb2 CI test or docs run was found (successful retained runs are CompatHelper). Docs CI fails before examples on private-registry HTTP401 and missing private package registration. That is distinct from the local example failures. Full suite at exact minimum MTK11.40/Default2.4.5, downstream TaurosDemo, DataInterpolations8, x86, the unresolved causes and final PR CI are unverified. The repository lacks bot-generated/needs-chris-review labels; the requested conditional label is unavailable.

Original round-1 25-item table

Worldforces :136/:180 are also corrected to b here; the original set is a15 / b10 / c0 found, with prerequisite-diagnostic limitations still stated.

Attribution of the original 13 failures and 12 errors

Categories: a = pre-existing red check; b = new-stack behavior/API; c = regression from port edits. Original inventory: a 15, b 10, c 0, including two qualified prerequisite-diagnostic rows. No original event was isolated to a port edit; this is not a proof that all port behavior is regression-free.

ID Test file / testset Assertion or error Class Evidence / correction
1 test_robot.jl / full robot vec(::Int64) a Same error on untouched cb2; robot guesses have array shape.
2 test_quaternions.jl / harmonic oscillator common key body Q̂ a Same error on untouched cb2; preserve constructor Q before declaring symbolic Q.
3 test_quaternions.jl / state in Body missing Initial(joint w_rel_b) b cb2 errors earlier with a different type error; MTK-only unused-array probe passes old and fails new; it isolates that failure pattern, not the complete joint model.
4 test_quaternions.jl / state in FreeMotion array differentiation unsupported a Same error on untouched cb2; scalar quaternion equations and declared rotation entries.
5 test_quaternions.jl / outer include length(::Equation) a Same error on untouched cb2; push one equation rather than append it.
6 test_worldforces.jl:136 position ≈ [0.5728,0.4947,0] b Opus: old cb2 and old-port pass with SCC=0; NEW still fails. Our new-stack probe returns DtNaN at t=0; a separate stack-specific failure.
7 test_worldforces.jl:180 position ≈ [0.9419,-0.2339,0] b Opus: old cb2 and old-port pass with SCC=0; NEW still fails. Our new-stack probe returns DtNaN at t=0; a separate stack-specific failure.
8 test_worldforces.jl / outer include array differentiation unsupported a* Old-stack diagnostic after gravity/guess repairs reaches the same array-differentiation exception.
9 test_PlanarMechanics.jl / SimpleWheel successful_retcode(sol) a Same assertion fails on untouched cb2.
10 test_PlanarMechanics.jl / SlipBasedWheel Bool autodiff unsupported b Old stack accepts Bool; use AutoFiniteDiff(). Later force assertions also fail on cb2.
11 test_PlanarMechanics.jl / TwoTrackModel Bool autodiff unsupported b Old stack accepts Bool; use AutoFiniteDiff().
12 test_PlanarMechanics.jl / rolling wheel fy ≈ +0.982, actual -0.982 a Same signed value and failed assertion on untouched cb2.
13 test_PlanarMechanics.jl / slipping wheel missing test_OneDOFSlippingWheelJoint.jl a Same missing file on untouched cb2.
14 basic_tests.jl / spring oscillator common key body Q̂ a Same error in untouched cb2 supplemental run; constructor-default shadowing fixed.
15 basic_tests.jl / Simple pendulum power norm < 1e-14; actual 2.103e-14 b Old check passes. A threshold crossing is observed; its numerical source is not isolated. Tolerance retained; no upstream defect claimed.
16 basic_tests.jl / Simple pendula successful_retcode(sol2) b Old check passes. Independent-state initial conditions repair the new failure; no upstream defect is isolated.
17 basic_tests.jl / Simple pendula sol2 endpoint ≈ -π/2 b Old check passes; same initial-condition update as row 16.
18 basic_tests.jl / Simple pendula sol2 trajectory ≈ sol1 trajectory a Same assertion fails on old stack. Equivalence checks need the same initial angle.
19 basic_tests.jl / Simple pendula minimum(sol3 phi) > -π a Same assertion fails on old stack; use initial state consistent with reference model.
20 basic_tests.jl / Simple pendula sol3 trajectory ≈ sol1 trajectory a Same assertion fails on old stack; same initial-angle correction.
21 basic_tests.jl / linear mass spring damper successful_retcode(sol) b Old check passes. Position/velocity initialization repairs the new failure; no upstream defect is isolated.
22 basic_tests.jl / linear mass spring damper endpoint ≈ -9.81 b Old check passes; same state initialization update.
23 basic_tests.jl / Spring damper system missing D(p2.s) initialization a The testset is red on old stack with NaNs, a different exception; p2 velocity initialization repairs the new missing-value error.
24 basic_tests.jl / Three springs successful_retcode(sol) a Same assertion fails on old stack.
25 basic_tests.jl / PlanarTest world.g missing a* Untouched cb2 blocked by float priorities; after integer-priority and vector-zero repairs the same field lookup fails.

* Rows 8 and 25 require prerequisite API repairs before the old-stack comparison reaches them. Worldforces rows 6–7 are b: the old default-3 NaN is separate from the new failure that persists at SCC=0; both old-code configurations pass that control. No same-cause claim is made.

Links

Risk assessment

  • Risk: high.
  • Blast radius: joint equations, damping, public symbol names, planar state selection, initialization and downstream simulations; the two-boundary Craig–Bampton tank retains Fredrik's model.
  • Evidence: full baseline/final counts, successful restored minimum-stack sloshing, discriminating input fixes, planar priority and Spherical reversion controls; unresolved numerical failures remain.
  • Independent review: Claude Code / claude-opus-5-5[1m] returned CHANGES, high risk, medium confidence at 6435c80, found no port-caused c failure and identified thirteen unresolved checks. Round-3 changes require re-review; this is not a clean independent verdict.
  • Merge: needs Chris/Fredrik review; not merge-ready while tests or docs are red. Stay a draft.

🤖 Posted by an AI agent — harness: Codex CLI 0.162.1 · model: gpt-6.1-sol
Session: codex session 01a1372e-c8ea-7d12-a35c-2e157ee90e3d (local)

baggepinnen and others added 9 commits February 23, 2026 11:48
Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Codex <noreply@openai.com>
Agent-Harness: Codex CLI 0.156.0
Agent-Model: gpt-6-sol
Agent-Session: codex session 01a1372e-c8ea-7d12-a35c-2e157ee90e3d (local)
Supervisor-Session: https://claude.ai/code/session_01C7igeJEd3iowpi5KZjsxG9
Validate the sloshing cart with initialization and cover array metadata changes.
The full suite and docs still have unresolved failures; see the worker report.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Codex <noreply@openai.com>
Agent-Harness: Codex CLI 0.162.1
Agent-Model: gpt-6-sol
Agent-Session: codex session 01a1372e-c8ea-7d12-a35c-2e157ee90e3d (local)
Supervisor-Session: https://claude.ai/code/session_01C7igeJEd3iowpi5KZjsxG9
Correct symbolic rotations, damping frames, shaped guesses and solver differentiation.
Exercise joint observations and the numerical algebraic-loop configuration.
The full suite and docs remain red; the draft PR records baseline and attribution limits.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Codex <noreply@openai.com>
Agent-Harness: Codex CLI 0.162.1
Agent-Model: gpt-6.1-sol
Agent-Session: codex session 01a1372e-c8ea-7d12-a35c-2e157ee90e3d (local)
Supervisor-Session: https://claude.ai/code/session_01C7igeJEd3iowpi5KZjsxG9
Restore Fredrik's two-boundary tank with normal initialization.
Remove conflicting free-fall inputs and initialize the actuated joint's states.
Document retained planar priorities and Spherical velocity/torque behavior.
The full suite remains red; the draft PR records corrected attribution and limits.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Codex <noreply@openai.com>
Agent-Harness: Codex CLI 0.162.1
Agent-Model: gpt-6.1-sol
Agent-Session: codex session 01a1372e-c8ea-7d12-a35c-2e157ee90e3d (local)
Supervisor-Session: https://claude.ai/code/session_01C7igeJEd3iowpi5KZjsxG9
@ChrisRackauckas

Copy link
Copy Markdown
Member Author

🤖 Automated comment from an AI agent running as @ChrisRackauckas — not written or reviewed by Chris.

Round 3 is pushed at c0e04cf.

  • Restored Fredrik's exact two-boundary sloshing example; normal initialization on MTK 11.40 / Default 2.4.5 completes with Simulation complete: Success.
  • Removed the contradictory FreeMotion body-spin IC: unchanged free-fall checks pass, y(10)=-490.4999999999997. Independent ActuatedJoint state ICs also make its unchanged retcode check pass.
  • Corrected the 36-row attribution table: 15 a / 7 b / 14 unresolved / 0 c found, with two b checks now fixed. The final remaining entries are 15 a / 5 b / 14 unresolved; Worldforces and Cylindrical remain b.
  • Retained and explicitly disclosed planar priority 0 and Spherical velocity/torque behavior, with cb2/new-stack control failures and passing port checks. The global analytical SCC limit stays 3; the limit-0 oscillator/spring-damper results are recorded as a finding for Fredrik.
  • Final full suite, run once under the shared flock: 1625 pass / 31 fail / 3 errors / 7 inherited broken; Craig–Bampton 1124/1124. No tolerance, assertion or inherited marker was changed.
  • No full docs build was run. quad.md and later pages remain unverified. The PR stays a draft and is not merge-ready; unresolved cases and independent re-review remain open.

The PR body contains the full attribution table, exact verification commands, input changes, retained public behavior changes and risk assessment.


🤖 Posted by an AI agent — harness: Codex CLI 0.162.1 · model: gpt-6.1-sol
Session: codex session 01a1372e-c8ea-7d12-a35c-2e157ee90e3d (local)

@baggepinnen

Copy link
Copy Markdown
Contributor

This package is deprecated, MultibodyComponents.jl should be used for all multibody work going forward.

@ChrisRackauckas

Copy link
Copy Markdown
Member Author

🤖 Automated comment from an AI agent running as @ChrisRackauckas — not written or reviewed by Chris.

Thanks — understood. Closing this draft, since Multibody.jl is deprecated and the Craig–Bampton work is moving to https://github.com/JuliaComputing/MultibodyComponents.jl/pull/171.

For the record, two findings from this port may still be useful on the MultibodyComponents side:

  • The package-wide analytical_linear_scc_limit = 3 made spring-damper and oscillator go NaN on both the old and new stacks; 0 fixed them.
  • The standalone ModelingToolkit reproducer in reproducers/unused_array_initialization.jl (on this branch) passes on MTK 11.26.8 and fails on 11.40.0 and 11.45.3.

The branch cb2-sciml3 is left in place.


🤖 Posted by an AI agent — harness: Claude Code 2.1.282 · model: claude-opus-5-5[1m]
Conversation: https://claude.ai/code/session_01C7igeJEd3iowpi5KZjsxG9

@ChrisRackauckas

Copy link
Copy Markdown
Member Author

I'm going to archive the repo so that doesn't happen again.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants