Changelog — Suite Updates & Calculation Record
High-level record of changes to the Piping Toolset suite — the browser tools, calculation engines, reports, plans, and the site/API surface. Calculation behavior is the versioned core of this record: if a number a calculator produces could change, it is recorded here, and the entry names the affected module ids and the fixture files that lock the change. No calculation ships without a green fixture; "Verified" notes the derivation basis (hand calculation, PVP Suite validation set, or published source-sheet example). UI-only and content-only changes are summarized at suite level.
The site's /trust/changelog page is generated from this file at build time.
2026-09-01 — BPE fitting-dimension lookup: registered engine, fixture, landing page
The ASME BPE Part DT-4.1 fitting-dimension card has shipped on the BPE line since 2026-07-04, reading the bpe-fitting-dimensions dataset directly. It was the one BPE card with no registered calculator, no fixture and no public URL. This promotes it to a first-class method.
- New module
bpe.fitting-dimensions(bpeFittingDimensions) locked bybpe-fitting-dimensions.json(9 cases). It returns the tabulated nominal dimensions for a fitting type and size — elbows DT-4.1.1-1/-3/-4/-6, tees and crosses DT-4.1.2-1, instrument tees DT-4.1.2-10, reducers DT-4.1.3-1, ferrules DT-4.1.4-1, solid end caps DT-4.1.5-2 — and derives two geometric terms: the weld-elbow tangent A − R·tan(θ/2) (the straight length from the weld end to the bend tangent point; A − R for a 90° elbow) and the eccentric-reducer centreline offset (OD_large − OD_small)/2, using BPE tube OD = nominal size. An unlisted size returnslisted: 0, status fail, naming the tabulated sizes. Verified: hand calculation (2 in 90°: 4.75 − 3.0 = 1.75; 6 in 45°: 6.25 − 9.0·tan 22.5° = 2.522; 2 × 1 eccentric: 0.5).
- Label correction, no value changed. The dataset's 90° and 45° weld-elbow dimension A was labelled "Face-to-tangent" in the card; it is the center-to-end dimension, consistent with the tee row's "Center-to-end A" and with the 45° and 90° columns sharing one tangent length once R·tan(θ/2) is removed. The label now reads "Center-to-end A (in)". Every tabulated value is unchanged and the dataset tests are untouched.
- New page
/calculators/bpe-fitting-dimensions/with method, limitations, four fixture-verified worked examples and FAQ; the eleventh BPE-line page (calculator pages 48 → 49).
2026-09-01 — Six BPE landing pages (material, surface, weld, polymer)
Content-only. Six BPE calculation engines that have shipped since 2026-07-04 had no public URL — they were reachable in the app and invisible to search. This adds the landing page, sample report and worked examples for each, closing the last gap between what the BPE line computes and what it publishes.
- No calculation behavior changed. The six engines, their fixtures and their acceptance thresholds are untouched; the "Method last updated" stamp on each new page therefore still reads 2026-07-04, the date the engines shipped. The module ids are named in plain text below rather than in backticks precisely so this entry cannot bump that stamp — a page shipping is not a method changing.
- New pages (
scripts/seo/content/bpe.mjs), each with method, limitations, fixture-verified worked examples and FAQ: PREN / alloy classification (bpe.pre-pren, App. F-3); ferrite and weldability (bpe.ferrite-number, WRC-1992 equivalents, the BN2 discriminant and the MM-5.2.1.1(a) autogenous sulfur window); Ra surface finish (bpe.ra-finish, SF designations); electropolish removal and passivation acceptance (bpe.ep-passivation, App. H / App. E); tube weld acceptance (bpe.tube-weld-acceptance, Table MJ-8.4-1); and polymer thermal expansion (bpe.polymer-thermal-expansion, PM-4.2.3).
- Every published number is fixture-locked. Each worked example is bound to a named case in the module's own fixture file and the build's drift guard fails if a displayed result does not round from a fixture value. Thirteen fixture cases across the six files back the thirteen worked examples.
- Licensing posture unchanged and stated on the pages. The WRC-1992 diagram plate, the SF grade-to-Ra mapping and the Table MJ-8.4-1 acceptance values are not embedded: each arrives as a user-supplied input read from the reader's own licensed copy, and each page says so in its Method section and its limitations. The pages state only what is embedded — the public closed forms — cited to clause.
- Six purpose-drawn diagrams (
scripts/seo/diagrams.mjs): a PREN band scale, the WRC-1992 equivalents plane with the sulfur window, a surface profile trace against a grade ceiling, an electropolished coupon section, the three MJ-8.4-1 weld discontinuities, and an anchored thermoplastic run. Thebpefamily default is a dead leg at a tee — correct for the L/d, slope and CIP cards and wrong for all six of these, so each is mapped explicitly in DIAGRAM_SLUG_OVERRIDES rather than falling back to it.
- Line placement. Five pages sit on the BPE line. Polymer thermal expansion is published on the Non-Metallic line because that is where its live card actually is, so the page's CTA lands on the calculator rather than a dead deep link; the page still cites BPE PM-4.2.3, which is its governing reference. FAMILY_ORDER's thermal-flexibility group was widened to cover the nonmetallic line so the page is not orphaned from the calculator index.
2026-08-31 — Flange Bolt-Up Sequence (General line)
New free calculator on the General line — the second tool out of the same r/pipefitter calculator thread that produced the trapeze tool: field crews tracing end-of-day flange leaks to bad tightening patterns, not torque values ("the sequence matters more than the number"). A phone-sized star-pattern chart by bolt count, with pass percentages for the crews that torque.
- Calculation behavior — new module
connections.bolt-sequence(packages/calc-core/src/connections/bolt-sequence.ts). Generates the legacy cross (star) tightening order for any even bolt count 4–68 by two rules: every bolt is followed by its diametric opposite (i → i + N/2), and pair leads are ordered by applying the same crossing recursively to the half-count, so consecutive pairs rotate quadrants. For 4, 8, 12, 16, 24 and 32 bolts the output is digit-for-digit the published chart on gasket manufacturers' assembly cards — pinned exactly inbolt-sequence.test.ts(15 tests: published charts, permutation and opposite-pair properties for every even count, quadrant rotation for every multiple of 4, torque splits, validation). Pass schedule: snug, then cross passes at editable ascending percentages (default 30 / 70 / 100, up to six), then always a final circular pass; an entered target torque (job spec / gasket sheet — deliberately never computed here) is split into per-pass wrench settings rounded to a tenth, unit label (ft·lb / N·m) passed through. Warnings on non-multiple-of-4 counts, counts above 48 (alternative-pattern advisory), and schedules that never reach 100%. No licensed table values embedded: the pattern and pass practice are standard bolted-joint assembly trade practice (ASME PCC-1 legacy-pattern guidance). Locked bypackages/calc-core/fixtures/bolt-sequence.json(9 cases; case 0 is the card's default 12-bolt state, case 1 the 200 ft·lb split 60/140/200) and ane2e/smoke.spec.tscase. - Site — General line card (after the trapeze card) with a live numbered SVG star chart (tightening step at each hole, red crossing path), the written order, and the pass table; landing page
/calculators/flange-bolt-tightening-sequence/with a purpose-drawn 8-bolt star diagram, a 4–32 bolt sequence chart table read at build time from the CI fixture file (one source of truth — a missing case fails the build), two fixture-locked worked examples, cross-links with the flange pages, and footer/General-line copy updated in the static shell.
2026-08-30 — Trapeze / Strongback Sizing (General line)
New free calculator on the General line, built from a working request in the r/pipefitter calculator thread (four 30" sch 10 cooling-tower headers on rod-hung back-to-back channel strongbacks): channel size, rod size and count, and maximum strongback spacing, in one pass.
- Calculation behavior — new module
structural.trapeze-hanger(packages/calc-core/src/structural/trapeze-hanger.ts). Rack load built from up to three pipe groups (annulus metal + contents weight) plus an extra lb/ft allowance; pipes laid across the rod-to-rod width at equal centres, heaviest nearest midspan (conservative for mixed racks); each rod-to-rod segment analysed as a simple span with exact point-load statics (Mmax under a load point, end-reaction shear, midspan deflection by superposition). The channel — back-to-back pair (half demand per channel, no composite action assumed) or single — runs through the existingstructural.aisc-memberAISC 360-22 ASD check with Lb = the rod-to-rod span and Cb = 1.0; auto-select sweeps the C then MC families ofaisc.shapes-v16lightest-first (candidates injected, so calc-core keeps no dataset dependency). Rod capacity on the classic coarse-thread root area 0.7854·(D − 1.3/n)² at an editable allowable (default 11.6 ksi — the B31.9 ¶921.2.2 / Table 921.2.2-1 practice basis of one-fifth of A36's 58 ksi minimum tensile; computed capacities reproduce the published 3/8"–1 1/4" table loads, and larger rods are flagged as beyond that table's range). Two rods take exact simple-span reactions; 3–4 rods take tributary width with a 1.25 interior-rod continuity factor. Maximum strongback spacing = min(weakest pipe's own span from the classic fixed-beam screening basis — 2,300 psi bending / 0.1 in sag, both editable — and the entered spacing divided by the worst hardware utilization, every demand being linear in spacing); the output names the governor. Every run carries the building-structure hand-off warning (bar joists / EOR sign-off) and a thin-wall bearing advisory below t/OD = 0.015. Verified by hand statics intrapeze-hanger.test.ts(root areas held to ±0.0012 in² of the published hanger-rod rows, exact reactions, hand LTB anchor for the C9X15 pick). Locked bypackages/calc-core/fixtures/trapeze-hanger.json(case 0 is the thread's rack: 1,579.7 lb/ft, C9X15 pair at 0.882, 1 1/8" rod at 0.983, spacing rod-governed at 10.18 ft) and thee2e/smoke.spec.tstrapeze case. - B36.10 size table extension —
apps/web/src/lib/pipe-dimensions.tsgains NPS 26–36 (appended, so every existing index is untouched; B36.19M stops at NPS 30, so only that size carries 5S/10S labels). The free Pipe Section Properties card and every PipeSizePicker card now reach large-OD sizes; no existing schedule value changed. - Site — General line card (first on the route), landing page
/calculators/pipe-trapeze-strongback-sizing/with a purpose-drawn trapeze diagram, cross-links with the support-spacing page, and footer/General-line copy updated in the static shell.
2026-08-29 — PiperISO 45° routing, equipment symbols, cloud-save fix; site accessibility and caching
PiperISO (owner redlines, PRJ-0001):
- 45° routing — the dock gains a signed Δ pad (N/S · E/W · UP/DN, stress-model element-delta convention: N/E/UP positive) that extrudes one compound-direction run per gesture, alongside the existing one-click axis buttons. Direction changes now insert the elbow the actual bend angle calls for: 45° and 90° are B16.9 catalog fittings; any other angle is drawn and flagged for review. The Fittings menu adds an explicit 45° elbow next to the 90°.
- Calculation behavior — new B16.9 45° LR elbow center-to-end column B in
asme-data.js(ELBOW_B45; NPS ≥ 4 equals the standard's 0.625 × NPS inches, smaller sizes transcribed with their manufacturing tangents — confirm-against- the-standard posture, same as the VALVE_FTF 600/900 note). Cut-list take-out at a 45° bend uses column B; 3D-radius 45s derive R·tan(22.5°) from the 3D column where A = R; non-catalog angles take out R·tan(θ/2) and carry a review flag. BOM rows name the angle (ELBOW 45° LR 4"). Existing drawings are untouched: a fitting with no angle field computes exactly the old 90° path. Locked byapps/web/src/tools/isodraft/test/isodraft.test.js(45°/3D/odd-angle take-outs, 45°-bend cut list and BOM naming) and thee2e/isodraft.spec.tsΔ-pad case. - Equipment symbols — pump, vessel, heat exchanger and nozzle now draw as recognizable single-line shapes (volute on a baseplate, vertical drum with a flanged side nozzle, shell with channel-end flange pair, flanged stub) instead of the diamond placeholder — identically on the canvas, the PDF sheet and the DXF (new EQUIPMENT layer), from one primitive source (
skeys.js). Pump and vessel stay sheet-vertical, like upright supports. BOM SKEY stays blank for equipment — they are tie-ins, not piping components. - Cloud save keeps the drawing open — the first save of a new drawing used to remount the editor blank and re-raise the project-info modal (the drawing survived only in the cloud row). Saving no longer remounts; opening a drawing remains the one deliberate remount. Regression-locked in
e2e/isodraft.spec.ts.
Site (content/infrastructure only; no other calculation behavior changed):
- Accessibility — the shared page shell's breadcrumb, topbar, footer and
<summary>targets were sized by their small fonts alone (~19–21 px) and failed the 24 px target-size minimum on every generated page; padding now grows the hit areas without changing the type. The /pricing/ trial line (--accenton white, 4.2:1) moves to--accent-deep(7.2:1) — the new color-contrast failure on the subscription cards. - Caching — content-hashed
/assets/*bundles (plus version-pinned/vendor/*and the font files) now shipCache-Control: public, max-age=31536000, immutablevia_headers; they had ridden the platform defaultmax-age=0since launch (flagged 2026-07-31). - /tools/pipe-stress-fea/ — the page
<title>no longer claims "in Browser": meshing and solving run on the managed solver worker, as the page itself discloses. Title now matches the h1. - /tools/relief-valve-sizing/ — the standard's own §5.6.3.2 worked example (the tool's default state, fixture
packages/calc-core/fixtures/ api520-sizing.json) now renders above the fold ahead of any CTA, so the calculator-intent visitor sees the computed case — A = 6.50573 in² — before the tier pitch.
2026-08-19 — Source policy, terms and homepage copy refresh
Content-only release; no calculation behavior changed and no module ids are affected.
/trust/sources§3 retitled Embedded standard data, in full — the complete inventory of embedded reference tables, each row naming the standard and edition, what ships embedded, and the tool that consumes it. §4 adds purchased codes and standards to the validation-source list: embedded standard data is cross-checked to the source documentation.- Homepage intro rewritten to state the suite's full code coverage rather than the original B31.1/B31.3/BPE subset: the B31 family (B31.1 power, B31.3 process, B31.4/B31.8/B31.11 pipelines, B31.5/B31.9 refrigeration and building services, B31.12 hydrogen), BPE hygienic design, BPVC Section VIII and App. 2 flange design, Section IX weld-metal A-Numbers, B31J-2023 SIFs and flexibility factors, B31E seismic, B31G remaining strength, B16.5 and B36.10 dimensional data, NM.1/NM.2 non-metallic catalogs, API 520/521 relief sizing, API 610/560/620/650/660/661 and NEMA SM-23 nozzle loads, WRC-107 shell stresses, AISC and ACI support-structure compliance in LRFD or ASD, ASCE 7 wind and occasional-load combinations, EJMA expansion joints, and ISO 14692 for FRP/GRP.
/legal/terms§6 simplified;/aboutlede widened to match. In-app Help, Settings and tool card descriptions re-worded so every surface states the same source policy: published equations are implemented in code, copyrighted table values are either embedded reference data cited to their table and line or values you supply from your own copy of the standard.
2026-08-18 — Section IX A-Numbers reference + §4.5.15 method-scope correction
qw442-a-numbers(embedded dataset) — ASME BPVC Section IX-2025 Table QW-442, the ferrous weld-metal A-number classification, as a Pro Plus reference card on the General line. Dual-verified transcription (independent blind pass, zero value disagreements). First slice of the §3.8 welding data service; F-numbers (QW-432) and the versioned P-number DB (QW/QB-422) phase in next.- Roadmap correction: VIII-2-2025 §4.5.15 is a method POINTER to WRC 537/297/STP-PT-074 — it does not codify the STP-PT-074 coefficient tables (Part 4.5 carries only Tables 4.5.1/4.5.2). The planned nozzle local-stress engine therefore depends on the STP-PT-074 / WRC coefficient sets and is deferred to a later phase. No shipped calculator is affected; the WRC-terms calculators (user-supplied curve values) remain the correct shipped surface for 4.5.15's method list.
2026-08-18 — PiperPSV v1: relief sizing, discharge reaction, scenario router (Ultimate)
New product line at #/psv (Ultimate; free tier unaffected — the route's tools never mount below the tier).
New calculation engines
psv.api520-sizing— API 520 Part I 10th Ed. orifice sizing as published equations: gas/vapor critical flow (Eq. 6, C per Eq. 12, Pcf per Eq. 5), subcritical flow (Eq. 16 with F2 per Eq. 22) — the regime is selected automatically from Pcf and reported; steam (Eq. 25) with the Napier correction (Eq. 27/28, valid to 3,200 psia); certified-valve liquid sizing (Eq. 32). Fluid properties (k, MW, Z), Table 11 C, KSH and Kv stay user-entered — the API 520 coefficient tables are not embedded. Fixtures include the standard's own §5.6.3.2 worked example (6.51 in²), reproduced to full precision (6.50573).psv.b311-reaction— ASME B31.1-2024 Nonmandatory App. II open-discharge reaction: exit state per II-2.2.1 (V1, P1 from stagnation enthalpy), F1 = ṁV1/gc + (P1 − Pa)A1 per II-2.3.1.1 with ṁ = 1.11 × stamped capacity and a user-supplied DLF (II-3.5.1.3). Hand-derived fixture.
New datasets
b311-appii-steam-constants(embedded dataset) — Table II-2.2.1-1 values of a and b with their printed applicability limits; autofills the reaction calculator via the steam-condition picker with the citation on the card.api521-scenario-index(derived, citation map) — the 26 overpressure contingencies of API 521 §4.4 with the governing section for each. Names and section numbers only: no relieving-rate guidance or standard text is embedded, and required relief loads remain the engineer's determination from their own copy of the standard.
Also on the route: the Section XIII device-type part guide (Parts 3–8 map; set-pressure/accumulation limits stay with the referencing code per XIII 2.3/2.4 — a per-referencing-code limits card follows once those rules pass the verification gate).
2026-08-18 — Material Property Autofill v1: B31.3/B31.1 allowable-stress first slice
The flagship Pro-tier picker: material line + design temperature autofills the allowable stress into the Process and Power calculators, interpolated per the tables' own rules, with the table and line number cited on the card and in the report. First-slice specs (the >90%-of-BOMs set): A53, A105, A106, A182, A193, A234, A312, A335 in the slice grades. Free tier keeps every hand-keyed input.
New datasets (served via getDataset(), citations included)
b313-allowable-stresses-2024— ASME B31.3-2024 Table A-1C first slice. Per-line: section, product form, spec/grade/UNS/class, size, P-No., note markers, min-temp, SMTS/SMYS, max temp, and S at each tabulated temperature with the table's italic markers carried per cell (italic = exceeds two-thirds of expected yield at temperature; bold italic = 90%-of-yield basis).b313-bolting-stresses-2024— Table A-4C bolting design stresses (A193 B7/B7M/B16 size-range lines).b311-allowable-stresses-2024— ASME B31.1-2024 App. A Tables A-1/A-2/A-3 first slice. Tabulated values are SE (joint efficiency/casting factor INCLUDED — the autofill sets Factor E to 1.0 in the same pick so S·E is never double-counted); italics = time-dependent (creep-governed) values, carried per cell and badged on autofill.b311-bolting-stresses-2024— Table A-10 bolting (B7/B7M/B16 by diameter).
New shared engine
stressAtTempinterpolation in @pcp/code-data-service — straight-line between tabulated columns, first-column verbatim at/below its temperature, hard stop (never extrapolate) above a line's last tabulated value or inside an untabulated gap, italic/creep flags propagate when either bracketing value is flagged. Fixture-covered (interpolate.test.ts).
Where it autofills
B31.3 wall thickness (S), B31.3 allowable pressure (S), displacement stress range (Sc and Sh, two pickers), sustained + occasional stress (Sh), B31.1 wall thickness (SE with E→1.0), B31.1 allowable pressure (SE with E→1.0).
Verified: deterministic font-aware extraction, two independent blind visual transcriptions of 600 dpi page rasterizations, per-cell adjudication, plus a page sweep for slice rows outside the extraction. /trust/sources §3 inventory updated in the same change.
2026-08-18 — Code-data expansion: B31J-2023 engine, factor pickers, MDMT tool, API nozzle presets, 2025-edition datasets
Embedded reference data expanded to ASME B31J-2023, B31.9-2025, B16.5-2025 (current edition), NM.1-2022, and the API nozzle-load tables (610 Tables 5a/5b · 660 Table 2 · 661 Table 4 + §7.1.10 · 560 Tables 7–10). Every dataset in this release was transcribed dual-blind from the printed standards with per-cell adjudication, and formula/sign ambiguities were settled against 600 dpi rasterizations of the printed pages. /trust/sources §3 carries the complete embedded-data inventory.
New calculation engines
piping.b31j-sif— ASME B31J-2023 Table 1-1 in full: bends/miters, all six branch-connection sketches, reducer, welds, flanges, threaded joints, with the Note (7) cap/floor rules, Table 1-2 stiffnesses, Table 1-3 flanged-end corrections, Note (4) pressure correction, and General Note (d) sustained factors. Verified: independent Python derivation of every fixture case (fixtures/b31j-sif.json); the 6-in sch 40 elbow reproduces the PVP-suite App D anchors exactly. The legacy App D card remains for checking pre-2020/2024 calculations.connections.api610-annexf— API 610 13th Ed. Annex F pump-nozzle criteria (F.1–F.11): per-nozzle screen, resolution to the pump center, interaction checks, and the vertical in-line principal-stress path. Verified: hand derivations recorded in fixtures/api610-annexf.json.vessel.ucs66-mdmt— VIII-1-2025 UCS-66 impact-test exemption: Table UCS-66 tabular lookup (curves A–D), coincident-ratio reduction (Figure UCS-66.1 reduction is a user-read, range-validated input — the 2025 edition prints it as a curve only, and no eyeballed curve values ship), UCS-66(b)(3)/(d) paths, and the UCS-68.2 PWHT credit (the 2025 designator of the legacy UCS-68(c) rule).aux.app2-flange-integralgainshubFactorMethod: "fit-4165"— the VIII-2-2025 Table 4.16.5 published curve-fit equations for F/V/f as a selectable alternative to the exact §2-7.6 constant chain (which stays the default; outputs unchanged unless selected). The two methods agree within curve-fit accuracy (~1%) and the module warns if they ever differ by more than 2%. Verified: fixtures/app2-flange-integral.json fit-4165 cases with independently derived expectations.
Calculation-affecting data correction
- Gasket factor correction (PiperFLG / App 2 tools): the "Flat metal jacketed, iron or soft steel" selection previously carried m = 3.5 / y = 8,000 psi — the table's MONEL line — instead of the iron/soft-steel line's m = 3.75 / y = 7,600 psi (VIII-2-2025 Table 4.16.1; identical in the legacy Table 2-5.1 lineage). Operating bolt loads computed with the old values were slightly unconservative (m low by 6.7%); seating loads slightly high. A new cross-check test now pins every curated gasket row to the VIII-2-2025 Table 4.16.1 dataset so a wrong-line copy cannot recur.
Reference data now embedded (paid-tier pickers; free tier keeps hand-keyed inputs everywhere)
- B31.3-2024 factor pickers: Ej (Table 302.3.4-1), Ec (302.3.3-1), W (302.3.5-1), Y (304.1.1-1).
- B31.1-2024: weld joint efficiency E (Table 102.4.3-1), y coefficients (104.1.2-1), suggested support spans (121.5-1).
- B31.9-2025: threaded-rod capacities (Table 921.2.2-1) and the Table I-1 allowable-stress library (79 material lines).
- B16.5-2025 pressure–temperature ratings (groups 1.1/2.1/2.2/2.3) as a current-edition selection beside the retained 2017 tables — 68 rating cells changed between editions, all in stainless groups 2.1/2.2.
- VIII-2-2025 Table 4.16.1 gasket factors (42 lines) as the single source for gasket m/y.
- VIII-1-2025 Table UCS-66 tabular values + Figure UCS-66 curve assignments.
- NM.1-2022: GSR, design factors, molded-fitting PR, and the Appendix IV Table IV-1 HDPE i/k factors.
- API nozzle-load presets: 610 Tables 5a/5b, 660 Table 2, 661 Table 4 with the §7.1.10 aggregate rules, 560 Tables 7–10.
2026-08-12 — Suite update: report documents in every paid tool, Pro Plus trial, three-tier packaging
Summary of tool development landed 2026-07-31 through 2026-08-12.
Tools and reports
- Report Manager v2: every Pro Plus / Ultimate tool now files its complete formatted output into the Report Manager as a navigable document — sections, tables, and a 3D snapshot of the model — instead of flat key/value pairs. Existing project files still load.
- PiperISO: full BOM / cut-list / weld-TQC / supports document with a 3D render; Letter and 11×17 PDF both in Export; click-to-select in the 3D view so edits no longer require toggling to 2D.
- PiperHGR files the complete submittal datasheet (selection data, elevation schematic, BOM, dimension tables). PiperFEA captures the solver's full ten-section report. PiperFLG captures all Appendix 2 factors, the EN 1591 screen, and the stress tables. PiperNOZ reports the six-component unity ratios with WRC terms and allowables.
- Tool GUI: shared tool-mode header chrome across the paid tools; governing-check guidance on failing PiperSTR stages; status strips wrap cleanly on phone widths.
- Demo videos: current full-pass demos are embedded on the tool pages, the PiperHGR page, and pricing; two superseded 2026-07-28 first-look demos (PiperISO modeling, PiperFEA) were retired from their pages.
Calculation record
structural.support-assembly— the CSA pipe-support preset was re-baselined (shipped 2026-08-10, recorded here). The original 16×16 pier with 9 in anchor spacing sat on the ACI 318-19 17.6.2.1.2 edge-clipping cliff, so the anchorage stage failed under any realistic load; the preset now uses a 24×24 pier, 8 in embedment, 15 in spacing, a 1.25 in base plate, and supplies a product-specific adhesive bond strength so the ACI 17.6.5 bond check runs. Equations unchanged — this is a preset-input change, verified at both the shipped default and realistic 8/10 kip loads.
Plans and access
- Pro Plus monthly carries a 30-day card-required free trial, one per customer.
- Three-tier packaging finalized — Pro ($2.99/mo), Pro Plus ($7.99/mo), Ultimate ($14.99/mo) — with annual plans repriced to two months free ($29 / $79 / $149) and cancellation copy that states exactly what happens at period end.
- Paid tools gate on arrival, not only on click.
Site and documentation
- Worked-example FAQ coverage extended across the calculator pages; internal linking between guides, tools, and calculators built out; full-text llms-full.txt published for AI/LLM consumption.
- Trust pages refreshed. The embedded-data inventory on /trust/sources remains the complete list of standard data that ships in the product.
2026-07-31 — B16.5 flange dimensions extended to Classes 400, 1500 and 2500
Closes the asymmetry between connections.b165-rating (all seven classes since 2026-07-24) and the dimensional table, which stopped at Classes 150/300/600/900 — the tool could rate a Class 1500 flange but not size one.
Added
connections.b165-dimensions(new fixtureb165-dimensions.json, 12 cases) — the dimension table, previously an exported helper outside the fixture gate, is now a registered, fixture-locked lookup.- Facing/drilling and B16.20 spiral-wound sealing-element rows for Classes 400, 1500 and 2500. Coverage follows the standard, not a uniform grid: Class 400 below NPS 4 uses Class 600 dimensions by direction of the standard, Class 2500 ends at NPS 12, and NPS 26–60 remains B16.47 and out of scope.
BOLT_ROOT_AREAextended through 3-1/2" for the new bolting. - Hub dimensions X and Y on all 43 new rows, so the Appendix 2 integral-flange path covers the new classes from day one.
Changed
- An unlisted NPS/class pair now fails with an explanatory warning naming the reason the combination is not a B16.5 flange.
Fixed
- Correction — Class 600 bolting, four sizes. Auditing all 112 rows against the standard turned up five wrong cells in the pre-existing Class 600 data:
| NPS | Field | Was | Now |
|---|---|---|---|
| 0.5 | bolt dia | 5/8" | 1/2" |
| 12 | bolt dia | 1-3/8" | 1-1/4" |
| 20 | number of bolts | 20 | 24 |
| 20 | bolt dia | 1-3/4" | 1-5/8" |
| 24 | bolt dia | 2" | 1-7/8" |
These reach the Appendix 2 bolting checks through Ab (actual bolt area). NPS 20 was the worst: oversized bolts and an undercount of them left Ab wrong by −9% overall — unconservative, a joint could have been shown adequate on bolt area when it was not. No other class was affected; every corrected cell satisfies the B16.5 para. 6.5 bolt-hole cross-check, and the fixture and unit suite lock the corrected values.
Verified: double-blind transcription of B16.5-2017 Mandatory Appendix II and B16.20-2017 Table SW-2.1-1 — 485 facing/drilling cells and 214 gasket cells re-extracted and diffed, 0 mismatches (that re-extraction pass is what caught the Class 600 defects). Hub X/Y cross-checked against three independent public reproductions, 43/43 rows agreeing, and all rows satisfy the geometric invariants (bore < X < flange OD, h = Y − t > 0, g1 ≥ g0). Bolt root areas are derived, not transcribed: π/4·(D − 1.299038/n)² reproduces all thirteen pre-existing entries exactly. Dimensional data should still be verified against the standard before use for construction.
2026-07-31 — PiperFLG pre-release audit fixes: |M| in the Kellogg term; App 2 2-8(a) hub cap
Two findings from the adversarial pre-release audit of aux.app2-flange-integral, both landed before the module shipped — no released number changes.
- Kellogg moment term now uses |M| (fixture
app2-flange-integral.json, new case). A moment's sign is an artifact of the analysis frame and can never relieve a flanged joint; previously a negative Mext lowered Peq below design pressure — unconservative. Restores parity withconnections.flange-equivalent-pressure, which has always taken |M|. Axial force stays signed (compression genuinely relieves). - Longitudinal-hub allowable caps at min(1.5·Sf, 2.5·Sn) per App 2 2-8(a) for hubs welded to pipe. New optional Sn inputs apply the cap; when absent the engine emits a standing warning naming the unchecked cap. The AutoPIPE parity fixture supplies Sn — the cap does not bind there, so every anchored expect is unchanged.
2026-07-31 — PiperFLG: Appendix 2 integral (weld-neck) flange design
New calculation. aux.app2-flange covers a loose ring without a hub and cannot analyse a weld-neck flange; aux.app2-flange-integral adds the integral/hubbed case and supersedes it for new work (the loose module stays registered and fixture-locked for the API tier and the batch runner).
New modules
aux.app2-flange-integral(fixtureapp2-flange-integral.json, 3 cases) — the full Appendix 2 sequence: gasket seating and load reaction diameter, bolt loads Wm1/Wm2 with Am against Ab, the Table 2-6 integral moment arms, the bolt-spacing correction Bsc, longitudinal-hub / radial / tangential stresses with both averages, the seating case at ambient allowables, and the App 2-14 rigidity index J.aux.app2-hub-factors(exercised through the module above plus 15 unit tests) — the §2-7.6 constant series C1…C37 → E1…E6 giving the tapered-hub factors F, V and f. Sourced from an open-source implementation and corroborated term-for-term against a published reproduction of the chain.
Two conventions this entry pins down
- π/4, not 0.785, in the hydrostatic end force — matching AutoPIPE and CAESAR II; the 0.05% gap shows up when cross-checking against either.
aux.app2-flangekeeps 0.785 and is unchanged. - Bsc applies to stress, not to rigidity. Applying it to both puts J out by exactly the value of Bsc.
Verified
Against a Bentley AutoPIPE Advanced 11.01 flange report (NPS 16 Class 150 weld neck, 500 psi at 500 °F): moment (Mo 35250.22 ft·lb), hub stress (S_H 17116 psi) and both rigidity indices (J 0.357 operating / 0.275 seating) land exactly; S_R and S_T sit 0.1–0.7% off only because the report prints two factors rounded. The straight-hub limit reproduces the Code's tabulated F/V values to six figures with no special-casing.
Supporting data (not calculation modules)
- Flange/bolt allowable-stress series vs temperature and the Table 2-5.1 gasket m/y library. The gasket factors are code data; the allowable-stress series are a curated starting library that populates editable fields and is expected to be replaced with the job's own Section II Part D values — labelled as such in the UI.
- Known gap surfaced in the UI: the attached-pipe allowable Sn has no lookup — it is an editable field, and the engine warns whenever the 2-8(a) cap goes unchecked.
2026-07-31 — B16.5 Table 9 weld-neck hub dimensions (X, Y) and derived App 2 hub geometry
connections.b165-dimensions gains the two Table 9 weld-neck columns it was missing, so an Appendix 2 integral flange no longer estimates its hub: g0, g1 and h now derive exactly (g0 = (pipe OD − B)/2, g1 = (X − B)/2, h = Y − t), and the confirmation gate in front of the aux.app2-flange-integral result was removed without ever shipping. No existing calculator's output changed; aux.app2-flange is loose-type without a hub and is unaffected.
Fixed
b165Dimensions(24, "900")threw — the Class 900 NPS 24 row specifies 2.5" bolts and the root-area table stopped at 2". Added 2.5 → 4.292 in² on the same 8-UN basis as every other entry. The row was previously unreachable, so no released number changes.
Verified
X and Y transcribed from three independent public reproductions, two of them blind, then adjudicated: all 64 X and 64 Y cells agree once the raised-face convention is resolved. The one real trap: Y in this table excludes the raised face, matching the listed minimum thickness — pairing that thickness with an RF-inclusive Y inflates h by 0.06. The AutoPIPE reference report's h = 3.56 at NPS 16 Class 150 is reproduced by both conventions independently. Locked by 18 unit cases including two all-row invariant sweeps. (Superseded the same day: the seven-class expansion above registers the table with fixture b165-dimensions.json.)
2026-07-31 — PiperSTR: AISC 360-22 + ACI 318-19 structural pipe-support design
New product line. Six modules covering the whole structural load path of a pipe support — the first calc-core surface to carry both LRFD and ASD from one nominal-strength core.
| Module id | Scope |
|---|---|
structural.aisc-member | AISC 360-22 Ch. B4 classification, D tension, E compression, F2-F10 flexure, G shear, H1 interaction, deflection |
structural.fillet-weld | AISC J2 fillet welds with the directional strength increase and a J4 base-metal rupture check |
structural.baseplate-anchorage | AISC J8 bearing, Design Guide 1 plate yielding, ACI 318-19 Ch. 17 anchorage and the 17.8 interaction |
structural.pier-soil | Soil bearing, overturning, sliding, ACI Ch. 22 punching shear |
structural.support-assembly | The cascade: pipe load → arm → weld → column → weld → base plate → anchors → pier → soil |
Fixtures: piperstr-member.json (14 cases), piperstr-weld.json (4), piperstr-baseplate.json (4), piperstr-pier.json (3), all with self-contained inputs so a fixture cannot silently change when the shapes dataset is regenerated.
Verified against published AISC Steel Construction Manual values: Table 3-2 Mp / Lp / Lr match to three significant figures for four benchmark W shapes, and the engine independently reproduces the Manual's exact ten-shape non-compact-flange footnote list from Table B4.1b arithmetic alone.
New dataset aisc.shapes-v16 (mode derived) — 1,506 shapes from AISC's freely published Shapes Database v16.0; L, HSS and Pipe computed from nominal geometry by a generator that gates itself against published AISC values and refuses to emit on a mismatch. Four defects were caught by those gates before ship (HSS corner slivers, a missing ACI 17.6.2.1.2 substitution, a base-plate yield-line over-demand, and D1/E2 slenderness now correctly advisory), and a check with an infinite ratio now sorts to the top of the governing roll-up in all modules.
Data firewall. AISC 360 and ACI 318 equations are methods and live in code. Proprietary anchor qualification data (adhesive bond stress, product-specific factors) is never embedded — it arrives from the user's ICC-ES evaluation report, and an adhesive anchor without it reports that the bond check did not run rather than passing silently. Soil bearing, friction and cohesion are likewise always user-supplied.
Supersedes general.aisc-member-check, which remains registered (ASD only) for API and batch callers.
2026-07-30 — Line-depth expansion: 13 calculators (documentation backfill)
Documentation-only entry, recorded 2026-07-31. These modules shipped 2026-07-30 in one commit without a changelog record; no calculation behavior is changed by this entry — it backfills the record so each module's landing page has a true source for its published "last updated" stamp.
pipeline.maop(fixturepipeline-maop.json, 3 cases) — MAOP/MOP as the lowest of design pressure, test-qualified pressure, and an optional cap, reporting which basis governed. Verified: hand-derived trio.aux.water-hammer(fixturewater-hammer.json, 2 cases) — Joukowsky surge with the elastic wave-speed correction and critical closure period. Verified: hand-derived steel water line.pipeline.slurry-velocity(fixtureslurry-velocity.json, 2 cases) — Durand–Condolios critical deposition velocity vs actual, PASS/FAIL. Verified: hand-derived sand-water pair.pipeline.charpy-arrest(fixturecharpy-arrest.json, 2 cases) — Battelle/AGA ductile fracture arrest energy with PASS/FAIL vs the MTR value. Verified: hand-derived pair.pipeline.dent-screening(fixturedent-screening.json, 2 cases) — plain-dent depth as %OD against a user-supplied limit. Verified: hand-derived pair.pipeline.dnv-f101-defect(fixturednv-f101-defect.json, 2 cases) — DNV-RP-F101 Part B single-defect capacity and utilization. Verified: hand-derived X52 pair.pipeline.erosional-velocity(fixtureerosional-velocity.json, 2 cases) — API RP 14E erosional velocity with the actual-velocity ratio. Verified: hand-derived pair.pipeline.hydrotest(fixturepipeline-hydrotest.json, 2 cases) — pipeline strength test pressure with the Barlow hoop check against a %SMYS cap. Verified: hand-derived pair.flexibility.expansion-interpolation(fixtureexpansion-interpolation.json, 1 case) — interpolation between two user-entered expansion-table rows, scaled to total growth; warns on extrapolation. Verified: hand-derived midpoint.aux.snow-ice-load(fixturesnow-ice-load.json, 2 cases) — radial ice annulus plus snow on the projected width. Verified: hand-derived pair.
Code-table values (design factors, C-factors, FL, ice/snow parameters) are user-supplied throughout, and each module carries its applicability warnings on every run.
2026-07-30 — Engineering Tools expansion: six PVP-Suite-parity calculators + two corrections
Five new modules, one extension, and one correction, all fixture-locked and anchored to the PVP Suite validation set where its inputs could be reverse-derived, hand-derived otherwise.
Added
general.criticality(fixturecriticality.json, 3 cases) — line/component criticality screening in the API 580/581 spirit, CLASS 1–4 with drivers.general.ejma-rating(fixtureejma-rating.json, 2 cases) — EJMA-framework bellows screening: pressure thrust, spring forces, anchor load, column-squirm screen. Effective-area anchor reproduces the PVP selftest.general.aisc-member-check(fixtureaisc-member-check.json, 2 cases) — AISC 360 ASD member check, compact non-slender members. Hand-derived.general.analysis-set(fixtureanalysis-set.json, 2 cases) — one load case compared under B31.1/B31.3/B31.4/B31.8 with per-row unity and a governing verdict; allowable factors are explicit inputs. Hand-derived.connections.en1591-screen(fixtureen1591-screen.json, 2 cases) — EN 1591-1 load-balance screening; explicitly NOT the full iterative method. Effective-area anchor reproduces the PVP selftest.
Changed
pipeline.b31g(fixtureb31g.json, +2 cases) — extended with Modified B31G and the stress-based path (S_fail, P_safe, ERF, the d/t > 0.8 rule). The legacy pressure-based form and both existing cases are unchanged. Verified: hand-derived pair on the same defect.piping.b31-sif(fixtureb31-sif.json, expected values corrected) — correction for the welding-tee branch: App D Table D300 assigns the tee io = 0.9/h^(2/3) with ii = 0.75·io + 0.25; the module previously applied the elbow assignment to tees, overstating ii and understating io (1.40904 vs the correct 1.69084 — unconservative out-of-plane). Elbow behavior unchanged; the PVP selftest's welding-tee anchor confirms the corrected assignment. Card relocations only on the UI side (enginepiping.fatigue-factorunchanged).
2026-07-24 — B16.5 flange pressure–temperature rating lookup (new module)
New module connections.b165-rating (fixture b165-rating.json, 8 cases): ASME B16.5-2017 pressure–temperature ratings for material Groups 1.1, 2.1, 2.2 and 2.3, Classes 150–2500, with linear interpolation per B16.5 Section 2 and per-group material sub-limit warnings. Rating data embedded and fixture-locked; B16.47 deliberately excluded. Verified: double-blind transcription (two independent readers per table, zero cell disagreements) plus hand-derived interpolation cases locked in the fixture.
2026-07-22 — New locked fixture cases behind published worked examples
No equation, limit, or verdict logic changed. Six hand-derived fixture cases added (and one existing case's expected values locked) so every worked example published on the calculator landing pages is CI-gated: piping.b313-wall-thickness (two new cases), piping.b311-wall-thickness, pipeline.b31g (pass path), piping.branch-reinforcement (expected values locked), noncode.thermal-growth, and bpe.cip-velocity.
2026-07-21 — PiperFEA nozzle/shell FEA goes live
Scope note: covers the FEA service, outside this file's usual calc-core scope, because it is a calculation surface users can run.
fea.nozzle-shell— nozzle-to-shell finite element analysis (shell meshing + CalculiX) on an isolated server-side worker. Reports Pl, Qb, Pl+Pb+Q and Pl+Pb+Q+F against their allowables, plus a job report in the legacy FE/Pipe layout with a 3D junction-stress plot. The fatigue allowable Sa implements the ASME VIII-2 Appendix 5 design fatigue curve with the E-ratio correction and Ke factor; the B31 and Markl bounds are reported alongside.
Verified: Sa and the B31 bound reproduce the legacy commercial-FEA reference reports to the psi on all 35 golden fixtures carrying a fatigue result. Secondary-stress ratio agreement: 19 of 24 runnable fixtures gated (15 within ±20%, 4 within ±35%); geometry outside the validated envelope is refused at submission rather than answered with a number. v1 limit: surface-maximum von Mises within a junction-local window stands in for a through-thickness linearized result — conservative.
2026-07-19 — Thermal Flexibility line
flexibility.expansion-loop(fixtureexpansion-loop.json, 5 cases) — guided-cantilever expansion loop / Z / L leg sizing, metallic and plastic families. Verified: reproduces the published coefficient rules 6.225·√(ΔL·D) and 4·√(ΔL·D) within 0.03%.
2026-07-14 — Pipe support spring selection
supports.variable-spring-select(fixturevariable-spring-select.json) andsupports.compact-spring-select(fixturecompact-spring-select.json) — variable- and compact-spring catalog selection (mode: derived data). Verified against published catalog load tables; catalog data remains mode-derivedwith attribution.
2026-07-04 — BPE line expansion + Equipment/Non-Metallic ports
Added
- BPE:
bpe.cip-velocity(SD-6.3.5.2.1),bpe.tube-weld-acceptance(MJ-8.4-1),bpe.pre-pren(App. F-3),bpe.ferrite-number(WRC-1992),bpe.ra-finish(SF-2.4.1-1),bpe.ep-passivation(App. H/E),bpe.polymer-thermal-expansion(PM-4.2.3). Fixtures: one file per module. - Equipment:
equipment.shell-nozzle-loads(WRC-107 / VIII-2 5.5 screen), ASME VIII-1vessel.ug27-shell,vessel.ug32-head,vessel.ug28-external(+UG-99),vessel.ug37-nozzle-area;aux.wrc-terms. - Non-Metallic:
nonmetallic.hdpe-n755,nonmetallic.frp-grp(NM-2 / ISO 14692 / BS 7159). - Auxiliary:
aux.app2-flange(Sec VIII App 2 loose-type),aux.asce-occasional.
Changed
- Data service: BPE Part DT-4.1 fitting dimensions and the SD-3.1.2.2 dead-leg limit ship embedded — see the source & citation policy for the complete embedded-data inventory. All other standards data stays user-supplied.
Verified
- Seventeen calculators fixture-anchored to the PVP Suite validation set (112 checks); the exact inputs behind each PVP expected value were reverse-derived and locked as fixtures.
2026-07-03 — BPE toolset full-parity port
bpe.unit-converter(App. U incl. Ra & slope units),bpe.dead-leg(SD-3.1.2.2 with small-branch advisory),bpe.slope-check+bpe.slope-report(SD-2.4.3 GSD + drainability classification),bpe.spray-flow(SD-3.9.2 device-type bands). Fixtures: one file per module. Verified: full-parity port, case-for-case against the legacy BPE toolset's results.
2026-07-03 — Phase 1 core
Added
- Piping:
piping.b313-wall-thickness,piping.b311-wall-thickness,pipeline.b31-wall-thickness,piping.b31-allowable-pressure,pipeline.b31-allowable-pressure,piping.leak-test-pressure,piping.bend-thickness,piping.miter-allowable-pressure,piping.branch-reinforcement. - Flexibility/stress:
piping.b31-sif(App. D closed forms),piping.displacement-stress,piping.sustained-stress,piping.fatigue-factor,pipeline.b31g. - Supports:
supports.spring-variability,supports.max-spring-rate; non-codenoncode.pipe-weight,noncode.pipe-section,noncode.thermal-growth,noncode.collapse-pressure,noncode.rolling-offset,noncode.interpolate. - Connections/Auxiliary:
connections.nozzle-load-check,connections.nema-sm23,connections.flange-equivalent-pressure,aux.wind-asce,aux.b31e-seismic,aux.pressure-thrust,aux.column-buckling. - Non-Metallic:
nonmetallic.hdpe-pressure-rating,nonmetallic.support-span.
Verified
- Hand-derived fixture per module (derivation recorded in each fixture's
description); stress-range and SIF modules cross-checked against the PVP Suite selftest values.