Appearance
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.shWhere 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:
| Check | Reference |
|---|---|
| Cantilever under UDL | fixed-end shear wL, moment wL²/2, free end 0 |
| Simply-supported beam under UDL | reactions wL/2, midspan moment wL²/8 |
| Cantilever / SS deflection | PL³/3EI, 5wL⁴/384EI (per-station, <0.5%) |
| Every demo model | ΣR + Σapplied ≈ 0 (equilibrium) |
| Load scaling | scale all loads by k ⇒ results scale by exactly k |
| Plate bending | vs Timoshenko closed-form (SS 6.6%, clamped 3.7% at 4×4; both <1% at 16×16) |
| Section catalogue | Zx = 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:
| Term | Validation |
|---|---|
| φMs, φMb, φNc, φNt, φVv | ASI worked examples Ex1-Ex7, within ~1% |
| Combined actions Cl 8.3/8.4 | including the Cl 8.4.5 biaxial interaction term |
| Exact J / Iyy / Izz | cross-checked vs ASI catalogue (Iyy <0.5%, Izz <2.5%) |
| RHS / SHS / CHS capacities | vs 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:
- 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)
- Property-based invariants (Rust
proptest) -ΣR = Σapplied, symmetry, linearity, work = strain energy on thousands of random models. (planned) - Table reconciliation - diff our populated section catalogues row-by-row against authoritative sources (AISC shapes DB, ASI), AU/NZ first. (planned)
- 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.