Skip to content

Validation suite

Correctness is the moat. We validate in layers, and we only remove a caveat once the underlying limitation is actually fixed (never to make a screenshot look cleaner). Two layers today: Rust unit + analytical tests in the solver core, and a JS/web suite that exercises the WASM build and the Studio behaviour.

bash
# a static server must serve the repo root (python3 -m http.server 8800)
NODE_PATH=$(npm root -g) test_suite/run_checks.sh

Where we are (2026-06)

  • 104 Rust unit tests (elements, releases, plates, eigen, AS 4100 capacities).
  • 25 closed-form analytical cases solved through the WASM build and diffed against textbook formulas.
  • 34 web/Studio suites in run_checks.sh (behaviour, a11y, and live closed-form checks through the browser).
  • 275 catalogue sections cross-checked for internal consistency.

Closed-form / physical-law checks

These need no values from any other program - they are equilibrium, linearity, or textbook formulas an engineer can reproduce by hand:

CheckReference
Cantilever under UDLfixed-end shear wL, moment wL²/2, free end 0
Simply-supported beam under UDLreactions wL/2, midspan moment wL²/8
Cantilever / SS deflectionPL³/3EI, 5wL⁴/384EI (per-station, <0.5%)
Every demo modelΣR + Σapplied ≈ 0 (equilibrium)
Load scalingscale all loads by k ⇒ results scale by exactly k
Plate bendingvs Timoshenko closed-form (SS 6.6%, clamped 3.7% at 4×4; both <1% at 16×16)
Section catalogueZx = Ix/(d/2), shape factor, mass = ρA across 275 sections

AS 4100 steel design (shipped, validated)

The design module is live, not aspirational. It is validated against published worked examples and tables:

TermValidation
φMs, φMb, φNc, φNt, φVvASI worked examples Ex1-Ex7, within ~1%
Combined actions Cl 8.3/8.4including the Cl 8.4.5 biaxial interaction term
Exact J / Iyy / Izzcross-checked vs ASI catalogue (Iyy <0.5%, Izz <2.5%)
RHS / SHS / CHS capacitiesvs ATM Design Capacity Tables (Grade C350/C450)

Next frontier (the validation iceberg)

The cases above are the recognisable slice. The robustness work, in priority order, is:

  1. Differential testing vs a reference solver - generate thousands of random valid frames, solve in our engine and in PyNite (MIT), diff reactions / displacements / member forces in CI. Converts hand-picked cases into thousands of independent cross-checks across the real input space. (planned)
  2. Property-based invariants (Rust proptest) - ΣR = Σapplied, symmetry, linearity, work = strain energy on thousands of random models. (planned)
  3. Table reconciliation - diff our populated section catalogues row-by-row against authoritative sources (AISC shapes DB, ASI), AU/NZ first. (planned)
  4. NAFEMS benchmark problems + an independent chartered-engineer sign-off, then publish the deltas. (planned)

Differential testing earns trust in the analysis engine; the AS 4100 design trust is earned separately by the table/DCT reconciliation and the engineer sign-off. See docs/validation-roadmap.md for detail.