Troubleshooting
Work top to bottom: an earlier row makes later numbers meaningless.
| Symptom | Likely cause | Fix |
|---|---|---|
check_ raises; overflow warning; *_ > 0 |
Capacity overflow | Size the family from *_ (Capacities). Re-measure after any friction or response change: point friction needs more rows than anchors. While a family overflows, the dropped set changes from step to step and can add energy until the state diverges. |
| Contact count equals the buffer size | Contact buffer full | Raise rigid_ on the pipeline. |
| Kernels fail to build with very large immediate capacities | More rows than one world’s immediate kernel holds | Colored propagation with propagation_. |
| A start pose or velocity is lost on the first step | Written to body_/body_ only |
Write joint_/joint_. |
| Joints far past their limits | enable_, or a DISTANCE joint, whose limits Steel ignores |
Turn limits on. Build a tether from a ball joint and a limited slider (Tethers). |
| A load sinks through a link held by a limit or drive | row_ |
"interleaved" or "phased"; more iterations do not help (Row schedule). |
| Jitter of resting objects | Indeterminate load splits, warm-start overshoot, too few iterations | Keep friction anchors on; try contact_; raise iterations; enable sleeping for settled piles. |
| Resting bodies never fall asleep in many worlds | Contact-order jitter at the default sleep_ |
Collision, or sleep_ (Sleeping). |
A box near its friction limit slides with "bisection" or "bisection_ |
Radial projection in those modes | "fixed_, or "coulomb_ for free bodies (Friction modes). |
| Tunneling or deep overlap of fast, small or thin objects | Travel per step far beyond the contact gap | More substeps, or a larger gap on the thin shape; keep contact_ and no contact_. |
| Slow convergence: stacks sag, chains stretch, grasps slip | Iteration-limited | More iterations, Nesterov momentum, fewer substeps with more iterations, pre-elimination for loops. |
| A chain of light links gains energy or goes NaN at any iteration count | Explicit velocity-product forces, first order in | A smaller step; armature large against the links’ inertia. A longer update_ lost energy instead on the measured chains (Step pipeline, Armature). |
| Passive joint damping diverges within a few steps | Explicit damping past | Lower the damping or the step, or use a drive’s target_, which is implicit (Joint springs and damping). |
| Bodies launched after a hard contact | baumgarte too high, or warm start on wedged contacts |
baumgarte ≤ 0.5; velocity_; warm start off. |
| Light bodies pressed into the ground by a heavy one | Mass ratio above about 1000:1 | See the recipe in Tuning. |
| Frozen scene with odd substeps under a graph | The captured state swap ends on the other buffer | Use an even substep count when swapping states inside a graph. |
Not at construction |
Particles, gradients, a CUDA-only feature on CPU, or an unsupported joint layout | See What does Steel reject at construction?. |
Loop-closing joints are not supported with articulated_ |
Loop closures under propagation | Immediate response, serial sweep. |
nesterov_ |
Momentum outside the serial immediate sweep | Serial, immediate, row_. |
| Contact torsion construction error | Torsion radii authored without device preparation | contact_, and velocity_ under propagation. |
Steel docs and tutorials are licensed under Apache-2.0. Third-party notices. "Skild", "Skild AI" and the Skild logo are trademarks of Skild AI and are not licensed under Apache-2.0.