{
  "version": "v1",
  "source": "https://craftquantities.com",
  "licence": "CC BY 4.0",
  "licenceUrl": "https://creativecommons.org/licenses/by/4.0/",
  "attribution": "Craft Quantities — craftquantities.com",
  "documentation": "https://craftquantities.com/api/",
  "versioning": "Fields are added, never removed or repurposed, within a version. A breaking change becomes /api/v2/ and v1 keeps being built.",
  "status": "First-party validation. Not independent review.",
  "statement": "These are the vectors the test suite runs, published verbatim. They were written by the same people who wrote the calculators, so they establish that the maths does what its author intended — not that the author was right. No independent review of this catalogue exists, and none is claimed.",
  "howToReproduce": "https://craftquantities.com/validation/",
  "provenance": {
    "steps": "Every vector publishes the worked steps the calculator produced for those inputs — the same labelled intermediates the page renders. These are derived by running the vector, not authored, so a disagreement can be localised to a step.",
    "basis": "`basis` says what the expected value rests on, and claims only what is true by construction. `cited`: the vector names one of the calculator's sources, by `sourceIndex`. `sole-source`: the calculator declares exactly one source, so whatever basis the value has beyond arithmetic, it is that one — a pigeonhole, not a judgement. `ambiguous`: the calculator declares two or more and the registry does not record which.",
    "notClaimed": "These expected values were computed by the same author who wrote the formula, from that formula. Where `basis` is `sole-source` that means the calculator's stated basis, NOT that the cited document publishes this worked example. No vector claims to reproduce a figure printed in a standard unless it says so in its own name."
  },
  "toleranceMeaning": "A vector passes when |result − expected| < 0.5 × 10^−toleranceDecimalPlaces. Absent means 2; 0 means the nearest whole number; negative and fractional values widen the margin for coarse figures (−1 is within 5, 0.5 within about 0.16).",
  "coverage": {
    "calculatorCount": 1151,
    "vectorCount": 3302,
    "withWorkedSteps": 2800,
    "withoutWorkedSteps": 502,
    "withoutWorkedStepsConverters": 40,
    "withoutStepsOrNote": 236,
    "identicalToDefaults": 987,
    "omittingAnInput": 300,
    "cited": 954,
    "soleSource": 1436,
    "ambiguous": 912,
    "withSelect": 249,
    "everySelectOptionExercised": 136,
    "selectOptionNeverExercised": 113,
    "metricAnswerUnpinned": 79,
    "meaning": {
      "identicalToDefaults": "Vectors that specify every input and give each one the page's own default. They pin the first thing a visitor sees, which is worth pinning, and characterise nothing else.",
      "withoutWorkedSteps": "Vectors whose calculator returns no breakdown for those inputs.",
      "withoutStepsOrNote": "Of those, the ones with no written confidence note either, so the expected value is literally all a reviewer gets. Only 40 of the 502 step-less vectors are single-step conversions where there is genuinely nothing between input and answer (measured, in withoutWorkedStepsConverters); the rest are ordinary calculators that show no working, which is a gap in the pages as much as in this corpus.",
      "selectOptionNeverExercised": "Calculators carrying a select option that no vector ever selects. That branch of the formula is unmeasured by this corpus however green the suite is.",
      "metricAnswerUnpinned": "Calculators on which at least one vector gives a different value or unit when run as a metric visitor's page runs it. The suite runs every vector without a unit system, so their metric answer is pinned by no vector here.",
      "omittingAnInput": "Vectors that leave an input out of their inputs object, so the compute sees `undefined` rather than the default. Deliberate where a calculator treats the absence as a case; listed because it is otherwise invisible."
    }
  },
  "calculatorCount": 1151,
  "vectorCount": 3302,
  "calculators": [
    {
      "slug": "aac-thin-bed-mortar-calculator",
      "title": "AAC Block Thin-Bed Mortar Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/aac-thin-bed-mortar-calculator/",
      "sources": [
        "AAC thin-bed mortar consumption = wall area x joint thickness (mm) x the specific product's coverage rate (kg per m² per mm of joint thickness), per manufacturer technical data sheets. Thin-bed mortar is stocked in 25 kg bags in the metric markets where AAC is a mainstream system; no comparably standard North American bag size is established here, so the imperial result is reported as a mortar quantity rather than a bag count"
      ],
      "vectors": [
        {
          "name": "50m² wall, 2mm joint, 1.3 kg/m²/mm",
          "inputs": {
            "wallArea": 50,
            "jointThicknessMm": 0.002,
            "coverageRateKgM2PerMm": 1.3
          },
          "expected": 130,
          "toleranceDecimalPlaces": 0,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Wall area",
              "value": 50,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "80m² wall, 3mm joint, 1.2 kg/m²/mm",
          "inputs": {
            "wallArea": 80,
            "jointThicknessMm": 0.003,
            "coverageRateKgM2PerMm": 1.2
          },
          "expected": 288,
          "toleranceDecimalPlaces": 0,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Wall area",
              "value": 80,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "aashto-structural-number-calculator",
      "title": "Flexible Pavement AASHTO Structural Number (SN) Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/aashto-structural-number-calculator/",
      "sources": [
        "AASHTO 1993 Guide for Design of Pavement Structures: SN = a1×D1 + a2×D2×m2 + a3×D3×m3, where a1/a2/a3 are layer coefficients for the surface/base/subbase layers, D1/D2/D3 are layer thicknesses (in), and m2/m3 are drainage coefficients for the base/subbase layers"
      ],
      "vectors": [
        {
          "name": "4in surface / 8in base / 6in subbase, m=1.0",
          "inputs": {
            "surfaceCoefficient": 0.44,
            "surfaceThickness": 0.1016,
            "baseCoefficient": 0.14,
            "baseThickness": 0.2032,
            "baseDrainageCoefficient": 1,
            "subbaseCoefficient": 0.11,
            "subbaseThickness": 0.1524,
            "subbaseDrainageCoefficient": 1
          },
          "expected": 3.54,
          "toleranceDecimalPlaces": 1,
          "unit": "SN",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "5in surface / 10in base / 8in subbase, m<1.0",
          "inputs": {
            "surfaceCoefficient": 0.42,
            "surfaceThickness": 0.127,
            "baseCoefficient": 0.12,
            "baseThickness": 0.254,
            "baseDrainageCoefficient": 0.9,
            "subbaseCoefficient": 0.1,
            "subbaseThickness": 0.2032,
            "subbaseDrainageCoefficient": 0.9
          },
          "expected": 3.9,
          "toleranceDecimalPlaces": 1,
          "unit": "SN",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "ac-size-calculator",
      "title": "Air Conditioner Size Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/ac-size-calculator/",
      "sources": [
        "ACCA Manual J (8th ed.) — residential load calculation. This page is a screening approximation of it, not an implementation.",
        "1 ton of refrigeration = 12,000 BTU/h (ASHRAE Terminology)",
        "ACCA Manual S — equipment selection should follow the calculated load, not floor area alone"
      ],
      "vectors": [
        {
          "name": "100 m² moderate, average, average, 2 people",
          "inputs": {
            "floorArea": 100,
            "climate": "moderate",
            "insulation": "average",
            "sunExposure": "average",
            "occupants": 2,
            "kitchen": "no"
          },
          "expected": 21527.82,
          "toleranceDecimalPlaces": -1,
          "unit": "BTU/h",
          "confidence": "low",
          "steps": [
            {
              "label": "Refrigeration tons",
              "value": 1.7939850694516204,
              "unit": "tons"
            },
            {
              "label": "Kilowatts",
              "value": 6.309181490126051,
              "unit": "kW"
            },
            {
              "label": "Envelope and solar",
              "value": 21527.820833419446,
              "unit": "BTU/h"
            },
            {
              "label": "Occupants beyond two",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Kitchen",
              "value": 0,
              "unit": "BTU/h"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Poor insulation raises the load 25%",
          "inputs": {
            "floorArea": 100,
            "climate": "moderate",
            "insulation": "poor",
            "sunExposure": "average",
            "occupants": 2,
            "kitchen": "no"
          },
          "expected": 26909.78,
          "toleranceDecimalPlaces": -1,
          "unit": "BTU/h",
          "confidence": "low",
          "steps": [
            {
              "label": "Refrigeration tons",
              "value": 2.2424813368145258,
              "unit": "tons"
            },
            {
              "label": "Kilowatts",
              "value": 7.886476862657563,
              "unit": "kW"
            },
            {
              "label": "Envelope and solar",
              "value": 26909.77604177431,
              "unit": "BTU/h"
            },
            {
              "label": "Occupants beyond two",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Kitchen",
              "value": 0,
              "unit": "BTU/h"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A hot climate and heavy sun",
          "inputs": {
            "floorArea": 100,
            "climate": "hot",
            "insulation": "average",
            "sunExposure": "heavy",
            "occupants": 2,
            "kitchen": "no"
          },
          "expected": 30945.24,
          "toleranceDecimalPlaces": -1,
          "unit": "BTU/h",
          "confidence": "low",
          "steps": [
            {
              "label": "Refrigeration tons",
              "value": 2.578853537336704,
              "unit": "tons"
            },
            {
              "label": "Kilowatts",
              "value": 9.069448392056197,
              "unit": "kW"
            },
            {
              "label": "Envelope and solar",
              "value": 30946.24244804045,
              "unit": "BTU/h"
            },
            {
              "label": "Occupants beyond two",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Kitchen",
              "value": 0,
              "unit": "BTU/h"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Extra occupants and a kitchen add fixed load",
          "inputs": {
            "floorArea": 100,
            "climate": "moderate",
            "insulation": "average",
            "sunExposure": "average",
            "occupants": 5,
            "kitchen": "yes"
          },
          "expected": 27327.82,
          "toleranceDecimalPlaces": -1,
          "unit": "BTU/h",
          "confidence": "low",
          "steps": [
            {
              "label": "Refrigeration tons",
              "value": 2.277318402784954,
              "unit": "tons"
            },
            {
              "label": "Kilowatts",
              "value": 8.008993697124927,
              "unit": "kW"
            },
            {
              "label": "Envelope and solar",
              "value": 21527.820833419446,
              "unit": "BTU/h"
            },
            {
              "label": "Occupants beyond two",
              "value": 1800,
              "unit": "BTU/h"
            },
            {
              "label": "Kitchen",
              "value": 4000,
              "unit": "BTU/h"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "access-floor-cutout-calculator",
      "title": "Access Floor Cable Cutout Area Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/access-floor-cutout-calculator/",
      "sources": [
        "Total cutout area = number of cutouts × the area of each cutout, a simple aggregation for planning grommet/brush-cutout openings in access floor panels"
      ],
      "vectors": [
        {
          "name": "12 cutouts, 0.01 m² each",
          "inputs": {
            "cutoutCount": 12,
            "cutoutArea": 0.01
          },
          "expected": 0.12,
          "toleranceDecimalPlaces": 2,
          "unit": "m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "20 cutouts, 0.015 m² each",
          "inputs": {
            "cutoutCount": 20,
            "cutoutArea": 0.015
          },
          "expected": 0.3,
          "toleranceDecimalPlaces": 2,
          "unit": "m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "access-floor-panel-count-calculator",
      "title": "Raised Access Floor Panel and Border Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/access-floor-panel-count-calculator/",
      "sources": [
        "Grid set-out geometry, not a code figure: whole modules along each axis = floor((room dimension − origin offset) ÷ panel module), and the remainder at each end is that wall's border",
        "The panel module is a product dimension entered by the user — 600 mm across the metric systems and 24 in across the North American ones. The imperial page opens on 2 ft and the metric page on 600 mm for that reason",
        "Distinct from this site's CLT Floor Panel Grid Layer Calculator, which divides an area by a panel area. This one lays a grid out from a chosen origin and is therefore able to report cut panels and border widths, which an area division cannot"
      ],
      "vectors": [
        {
          "name": "10 m by 6 m room, 600 mm module, 900 mm offset both ways",
          "inputs": {
            "roomLength": 10,
            "roomWidth": 6,
            "panelModule": 0.6,
            "offsetAlongLength": 0.9,
            "offsetAlongWidth": 0.9
          },
          "expected": 144,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cut panels around the border",
              "value": 54,
              "unit": "panels"
            },
            {
              "label": "Panels in total, whole and cut",
              "value": 198,
              "unit": "panels"
            },
            {
              "label": "Border at the first long wall",
              "value": 0.30000000000000004,
              "unit": "m"
            },
            {
              "label": "Border at the opposite long wall",
              "value": 0.09999999999999964,
              "unit": "m"
            },
            {
              "label": "Border at the first end wall",
              "value": 0.30000000000000004,
              "unit": "m"
            },
            {
              "label": "Border at the opposite end wall",
              "value": 0.2999999999999998,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "12 m by 8.2 m room, 600 mm module, 150 mm origin offset both ways",
          "inputs": {
            "roomLength": 12,
            "roomWidth": 8.2,
            "panelModule": 0.6,
            "offsetAlongLength": 0.15,
            "offsetAlongWidth": 0.15
          },
          "expected": 247,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "high",
          "steps": [
            {
              "label": "Cut panels around the border",
              "value": 68,
              "unit": "panels"
            },
            {
              "label": "Panels in total, whole and cut",
              "value": 315,
              "unit": "panels"
            },
            {
              "label": "Border at the first long wall",
              "value": 0.15,
              "unit": "m"
            },
            {
              "label": "Border at the opposite long wall",
              "value": 0.4499999999999993,
              "unit": "m"
            },
            {
              "label": "Border at the first end wall",
              "value": 0.15,
              "unit": "m"
            },
            {
              "label": "Border at the opposite end wall",
              "value": 0.2499999999999991,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "10 m by 6 m room set out hard against both walls",
          "inputs": {
            "roomLength": 10,
            "roomWidth": 6,
            "panelModule": 0.6,
            "offsetAlongLength": 0,
            "offsetAlongWidth": 0
          },
          "expected": 160,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "high",
          "steps": [
            {
              "label": "Cut panels around the border",
              "value": 10,
              "unit": "panels"
            },
            {
              "label": "Panels in total, whole and cut",
              "value": 170,
              "unit": "panels"
            },
            {
              "label": "Border at the first long wall",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Border at the opposite long wall",
              "value": 0.40000000000000036,
              "unit": "m"
            },
            {
              "label": "Border at the first end wall",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Border at the opposite end wall",
              "value": 0,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "3 m square on a 1.2 m module with a half-module offset",
          "inputs": {
            "roomLength": 3,
            "roomWidth": 3,
            "panelModule": 1.2,
            "offsetAlongLength": 0.6,
            "offsetAlongWidth": 0.6
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "high",
          "steps": [
            {
              "label": "Cut panels around the border",
              "value": 5,
              "unit": "panels"
            },
            {
              "label": "Panels in total, whole and cut",
              "value": 9,
              "unit": "panels"
            },
            {
              "label": "Border at the first long wall",
              "value": 0.6,
              "unit": "m"
            },
            {
              "label": "Border at the opposite long wall",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Border at the first end wall",
              "value": 0.6,
              "unit": "m"
            },
            {
              "label": "Border at the opposite end wall",
              "value": 0,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "access-floor-pedestal-calculator",
      "title": "Raised Access Floor Pedestal Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/access-floor-pedestal-calculator/",
      "sources": [
        "Pedestal count follows a grid layout: count along each dimension = ceil(dimension ÷ grid spacing) + 1; total pedestals = the product of both dimension counts, matching standard 600mm (24in) access floor panel grid spacing"
      ],
      "vectors": [
        {
          "name": "10m x 8m room, 0.6m grid",
          "inputs": {
            "roomLength": 10,
            "roomWidth": 8,
            "gridSpacing": 0.6
          },
          "expected": 270,
          "toleranceDecimalPlaces": -1,
          "unit": "pedestals",
          "confidence": "high",
          "steps": [
            {
              "label": "Pedestals along length",
              "value": 18
            },
            {
              "label": "Pedestals along width",
              "value": 15
            },
            {
              "label": "Cut panel along the room",
              "value": 0.40000000000000036,
              "unit": "m"
            },
            {
              "label": "Cut panel across the room",
              "value": 0.20000000000000018,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "12m x 9m room, 0.6m grid",
          "inputs": {
            "roomLength": 12,
            "roomWidth": 9,
            "gridSpacing": 0.6
          },
          "expected": 336,
          "toleranceDecimalPlaces": -1,
          "unit": "pedestals",
          "confidence": "high",
          "steps": [
            {
              "label": "Pedestals along length",
              "value": 21
            },
            {
              "label": "Pedestals along width",
              "value": 16
            },
            {
              "label": "Cut panel along the room",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Cut panel across the room",
              "value": 0,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "access-floor-rolling-load-check-calculator",
      "title": "Raised Access Floor Rolling Load Check Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/access-floor-rolling-load-check-calculator/",
      "sources": [
        "CISCA Recommended Test Procedures for Access Floors — rolling load is rated by passing a defined wheel over the panel a set number of times, at both a low pass count and a high one, and a panel carries a different rating for each",
        "BS EN 12825, Raised access floors — the European counterpart, which classifies panels by load capacity and states the rolling load separately from the concentrated and uniformly distributed cases",
        "The governing wheel load is the delivered weight divided by the number of wheels genuinely sharing it. On a pivot turn that is fewer wheels than the equipment has, which is the case this check exists for"
      ],
      "vectors": [
        {
          "name": "500 kg rack on four castors, two sharing on a pivot, high-pass rating",
          "inputs": {
            "equipmentWeight": 500,
            "wheelCount": 4,
            "sharingWheels": 2,
            "ratingLowPass": 450,
            "ratingHighPass": 320,
            "passRegime": "high"
          },
          "expected": 250,
          "toleranceDecimalPlaces": 3,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Wheel load with the load shared evenly",
              "value": 125,
              "unit": "kg"
            },
            {
              "label": "Wheel load on a pivot turn",
              "value": 250,
              "unit": "kg"
            },
            {
              "label": "Panel rating applied",
              "value": 320,
              "unit": "kg"
            },
            {
              "label": "Spare capacity against that rating",
              "value": 70,
              "unit": "kg"
            },
            {
              "label": "Utilisation of the panel rating",
              "value": 78.125,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "900 kg on six wheels, three sharing, one-time delivery route",
          "inputs": {
            "equipmentWeight": 900,
            "wheelCount": 6,
            "sharingWheels": 3,
            "ratingLowPass": 600,
            "ratingHighPass": 450,
            "passRegime": "low"
          },
          "expected": 300,
          "toleranceDecimalPlaces": 3,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Wheel load with the load shared evenly",
              "value": 150,
              "unit": "kg"
            },
            {
              "label": "Wheel load on a pivot turn",
              "value": 300,
              "unit": "kg"
            },
            {
              "label": "Panel rating applied",
              "value": 600,
              "unit": "kg"
            },
            {
              "label": "Spare capacity against that rating",
              "value": 300,
              "unit": "kg"
            },
            {
              "label": "Utilisation of the panel rating",
              "value": 50,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Sharing count above the wheel count is clamped to the wheels present",
          "inputs": {
            "equipmentWeight": 400,
            "wheelCount": 2,
            "sharingWheels": 8,
            "ratingLowPass": 450,
            "ratingHighPass": 320,
            "passRegime": "high"
          },
          "expected": 200,
          "toleranceDecimalPlaces": 3,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Wheel load with the load shared evenly",
              "value": 200,
              "unit": "kg"
            },
            {
              "label": "Wheel load on a pivot turn",
              "value": 200,
              "unit": "kg"
            },
            {
              "label": "Panel rating applied",
              "value": 320,
              "unit": "kg"
            },
            {
              "label": "Spare capacity against that rating",
              "value": 120,
              "unit": "kg"
            },
            {
              "label": "Utilisation of the panel rating",
              "value": 62.5,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "access-floor-stringer-calculator",
      "title": "Raised Access Floor Stringer Bar Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/access-floor-stringer-calculator/",
      "sources": [
        "In a stringer-braced access floor grid, connecting bars run between every adjacent pair of pedestals in both directions: horizontal connections = (pedestals along length − 1) × pedestals along width; vertical connections = pedestals along length × (pedestals along width − 1)"
      ],
      "vectors": [
        {
          "name": "10m x 8m room, 0.6m grid",
          "inputs": {
            "roomLength": 10,
            "roomWidth": 8,
            "gridSpacing": 0.6
          },
          "expected": 507,
          "toleranceDecimalPlaces": -1,
          "unit": "stringers",
          "confidence": "high",
          "steps": [
            {
              "label": "Pedestals along length",
              "value": 18
            },
            {
              "label": "Pedestals along width",
              "value": 15
            },
            {
              "label": "Short bay at the wall, along the room",
              "value": 0.40000000000000036,
              "unit": "m"
            },
            {
              "label": "Short bay at the wall, across the room",
              "value": 0.20000000000000018,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "12m x 9m room, 0.6m grid",
          "inputs": {
            "roomLength": 12,
            "roomWidth": 9,
            "gridSpacing": 0.6
          },
          "expected": 635,
          "toleranceDecimalPlaces": -1,
          "unit": "stringers",
          "confidence": "high",
          "steps": [
            {
              "label": "Pedestals along length",
              "value": 21
            },
            {
              "label": "Pedestals along width",
              "value": 16
            },
            {
              "label": "Short bay at the wall, along the room",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Short bay at the wall, across the room",
              "value": 0,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "access-panel-deduction-calculator",
      "title": "Access Panel Cutout Area Deduction Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/access-panel-deduction-calculator/",
      "sources": [
        "Net area = gross area − (number of access panels × panel area), so material takeoffs aren't overestimated by the area removed for access panel openings"
      ],
      "vectors": [
        {
          "name": "50m² gross, 3 panels x 0.36m²",
          "inputs": {
            "grossArea": 50,
            "panelCount": 3,
            "panelArea": 0.36
          },
          "expected": 48.92,
          "toleranceDecimalPlaces": 2,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Total deducted area",
              "value": 1.08,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "80m² gross, 5 panels x 0.25m²",
          "inputs": {
            "grossArea": 80,
            "panelCount": 5,
            "panelArea": 0.25
          },
          "expected": 78.75,
          "toleranceDecimalPlaces": 2,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Total deducted area",
              "value": 1.25,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "accessible-parking-space-count-calculator",
      "title": "Accessible Parking Space Count Calculator",
      "url": "https://craftquantities.com/calculators/auto-utility/accessible-parking-space-count-calculator/",
      "sources": [
        "ADA Standards for Accessible Design, Section 208.2 — the scoping table relating total spaces provided in a parking facility to the minimum number complying with Section 502, including the two percent rule from 501 to 1,000 spaces and the twenty-plus-one-per-hundred rule above that",
        "ADA Standards for Accessible Design, Section 208.2.4 — at least one van-accessible space for every six, or fraction of six, accessible spaces required",
        "ADA Standards for Accessible Design, Sections 208.2.1 and 208.2.2 — ten percent of patient and visitor spaces at hospital outpatient facilities, and twenty percent at rehabilitation and outpatient physical therapy facilities",
        "Scoping is applied per parking facility, not to a site total. State and local accessibility codes may require more, and where they do they govern."
      ],
      "vectors": [
        {
          "name": "250 spaces in one general lot",
          "inputs": {
            "totalSpaces": 250,
            "facilities": 1,
            "occupancy": "general"
          },
          "expected": 7,
          "toleranceDecimalPlaces": 0,
          "unit": "spaces",
          "confidence": "high",
          "steps": [
            {
              "label": "Of those, van-accessible",
              "value": 2,
              "unit": "spaces"
            },
            {
              "label": "Remaining car-accessible",
              "value": 5,
              "unit": "spaces"
            },
            {
              "label": "Spaces per parking facility",
              "value": 250,
              "unit": "spaces"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "480 spaces split between two lots",
          "inputs": {
            "totalSpaces": 480,
            "facilities": 2,
            "occupancy": "general"
          },
          "expected": 14,
          "toleranceDecimalPlaces": 0,
          "unit": "spaces",
          "confidence": "high",
          "steps": [
            {
              "label": "Of those, van-accessible",
              "value": 4,
              "unit": "spaces"
            },
            {
              "label": "Remaining car-accessible",
              "value": 10,
              "unit": "spaces"
            },
            {
              "label": "Spaces per parking facility",
              "value": 240,
              "unit": "spaces"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "1,450 spaces, above where the table becomes a formula",
          "inputs": {
            "totalSpaces": 1450,
            "facilities": 1,
            "occupancy": "general"
          },
          "expected": 25,
          "toleranceDecimalPlaces": 0,
          "unit": "spaces",
          "confidence": "high",
          "steps": [
            {
              "label": "Of those, van-accessible",
              "value": 5,
              "unit": "spaces"
            },
            {
              "label": "Remaining car-accessible",
              "value": 20,
              "unit": "spaces"
            },
            {
              "label": "Spaces per parking facility",
              "value": 1450,
              "unit": "spaces"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "120 patient and visitor spaces at a hospital outpatient facility",
          "inputs": {
            "totalSpaces": 120,
            "facilities": 1,
            "occupancy": "hospital"
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "spaces",
          "confidence": "high",
          "steps": [
            {
              "label": "Of those, van-accessible",
              "value": 2,
              "unit": "spaces"
            },
            {
              "label": "Remaining car-accessible",
              "value": 10,
              "unit": "spaces"
            },
            {
              "label": "Spaces per parking facility",
              "value": 120,
              "unit": "spaces"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "accessible-ramp-flights-landings-calculator",
      "title": "Accessible Ramp Flights and Landings Calculator (Approved Document M)",
      "url": "https://craftquantities.com/calculators/materials-quantities/accessible-ramp-flights-landings-calculator/",
      "sources": [
        "Approved Document M Volume 2, Table 1, Limits for ramp gradients: a flight with a 10 m going may be 1:20 with a maximum rise of 500 mm, a 5 m going 1:15 with 333 mm, and a 2 m going 1:12 with 166 mm; for goings between 2 m and 10 m the gradient may be interpolated — 1:14 for a 4 m going, 1:19 for a 9 m going",
        "Approved Document M Volume 2, para 1.26: no flight with a going over 10 m or a rise over 500 mm; landings at the foot and head at least 1.2 m long and intermediate landings at least 1.5 m, clear of door swings; 1800 mm by 1800 mm passing places where one end of the ramp cannot be seen from the other or there are three flights or more; a surface width of at least 1.5 m; an alternative such as a lift where the total rise is over 2 m; and signed steps as well where the rise is over 300 mm"
      ],
      "vectors": [
        {
          "name": "The defaults: 900 mm at 1:15",
          "inputs": {
            "totalRise": 0.9,
            "gradient": 15
          },
          "expected": 18.9,
          "toleranceDecimalPlaces": 4,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Flights",
              "value": 3,
              "unit": "flights"
            },
            {
              "label": "Rise of each flight",
              "value": 300,
              "unit": "mm"
            },
            {
              "label": "Going of each flight",
              "value": 4.5,
              "unit": "m"
            },
            {
              "label": "Longest going Approved Document M allows at this gradient",
              "value": 5,
              "unit": "m"
            },
            {
              "label": "Sloped length, all flights",
              "value": 13.5,
              "unit": "m"
            },
            {
              "label": "Each landing at the head and foot, at least",
              "value": 1.2,
              "unit": "m"
            },
            {
              "label": "Intermediate landings",
              "value": 2,
              "unit": "landings"
            },
            {
              "label": "Each intermediate landing, at least",
              "value": 1.5,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "One 10 m flight at 1:20",
          "inputs": {
            "totalRise": 0.5,
            "gradient": 20
          },
          "expected": 12.4,
          "toleranceDecimalPlaces": 4,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Flights",
              "value": 1,
              "unit": "flights"
            },
            {
              "label": "Rise of each flight",
              "value": 500,
              "unit": "mm"
            },
            {
              "label": "Going of each flight",
              "value": 10,
              "unit": "m"
            },
            {
              "label": "Longest going Approved Document M allows at this gradient",
              "value": 10,
              "unit": "m"
            },
            {
              "label": "Sloped length, all flights",
              "value": 10,
              "unit": "m"
            },
            {
              "label": "Each landing at the head and foot, at least",
              "value": 1.2,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "One short flight at 1:12",
          "inputs": {
            "totalRise": 0.166,
            "gradient": 12
          },
          "expected": 4.392,
          "toleranceDecimalPlaces": 4,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Flights",
              "value": 1,
              "unit": "flights"
            },
            {
              "label": "Rise of each flight",
              "value": 166,
              "unit": "mm"
            },
            {
              "label": "Going of each flight",
              "value": 1.992,
              "unit": "m"
            },
            {
              "label": "Longest going Approved Document M allows at this gradient",
              "value": 2,
              "unit": "m"
            },
            {
              "label": "Sloped length, all flights",
              "value": 1.992,
              "unit": "m"
            },
            {
              "label": "Each landing at the head and foot, at least",
              "value": 1.2,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A metre at 1:12 takes six flights",
          "inputs": {
            "totalRise": 1,
            "gradient": 12
          },
          "expected": 21.9,
          "toleranceDecimalPlaces": 4,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Flights",
              "value": 6,
              "unit": "flights"
            },
            {
              "label": "Rise of each flight",
              "value": 166.66666666666666,
              "unit": "mm"
            },
            {
              "label": "Going of each flight",
              "value": 2,
              "unit": "m"
            },
            {
              "label": "Longest going Approved Document M allows at this gradient",
              "value": 2,
              "unit": "m"
            },
            {
              "label": "Sloped length, all flights",
              "value": 12,
              "unit": "m"
            },
            {
              "label": "Each landing at the head and foot, at least",
              "value": 1.2,
              "unit": "m"
            },
            {
              "label": "Intermediate landings",
              "value": 5,
              "unit": "landings"
            },
            {
              "label": "Each intermediate landing, at least",
              "value": 1.5,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Over two metres at 1:20",
          "inputs": {
            "totalRise": 2.4,
            "gradient": 20
          },
          "expected": 56.4,
          "toleranceDecimalPlaces": 4,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Flights",
              "value": 5,
              "unit": "flights"
            },
            {
              "label": "Rise of each flight",
              "value": 480,
              "unit": "mm"
            },
            {
              "label": "Going of each flight",
              "value": 9.6,
              "unit": "m"
            },
            {
              "label": "Longest going Approved Document M allows at this gradient",
              "value": 10,
              "unit": "m"
            },
            {
              "label": "Sloped length, all flights",
              "value": 48,
              "unit": "m"
            },
            {
              "label": "Each landing at the head and foot, at least",
              "value": 1.2,
              "unit": "m"
            },
            {
              "label": "Intermediate landings",
              "value": 4,
              "unit": "landings"
            },
            {
              "label": "Each intermediate landing, at least",
              "value": 1.5,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "The interpolated gradient: 1:14 allows a 4 m going",
          "inputs": {
            "totalRise": 0.6,
            "gradient": 14
          },
          "expected": 13.8,
          "toleranceDecimalPlaces": 4,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Flights",
              "value": 3,
              "unit": "flights"
            },
            {
              "label": "Rise of each flight",
              "value": 199.99999999999997,
              "unit": "mm"
            },
            {
              "label": "Going of each flight",
              "value": 2.8,
              "unit": "m"
            },
            {
              "label": "Longest going Approved Document M allows at this gradient",
              "value": 4,
              "unit": "m"
            },
            {
              "label": "Sloped length, all flights",
              "value": 8.399999999999999,
              "unit": "m"
            },
            {
              "label": "Each landing at the head and foot, at least",
              "value": 1.2,
              "unit": "m"
            },
            {
              "label": "Intermediate landings",
              "value": 2,
              "unit": "landings"
            },
            {
              "label": "Each intermediate landing, at least",
              "value": 1.5,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "aci-211-water-cement-ratio-calculator",
      "title": "ACI 211.1 Water-Cement Ratio Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/aci-211-water-cement-ratio-calculator/",
      "sources": [
        "ACI 211.1 mix design procedure: water mass = target water-cement ratio x total cementitious material mass"
      ],
      "vectors": [
        {
          "name": "350 kg/m³ cementitious, 0.45 w/c",
          "inputs": {
            "cementitiousMass": 350,
            "targetWaterCementRatio": 0.45
          },
          "expected": 157.5,
          "toleranceDecimalPlaces": 1,
          "unit": "kg per m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Equivalent water volume",
              "value": 157.5,
              "unit": "L/m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "400 kg/m³ cementitious, 0.5 w/c",
          "inputs": {
            "cementitiousMass": 400,
            "targetWaterCementRatio": 0.5
          },
          "expected": 200,
          "toleranceDecimalPlaces": 0,
          "unit": "kg per m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Equivalent water volume",
              "value": 200,
              "unit": "L/m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "acoustic-ceiling-cloud-wire-calculator",
      "title": "Acoustic Ceiling Cloud Suspension Wire Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/acoustic-ceiling-cloud-wire-calculator/",
      "sources": [
        "Suspension wire count = ceil(panel area ÷ maximum wire grid spacing area), following the same grid-spacing method used for standard suspended ceiling systems"
      ],
      "vectors": [
        {
          "name": "6m² cloud, 1.2m grid",
          "inputs": {
            "cloudArea": 6,
            "gridSpacing": 1.2
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "wires",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "10m² cloud, 1.2m grid",
          "inputs": {
            "cloudArea": 10,
            "gridSpacing": 1.2
          },
          "expected": 7,
          "toleranceDecimalPlaces": 0,
          "unit": "wires",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "acoustic-glass-stc-estimator",
      "title": "Acoustic Laminated Glass STC Rating Estimator",
      "url": "https://craftquantities.com/calculators/materials-quantities/acoustic-glass-stc-estimator/",
      "sources": [
        "Mass-law-based estimation rule of thumb: STC ≈ 13.5×log10(M1+M2) + 13 + R1, where M1/M2 are pane surface densities (kg/m²) and R1 is an empirical bonus for the interlayer/air-gap configuration — this is a widely-used industry estimation formula, NOT an ASTM E90-standardized predictive method"
      ],
      "vectors": [
        {
          "name": "10 + 10 kg/m² panes, R1=5",
          "inputs": {
            "pane1Mass": 10,
            "pane2Mass": 10,
            "interlayerBonus": 5
          },
          "expected": 35.56,
          "toleranceDecimalPlaces": 1,
          "unit": "STC (estimated)",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15 + 10 kg/m² panes, R1=7",
          "inputs": {
            "pane1Mass": 15,
            "pane2Mass": 10,
            "interlayerBonus": 7
          },
          "expected": 38.87,
          "toleranceDecimalPlaces": 1,
          "unit": "STC (estimated)",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "acoustic-reflector-panel-calculator",
      "title": "Acoustic Reflector Panel Placement Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/acoustic-reflector-panel-calculator/",
      "sources": [
        "Image-source (mirror) method for specular sound reflection: for a source and receiver on the same side of a flat reflecting plane, the reflection point along the plane is located at a distance from the point below the source equal to (horizontal distance × source height) ÷ (source height + receiver height) — this locates the point where the law of reflection (angle of incidence = angle of reflection) is satisfied, the standard geometric acoustics method used in architectural acoustic reflector design."
      ],
      "vectors": [
        {
          "name": "3m source, 1.5m receiver, 10m apart",
          "inputs": {
            "sourceHeight": 3,
            "receiverHeight": 1.5,
            "horizontalDistance": 10
          },
          "expected": 6.667,
          "toleranceDecimalPlaces": 1,
          "unit": "m (from point below source)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Angle of incidence/reflection from panel normal",
              "value": 65.77225468204583,
              "unit": "°"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "4m source, 1.2m receiver, 12m apart",
          "inputs": {
            "sourceHeight": 4,
            "receiverHeight": 1.2,
            "horizontalDistance": 12
          },
          "expected": 9.231,
          "toleranceDecimalPlaces": 1,
          "unit": "m (from point below source)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Angle of incidence/reflection from panel normal",
              "value": 66.5713071912546,
              "unit": "°"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "acoustic-sealant-volume-calculator",
      "title": "Acoustic Sealant Bead Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/acoustic-sealant-volume-calculator/",
      "sources": [
        "Sealant volume = perimeter length × bead width × bead depth, the standard method for estimating a continuous sealant bead"
      ],
      "vectors": [
        {
          "name": "20m perimeter, 6mm x 6mm bead",
          "inputs": {
            "perimeterLength": 20,
            "beadWidth": 0.006,
            "beadDepth": 0.006
          },
          "expected": 0.72,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "35m perimeter, 9mm x 9mm bead",
          "inputs": {
            "perimeterLength": 35,
            "beadWidth": 0.009,
            "beadDepth": 0.009
          },
          "expected": 2.835,
          "toleranceDecimalPlaces": 1,
          "unit": "L",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "acreage-calculator",
      "title": "Acreage Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/acreage-calculator/",
      "sources": [
        "1 international acre = 4046.8564224 m² exactly, from the 1959 international yard",
        "1 hectare = 10,000 m² exactly (SI derived)"
      ],
      "vectors": [
        {
          "name": "100 × 80 m",
          "inputs": {
            "length": 100,
            "width": 80
          },
          "expected": 1.9769,
          "toleranceDecimalPlaces": 1,
          "unit": "acres",
          "confidence": "high",
          "steps": [
            {
              "label": "Hectares",
              "value": 0.8,
              "unit": "ha"
            },
            {
              "label": "Square metres",
              "value": 8000,
              "unit": "m²"
            },
            {
              "label": "Square feet",
              "value": 86111.28333367777,
              "unit": "ft²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "One acre exactly",
          "inputs": {
            "length": 63.6149,
            "width": 63.6149
          },
          "expected": 1,
          "toleranceDecimalPlaces": 2,
          "unit": "acres",
          "confidence": "high",
          "steps": [
            {
              "label": "Hectares",
              "value": 0.404685550201,
              "unit": "ha"
            },
            {
              "label": "Square metres",
              "value": 4046.85550201,
              "unit": "m²"
            },
            {
              "label": "Square feet",
              "value": 43559.99009300449,
              "unit": "ft²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "One hectare is 2.471 acres",
          "inputs": {
            "length": 100,
            "width": 100
          },
          "expected": 2.4711,
          "toleranceDecimalPlaces": 1,
          "unit": "acres",
          "confidence": "high",
          "steps": [
            {
              "label": "Hectares",
              "value": 1,
              "unit": "ha"
            },
            {
              "label": "Square metres",
              "value": 10000,
              "unit": "m²"
            },
            {
              "label": "Square feet",
              "value": 107639.10416709722,
              "unit": "ft²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Zero width is zero area",
          "inputs": {
            "length": 100,
            "width": 0
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "acres",
          "confidence": "high",
          "steps": [
            {
              "label": "Hectares",
              "value": 0,
              "unit": "ha"
            },
            {
              "label": "Square metres",
              "value": 0,
              "unit": "m²"
            },
            {
              "label": "Square feet",
              "value": 0,
              "unit": "ft²"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "acres-to-hectares-calculator",
      "title": "Acres to Hectares Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/acres-to-hectares-calculator/",
      "sources": [
        "1 acre = 4,046.8564224 m^2 = 0.40468564224 hectares",
        "1 hectare = 10,000 m^2 = 2.471054 acres"
      ],
      "vectors": [
        {
          "name": "10 acres converts correctly",
          "inputs": {
            "acres": 10
          },
          "expected": 4.046856422399999,
          "toleranceDecimalPlaces": 6,
          "unit": "ha",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.40468564224,
              "unit": "ha per acres"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "acres": 100
          },
          "expected": 40.468564224,
          "toleranceDecimalPlaces": 6,
          "unit": "ha",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.40468564224,
              "unit": "ha per acres"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "acres-to-square-feet-calculator",
      "title": "Acres to Square Feet Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/acres-to-square-feet-calculator/",
      "sources": [
        "1 acre = 43,560 sq ft exactly"
      ],
      "vectors": [
        {
          "name": "1 acres converts correctly",
          "inputs": {
            "acres": 1
          },
          "expected": 43560,
          "toleranceDecimalPlaces": 6,
          "unit": "sq ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 43560,
              "unit": "sq ft per acres"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "acres": 10
          },
          "expected": 435600,
          "toleranceDecimalPlaces": 6,
          "unit": "sq ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 43560,
              "unit": "sq ft per acres"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "active-pressure-surcharge-calculator",
      "title": "Rankine Active Earth Pressure with Surcharge Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/active-pressure-surcharge-calculator/",
      "sources": [
        "Rankine active earth pressure with a uniform surcharge: Pa = 0.5 x Ka x γ x H² + q x Ka x H, where q is the uniform surcharge pressure applied at the ground surface behind the wall"
      ],
      "vectors": [
        {
          "name": "3m wall, φ=30°, γ=18, q=10kPa",
          "inputs": {
            "wallHeight": 3,
            "soilFrictionAngle": 30,
            "soilUnitWeight": 18,
            "surchargeLoad": 10000
          },
          "expected": 37,
          "toleranceDecimalPlaces": 2,
          "unit": "kN/m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rankine active coefficient (Ka)",
              "value": 0.3333333333333334
            },
            {
              "label": "Soil weight component",
              "value": 27.00000000000001,
              "unit": "kN/m"
            },
            {
              "label": "Surcharge component",
              "value": 10.000000000000004,
              "unit": "kN/m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2.5m wall, φ=25°, γ=17, q=8kPa",
          "inputs": {
            "wallHeight": 2.5,
            "soilFrictionAngle": 25,
            "soilUnitWeight": 17,
            "surchargeLoad": 8000
          },
          "expected": 29.68,
          "toleranceDecimalPlaces": 1,
          "unit": "kN/m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rankine active coefficient (Ka)",
              "value": 0.4058585172053274
            },
            {
              "label": "Soil weight component",
              "value": 21.56123372653302,
              "unit": "kN/m"
            },
            {
              "label": "Surcharge component",
              "value": 8.117170344106547,
              "unit": "kN/m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "activity-duration-crew-size-calculator",
      "title": "Activity Duration and Crew Size Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/activity-duration-crew-size-calculator/",
      "sources": [
        "Duration from quantity and production rate, the basis of every activity estimate in a construction programme: crew-days = quantity ÷ output of one crew per working day, and working days = crew-days ÷ crews working at once",
        "Crew size for a fixed duration, the same relation solved the other way: crews = crew-days ÷ working days available, rounded up to whole crews"
      ],
      "vectors": [
        {
          "name": "The defaults: 600 at 40 a crew-day, two crews",
          "inputs": {
            "mode": "duration",
            "quantity": 600,
            "outputRate": 40,
            "crews": 2,
            "daysAvailable": 5,
            "workingWeek": "5"
          },
          "expected": 7.5,
          "toleranceDecimalPlaces": 4,
          "unit": "days",
          "confidence": "medium",
          "steps": [
            {
              "label": "Crew-days of work",
              "value": 15,
              "unit": "crew-days"
            },
            {
              "label": "Whole working days to allow",
              "value": 8,
              "unit": "days"
            },
            {
              "label": "Weeks at 5 working days a week",
              "value": 1.5,
              "unit": "weeks"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Three crews on 1,250 at 55",
          "inputs": {
            "mode": "duration",
            "quantity": 1250,
            "outputRate": 55,
            "crews": 3,
            "daysAvailable": 5,
            "workingWeek": "6"
          },
          "expected": 7.575758,
          "toleranceDecimalPlaces": 4,
          "unit": "days",
          "confidence": "medium",
          "steps": [
            {
              "label": "Crew-days of work",
              "value": 22.727272727272727,
              "unit": "crew-days"
            },
            {
              "label": "Whole working days to allow",
              "value": 8,
              "unit": "days"
            },
            {
              "label": "Weeks at 6 working days a week",
              "value": 1.2626262626262625,
              "unit": "weeks"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Crews for a five-day deadline",
          "inputs": {
            "mode": "crews",
            "quantity": 600,
            "outputRate": 40,
            "crews": 2,
            "daysAvailable": 5,
            "workingWeek": "5"
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "crews",
          "confidence": "medium",
          "steps": [
            {
              "label": "Crew-days of work",
              "value": 15,
              "unit": "crew-days"
            },
            {
              "label": "Crews needed, before rounding up",
              "value": 3,
              "unit": "crews"
            },
            {
              "label": "Working days those crews take",
              "value": 5,
              "unit": "days"
            },
            {
              "label": "Working days to spare",
              "value": 0,
              "unit": "days"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Crews round up to whole crews",
          "inputs": {
            "mode": "crews",
            "quantity": 1250,
            "outputRate": 55,
            "crews": 2,
            "daysAvailable": 10,
            "workingWeek": "7"
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "crews",
          "confidence": "medium",
          "steps": [
            {
              "label": "Crew-days of work",
              "value": 22.727272727272727,
              "unit": "crew-days"
            },
            {
              "label": "Crews needed, before rounding up",
              "value": 2.2727272727272725,
              "unit": "crews"
            },
            {
              "label": "Working days those crews take",
              "value": 7.575757575757575,
              "unit": "days"
            },
            {
              "label": "Working days to spare",
              "value": 2.4242424242424248,
              "unit": "days"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "ada-ramp-handrail-extension-calculator",
      "title": "ADA Ramp Handrail Extension Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/ada-ramp-handrail-extension-calculator/",
      "sources": [
        "Total handrail length = Ramp Run Length + 2 x 12 inches (0.3048m). Per the ADA 2010 Standards Section 505.10.3 (verified verbatim this session): 'Ramp handrails shall extend horizontally above the landing for 12 inches (305 mm) minimum beyond the top and bottom of ramp runs.'"
      ],
      "vectors": [
        {
          "name": "6m ramp run",
          "inputs": {
            "rampRunLength": 6
          },
          "expected": 6.6096,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "10m ramp run",
          "inputs": {
            "rampRunLength": 10
          },
          "expected": 10.6096,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "ada-ramp-length-calculator",
      "title": "Commercial ADA Accessible Ramp Length & Landing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/ada-ramp-length-calculator/",
      "sources": [
        "Per the ADA 2010 Standards for Accessible Design (verified against regulatory text/mirrors this session): maximum running slope is 1:12 (Section 405.2); maximum rise for a single ramp run before a landing is required is 30 inches / 0.762m (Section 405.6); ramp handrails must extend 12 inches / 0.3048m minimum beyond the top and bottom of each run (Section 505.10.3, verified verbatim: 'Ramp handrails shall extend horizontally above the landing for 12 inches (305 mm) minimum beyond the top and bottom of ramp runs'). Minimum landing length, verified verbatim against the Department of Justice's published text on 2026-09-22: 'The landing clear length shall be 60 inches (1525 mm) long minimum' (Section 405.7.3)."
      ],
      "vectors": [
        {
          "name": "1.2m total rise (2 runs, 1 landing)",
          "inputs": {
            "totalRise": 1.2
          },
          "expected": 15.924,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Number of ramp runs",
              "value": 2,
              "unit": "runs"
            },
            {
              "label": "Intermediate landings required",
              "value": 1,
              "unit": "landings"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2.0m total rise (3 runs, 2 landings)",
          "inputs": {
            "totalRise": 2
          },
          "expected": 27.048,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Number of ramp runs",
              "value": 3,
              "unit": "runs"
            },
            {
              "label": "Intermediate landings required",
              "value": 2,
              "unit": "landings"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "aggregate-fineness-modulus-calculator",
      "title": "Aggregate Fineness Modulus Calculator (ASTM C136)",
      "url": "https://craftquantities.com/calculators/materials-quantities/aggregate-fineness-modulus-calculator/",
      "sources": [
        "ASTM C136 fineness modulus: FM = (sum of cumulative percent retained on the standard sieve series: 3/8in, No.4, No.8, No.16, No.30, No.50, No.100) / 100"
      ],
      "vectors": [
        {
          "name": "Typical well-graded sand",
          "inputs": {
            "percentRetained375": 0,
            "percentRetained4": 5,
            "percentRetained8": 15,
            "percentRetained16": 35,
            "percentRetained30": 60,
            "percentRetained50": 85,
            "percentRetained100": 97
          },
          "expected": 2.97,
          "toleranceDecimalPlaces": 2,
          "unit": "(fineness modulus)",
          "confidence": "high",
          "steps": [
            {
              "label": "Sum of cumulative % retained",
              "value": 297,
              "unit": "%"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Coarser gradation",
          "inputs": {
            "percentRetained375": 2,
            "percentRetained4": 10,
            "percentRetained8": 25,
            "percentRetained16": 50,
            "percentRetained30": 75,
            "percentRetained50": 92,
            "percentRetained100": 99
          },
          "expected": 3.53,
          "toleranceDecimalPlaces": 2,
          "unit": "(fineness modulus)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Sum of cumulative % retained",
              "value": 353,
              "unit": "%"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "aggregate-moisture-correction-calculator",
      "title": "Concrete Aggregate Moisture Correction Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/aggregate-moisture-correction-calculator/",
      "sources": [
        "Free (surface) moisture is total moisture content minus absorption, both expressed on the oven-dry mass — the definitions in ASTM C70 for surface moisture in fine aggregate and ASTM C127/C128 for absorption of coarse and fine aggregate",
        "Mix designs are stated for aggregate in the saturated surface-dry condition, so batch weights are adjusted by TOTAL moisture and batch water by FREE moisture — the correction sequence set out in ACI 211.1",
        "Absorption values used as defaults are typical rather than measured: normal-weight gravel and crushed stone commonly fall between 0.5% and 2%, natural sand between 0.5% and 2%. Your own aggregate's absorption is a measured property and the supplier or a test governs it, not these figures"
      ],
      "vectors": [
        {
          "name": "wet sand at 5% with 1% absorption, stone at SSD",
          "inputs": {
            "cementKg": 320,
            "designWaterKg": 160,
            "fineSsdKg": 700,
            "fineTotalPct": 5,
            "fineAbsorptionPct": 1,
            "coarseSsdKg": 1100,
            "coarseTotalPct": 1,
            "coarseAbsorptionPct": 1
          },
          "expected": 291.01,
          "toleranceDecimalPlaces": 1,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Sand, as-is batch weight",
              "value": 1620.39762705885,
              "unit": "lb"
            },
            {
              "label": "Coarse, as-is batch weight",
              "value": 2449.33573287399,
              "unit": "lb"
            },
            {
              "label": "Cement, unchanged",
              "value": 705.4792389916082,
              "unit": "lb"
            },
            {
              "label": "Sand free moisture",
              "value": 4,
              "unit": "%"
            },
            {
              "label": "Coarse free moisture",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Water carried in by aggregate",
              "value": 61.72943341176572,
              "unit": "lb"
            },
            {
              "label": "Design water-cement ratio",
              "value": 0.5
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "a stockpile drier than SSD, where the correction reverses",
          "inputs": {
            "cementKg": 320,
            "designWaterKg": 160,
            "fineSsdKg": 700,
            "fineTotalPct": 0.5,
            "fineAbsorptionPct": 1.5,
            "coarseSsdKg": 1100,
            "coarseTotalPct": 0.2,
            "coarseAbsorptionPct": 1.2
          },
          "expected": 392.42,
          "toleranceDecimalPlaces": 1,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Sand, as-is batch weight",
              "value": 1550.9520144706134,
              "unit": "lb"
            },
            {
              "label": "Coarse, as-is batch weight",
              "value": 2429.9350538017206,
              "unit": "lb"
            },
            {
              "label": "Cement, unchanged",
              "value": 705.4792389916082,
              "unit": "lb"
            },
            {
              "label": "Sand free moisture",
              "value": -1,
              "unit": "%"
            },
            {
              "label": "Coarse free moisture",
              "value": -1,
              "unit": "%"
            },
            {
              "label": "Water carried in by aggregate",
              "value": -39.683207193277966,
              "unit": "lb"
            },
            {
              "label": "Design water-cement ratio",
              "value": 0.5
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "aggregate exactly at SSD leaves the design water alone",
          "inputs": {
            "cementKg": 300,
            "designWaterKg": 150,
            "fineSsdKg": 650,
            "fineTotalPct": 1,
            "fineAbsorptionPct": 1,
            "coarseSsdKg": 1050,
            "coarseTotalPct": 0.8,
            "coarseAbsorptionPct": 0.8
          },
          "expected": 330.69,
          "toleranceDecimalPlaces": 1,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Sand, as-is batch weight",
              "value": 1447.3347512437213,
              "unit": "lb"
            },
            {
              "label": "Coarse, as-is batch weight",
              "value": 2333.372582964744,
              "unit": "lb"
            },
            {
              "label": "Cement, unchanged",
              "value": 661.3867865546327,
              "unit": "lb"
            },
            {
              "label": "Sand free moisture",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Coarse free moisture",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Water carried in by aggregate",
              "value": 0,
              "unit": "lb"
            },
            {
              "label": "Design water-cement ratio",
              "value": 0.5
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "air-barrier-tape-calculator",
      "title": "Air Barrier Sealant Tape Linear Footage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/air-barrier-tape-calculator/",
      "sources": [
        "Total seam tape = total seam length × (1 + waste allowance), the standard method for estimating continuous air barrier seam tape"
      ],
      "vectors": [
        {
          "name": "60m seams, 5% waste",
          "inputs": {
            "seamLength": 60,
            "wastePercent": 5
          },
          "expected": 63,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "85m seams, 8% waste",
          "inputs": {
            "seamLength": 85,
            "wastePercent": 8
          },
          "expected": 91.8,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "air-changes-per-hour-calculator",
      "title": "Air Changes Per Hour (ACH50) Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/air-changes-per-hour-calculator/",
      "sources": [
        "Standard blower door test formula: ACH50 = (CFM50 x 60) / building volume in cubic feet"
      ],
      "vectors": [
        {
          "name": "100m² home, 2.4m ceilings, CFM50=1500",
          "inputs": {
            "floorArea": 100,
            "ceilingHeight": 2.4,
            "cfm50": 1500
          },
          "expected": 10.617,
          "toleranceDecimalPlaces": 0.5,
          "unit": "ACH50",
          "confidence": "high",
          "steps": [
            {
              "label": "Building volume",
              "value": 8475.52001315726,
              "unit": "ft³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150m² home, 2.7m ceilings, CFM50=2000",
          "inputs": {
            "floorArea": 150,
            "ceilingHeight": 2.7,
            "cfm50": 2000
          },
          "expected": 8.389,
          "toleranceDecimalPlaces": 0.5,
          "unit": "ACH50",
          "confidence": "high",
          "steps": [
            {
              "label": "Building volume",
              "value": 14302.440022202878,
              "unit": "ft³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "air-dirt-separator-calculator",
      "title": "Hydronic Air/Dirt Separator Sizing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/air-dirt-separator-calculator/",
      "sources": [
        "Minimum connection diameter = √(4×system flow rate ÷ (π×maximum velocity)), sizing the separator's pipe connection to keep flow velocity low enough (commonly under ~0.3-0.6 m/s) for effective air and particulate separation"
      ],
      "vectors": [
        {
          "name": "300 L/min, 0.3 m/s max velocity",
          "inputs": {
            "systemFlowRate": 300,
            "maxVelocity": 0.3
          },
          "expected": 145.67,
          "toleranceDecimalPlaces": -1,
          "unit": "mm",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "450 L/min, 0.3 m/s max velocity",
          "inputs": {
            "systemFlowRate": 450,
            "maxVelocity": 0.3
          },
          "expected": 178.41,
          "toleranceDecimalPlaces": -1,
          "unit": "mm",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "air-entrainment-dosage-calculator",
      "title": "Concrete Air-Entrainment Admixture Dosage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/air-entrainment-dosage-calculator/",
      "sources": [
        "Admixture dosage is expressed per unit cement mass on the manufacturer's technical data sheet — total admixture volume = (total cement mass / 100 kg) x dosage rate per 100 kg of cement"
      ],
      "vectors": [
        {
          "name": "500 kg cement, 30 mL/100kg",
          "inputs": {
            "totalCementMassKg": 500,
            "dosageRateMlPer100kg": 30
          },
          "expected": 0.15,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in mL",
              "value": 150,
              "unit": "mL"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1200 kg cement, 45 mL/100kg",
          "inputs": {
            "totalCementMassKg": 1200,
            "dosageRateMlPer100kg": 45
          },
          "expected": 0.54,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in mL",
              "value": 540,
              "unit": "mL"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "air-permeability-q50-calculator",
      "title": "Air Permeability (q50) and Test Flow Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/air-permeability-q50-calculator/",
      "sources": [
        "BS EN ISO 9972:2015, Thermal performance of buildings — Determination of air permeability of buildings — Fan pressurization method: air permeability = the flow at the reference pressure ÷ the envelope area; air change rate = the flow ÷ the internal volume",
        "ATTMA Technical Standards L1 (dwellings) and L2 (non-dwellings), the UK measurement standards behind Approved Document L submissions, at 50 Pa",
        "The power law of the fan pressurization method, Q = C × Δpⁿ, which carries a flow from one test pressure to another only with the exponent n from the test's own fit"
      ],
      "vectors": [
        {
          "name": "The air-leakage guide's shed: 24,800 m² of envelope at a target of 5",
          "inputs": {
            "mode": "target",
            "envelopeArea": 24800,
            "volume": 120000000,
            "measuredFlow": 347.22222222222223,
            "targetQ50": 5,
            "exponent": 0
          },
          "expected": 124000,
          "toleranceDecimalPlaces": 2,
          "unit": "m³/h",
          "confidence": "high",
          "steps": [
            {
              "label": "Air permeability to reach",
              "value": 5,
              "unit": "m³/h·m²"
            },
            {
              "label": "The same flow in litres per second",
              "value": 34444.444444444445,
              "unit": "L/s"
            },
            {
              "label": "Air changes per hour at 50 Pa (n50)",
              "value": 1.0333333333333334,
              "unit": "per hour"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The same shed measured: 124,000 m³/h over 24,800 m²",
          "inputs": {
            "mode": "measured",
            "envelopeArea": 24800,
            "volume": 120000000,
            "measuredFlow": 34444.444444444445,
            "targetQ50": 5,
            "exponent": 0
          },
          "expected": 5,
          "toleranceDecimalPlaces": 4,
          "unit": "m³/h·m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Measured flow at 50 Pa",
              "value": 124000,
              "unit": "m³/h"
            },
            {
              "label": "The same flow in litres per second",
              "value": 34444.444444444445,
              "unit": "L/s"
            },
            {
              "label": "Air changes per hour at 50 Pa (n50)",
              "value": 1.0333333333333334,
              "unit": "per hour"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A dwelling: 1,250 m³/h over 250 m²",
          "inputs": {
            "mode": "measured",
            "envelopeArea": 250,
            "volume": 250000,
            "measuredFlow": 347.22222222222223,
            "targetQ50": 5,
            "exponent": 0
          },
          "expected": 5,
          "toleranceDecimalPlaces": 4,
          "unit": "m³/h·m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Measured flow at 50 Pa",
              "value": 1250,
              "unit": "m³/h"
            },
            {
              "label": "The same flow in litres per second",
              "value": 347.22222222222223,
              "unit": "L/s"
            },
            {
              "label": "Air changes per hour at 50 Pa (n50)",
              "value": 5,
              "unit": "per hour"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "air-shower-nozzle-count-calculator",
      "title": "Cleanroom Air Shower Nozzle Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/air-shower-nozzle-count-calculator/",
      "sources": [
        "Nozzles per wall = ceil(Chamber Width ÷ Horizontal Nozzle Spacing) × ceil(Chamber Height ÷ Vertical Row Spacing); total nozzles = nozzles per wall × 2 (opposing walls) — a standard layout method for air shower nozzle arrays, which target a person from multiple angles/heights to dislodge particulates before cleanroom entry."
      ],
      "vectors": [
        {
          "name": "1.0x2.1m chamber, 0.3m/0.4m spacing",
          "inputs": {
            "chamberWidth": 1,
            "chamberHeight": 2.1,
            "nozzleSpacing": 0.3,
            "nozzleRowSpacing": 0.4
          },
          "expected": 48,
          "toleranceDecimalPlaces": 0,
          "unit": "nozzles",
          "confidence": "medium",
          "steps": [
            {
              "label": "Nozzles per wall",
              "value": 24,
              "unit": "nozzles"
            },
            {
              "label": "Gap left at the end of a nozzle row",
              "value": 0.10000000000000009,
              "unit": "m"
            },
            {
              "label": "Gap left above the top nozzle row",
              "value": 0.10000000000000009,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1.5x2.4m chamber, 0.4m/0.5m spacing",
          "inputs": {
            "chamberWidth": 1.5,
            "chamberHeight": 2.4,
            "nozzleSpacing": 0.4,
            "nozzleRowSpacing": 0.5
          },
          "expected": 40,
          "toleranceDecimalPlaces": 0,
          "unit": "nozzles",
          "confidence": "medium",
          "steps": [
            {
              "label": "Nozzles per wall",
              "value": 20,
              "unit": "nozzles"
            },
            {
              "label": "Gap left at the end of a nozzle row",
              "value": 0.2999999999999998,
              "unit": "m"
            },
            {
              "label": "Gap left above the top nozzle row",
              "value": 0.3999999999999999,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "airfield-pavement-edge-stress-calculator",
      "title": "Rigid Airfield Pavement Edge Stress Screening Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/airfield-pavement-edge-stress-calculator/",
      "sources": [
        "Full FAA airfield rigid pavement design for dual/dual-tandem gear configurations requires FAARFIELD (layered-elastic/3D-FEM with cumulative fatigue damage analysis per AC 150/5320-6E/F/G) and cannot be reduced to a closed-form formula — multi-wheel superposition and coverage/fatigue life have no simple equation. This calculator instead computes the classical Westergaard edge-loading stress for a SINGLE wheel: σe = 0.572×(P/h²)×[4×log10(l/b)+0.359], where l = [E×h³/(12×(1−μ²)×k)]^0.25 is the radius of relative stiffness and b is the equivalent radius of the resisting section (b=√(1.6a²+h²)−0.675h for a<1.724h, else b=a, where a is the tire contact radius)"
      ],
      "vectors": [
        {
          "name": "89kN wheel, 300mm slab, k=0.054",
          "inputs": {
            "wheelLoad": 89000,
            "slabThickness": 0.3,
            "concreteModulus": 27600000000,
            "poissonsRatio": 0.15,
            "subgradeModulus": 0.054,
            "tireContactRadius": 0.115
          },
          "expected": 2.24,
          "toleranceDecimalPlaces": 1,
          "unit": "MPa",
          "confidence": "low",
          "steps": [
            {
              "label": "Radius of relative stiffness (l)",
              "value": 1041.4664128493444,
              "unit": "mm"
            },
            {
              "label": "Equivalent radius of resisting section (b)",
              "value": 130.90665860177415,
              "unit": "mm"
            },
            {
              "label": "Stiffness ratio l/b",
              "value": 7.955794028916032
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "100kN wheel, 350mm slab, k=0.054",
          "inputs": {
            "wheelLoad": 100000,
            "slabThickness": 0.35,
            "concreteModulus": 27600000000,
            "poissonsRatio": 0.15,
            "subgradeModulus": 0.054,
            "tireContactRadius": 0.125
          },
          "expected": 1.85,
          "toleranceDecimalPlaces": 1,
          "unit": "MPa",
          "confidence": "low",
          "steps": [
            {
              "label": "Radius of relative stiffness (l)",
              "value": 1169.109961024916,
              "unit": "mm"
            },
            {
              "label": "Equivalent radius of resisting section (b)",
              "value": 147.80728739343036,
              "unit": "mm"
            },
            {
              "label": "Stiffness ratio l/b",
              "value": 7.9096909336615004
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "amperage-to-wire-gauge-calculator",
      "title": "Amperage to Wire Gauge Calculator",
      "url": "https://craftquantities.com/calculators/electrical/amperage-to-wire-gauge-calculator/",
      "sources": [
        "Standard copper conductor ampacity (NEC Table 310.16, 60°C column, typical for residential NM-B cable): 14 AWG=15A, 12 AWG=20A, 10 AWG=30A, 8 AWG=40A, 6 AWG=55A, 4 AWG=70A, 3 AWG=85A, 2 AWG=95A, 1 AWG=110A",
        "NEC 210.19(A)(1) and 210.20(A): a continuous load must be taken at 125% when sizing both the conductor and its overcurrent device"
      ],
      "vectors": [
        {
          "name": "16A load",
          "inputs": {
            "currentAmps": 16
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "AWG",
          "confidence": "high",
          "steps": [
            {
              "label": "Ampacity of recommended gauge",
              "value": 20,
              "unit": "A"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "35A load",
          "inputs": {
            "currentAmps": 35
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "AWG",
          "confidence": "high",
          "steps": [
            {
              "label": "Ampacity of recommended gauge",
              "value": 40,
              "unit": "A"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "100A load — the case that used to return 4 AWG",
          "inputs": {
            "currentAmps": 100
          },
          "expected": 1,
          "toleranceDecimalPlaces": 0,
          "unit": "AWG",
          "confidence": "high",
          "steps": [
            {
              "label": "Ampacity of recommended gauge",
              "value": 110,
              "unit": "A"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "90A load takes 2 AWG, not 1",
          "inputs": {
            "currentAmps": 90
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "AWG",
          "confidence": "high",
          "steps": [
            {
              "label": "Ampacity of recommended gauge",
              "value": 95,
              "unit": "A"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "exactly 70A still takes 4 AWG",
          "inputs": {
            "currentAmps": 70
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "AWG",
          "confidence": "high",
          "steps": [
            {
              "label": "Ampacity of recommended gauge",
              "value": 70,
              "unit": "A"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "amps-to-watts-120v-calculator",
      "title": "Amps to Watts Calculator (120 V)",
      "url": "https://craftquantities.com/calculators/electrical/amps-to-watts-120v-calculator/",
      "sources": [
        "Ohm's law for real power on a resistive single-phase load: P = V x I",
        "US residential general-purpose branch circuits are nominally 120 V"
      ],
      "vectors": [
        {
          "name": "15 A converts correctly",
          "inputs": {
            "amps": 15
          },
          "expected": 1800,
          "toleranceDecimalPlaces": 6,
          "unit": "W",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 120,
              "unit": "W per A"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "amps": 150
          },
          "expected": 18000,
          "toleranceDecimalPlaces": 6,
          "unit": "W",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 120,
              "unit": "W per A"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "amps-to-watts-230v-calculator",
      "title": "Amps to Watts Calculator (230 V)",
      "url": "https://craftquantities.com/calculators/electrical/amps-to-watts-230v-calculator/",
      "sources": [
        "P = V x I for a resistive single-phase load",
        "UK, EU and AU single-phase supply is nominally 230 V"
      ],
      "vectors": [
        {
          "name": "13 A converts correctly",
          "inputs": {
            "amps": 13
          },
          "expected": 2990,
          "toleranceDecimalPlaces": 6,
          "unit": "W",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 230,
              "unit": "W per A"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "amps": 130
          },
          "expected": 29900,
          "toleranceDecimalPlaces": 6,
          "unit": "W",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 230,
              "unit": "W per A"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "anchor-bolt-breakout-calculator",
      "title": "Concrete Anchor Bolt Breakout Capacity Calculator (ACI 318)",
      "url": "https://craftquantities.com/calculators/materials-quantities/anchor-bolt-breakout-calculator/",
      "sources": [
        "ACI 318 Chapter 17 basic concrete breakout strength for a single anchor: Nb = kc x sqrt(f'c) x hef^1.5 (lb, psi, in), with kc = 24 for cast-in anchors and 17 for post-installed anchors",
        "ACI 318 Chapter 17 treats concrete cracking separately, through the modification factor Psi-c,N applied to the basic strength — it is not part of kc"
      ],
      "vectors": [
        {
          "name": "0.1m (100mm) embedment, 4000 psi, cast-in (kc = 24)",
          "inputs": {
            "embedmentDepth": 0.1,
            "concreteCompStrengthPsi": 27579029.172672,
            "anchorType": "cast-in"
          },
          "expected": 52.74,
          "toleranceDecimalPlaces": 1,
          "unit": "kN",
          "confidence": "low",
          "steps": [
            {
              "label": "Equivalent in lbs",
              "value": 11857.432538043942,
              "unit": "lb"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "0.15m (150mm) embedment, 3000 psi, post-installed (kc = 17)",
          "inputs": {
            "embedmentDepth": 0.15,
            "concreteCompStrengthPsi": 20684271.879504,
            "anchorType": "post-installed"
          },
          "expected": 59.44,
          "toleranceDecimalPlaces": 2,
          "unit": "kN",
          "confidence": "low",
          "steps": [
            {
              "label": "Equivalent in lbs",
              "value": 13362.750584711162,
              "unit": "lb"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "anchor-bolt-pattern-layout-calculator",
      "title": "Baseplate Anchor Bolt Pattern Layout Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/anchor-bolt-pattern-layout-calculator/",
      "sources": [
        "For a rectangular perimeter anchor pattern, the run available on a side is the plate dimension less twice the edge distance: bolts along each long side = ceil((plate length − 2×edge distance) ÷ max spacing) + 1, bolts along each short side the same on the width; total = 2×(long-side count) + 2×(short-side count − 2), avoiding double-counting the 4 corner bolts",
        "The pitch to set out from is that run divided by one less than the bolts on the side, which is at or below the maximum entered and is not the maximum itself"
      ],
      "vectors": [
        {
          "name": "0.6m x 0.4m plate, 0.25m max spacing, 50mm edge distance",
          "inputs": {
            "plateLength": 0.6,
            "plateWidth": 0.4,
            "maxSpacing": 0.25,
            "edgeDistance": 0.05
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "anchor bolts",
          "confidence": "high",
          "steps": [
            {
              "label": "Bolts per long side",
              "value": 3
            },
            {
              "label": "Bolts per short side",
              "value": 3
            },
            {
              "label": "Pitch along each long side",
              "value": 0.25,
              "unit": "m"
            },
            {
              "label": "Pitch across each short side",
              "value": 0.15000000000000002,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1.2m x 0.8m plate, 0.3m max spacing, 50mm edge distance",
          "inputs": {
            "plateLength": 1.2,
            "plateWidth": 0.8,
            "maxSpacing": 0.3,
            "edgeDistance": 0.05
          },
          "expected": 14,
          "toleranceDecimalPlaces": 0,
          "unit": "anchor bolts",
          "confidence": "high",
          "steps": [
            {
              "label": "Bolts per long side",
              "value": 5
            },
            {
              "label": "Bolts per short side",
              "value": 4
            },
            {
              "label": "Pitch along each long side",
              "value": 0.27499999999999997,
              "unit": "m"
            },
            {
              "label": "Pitch across each short side",
              "value": 0.23333333333333336,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The same plate with the rods on the corners, which is what a zero edge distance means",
          "inputs": {
            "plateLength": 0.6,
            "plateWidth": 0.4,
            "maxSpacing": 0.25,
            "edgeDistance": 0
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "anchor bolts",
          "confidence": "high",
          "steps": [
            {
              "label": "Bolts per long side",
              "value": 4
            },
            {
              "label": "Bolts per short side",
              "value": 3
            },
            {
              "label": "Pitch along each long side",
              "value": 0.19999999999999998,
              "unit": "m"
            },
            {
              "label": "Pitch across each short side",
              "value": 0.2,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "anchor-proof-load-test-calculator",
      "title": "Concrete Anchor Proof Load Test Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/anchor-proof-load-test-calculator/",
      "sources": [
        "ASTM E488/E488M, Standard Test Methods for Strength of Anchors in Concrete Elements — the reference method for applying and measuring a tension load on an installed anchor",
        "The proof-load multiplier and the sampling rate are project values, not standard ones: they come from the contract specification and the special inspection programme, which is why both are entered here rather than assumed",
        "Arithmetic only: proof load = design tension × the specified multiplier; anchors to test = the specified percentage of the lot, rounded up, subject to the specified minimum and never more than the lot holds"
      ],
      "vectors": [
        {
          "name": "8 kN design tension at 1.5x, 5% of 120 anchors",
          "inputs": {
            "designTension": 8000,
            "proofMultiplier": 1.5,
            "lotSize": 120,
            "samplePercent": 5,
            "minimumTests": 2
          },
          "expected": 12000,
          "toleranceDecimalPlaces": 1,
          "unit": "N",
          "confidence": "medium",
          "steps": [
            {
              "label": "Anchors to test in this lot",
              "value": 6,
              "unit": "anchors"
            },
            {
              "label": "Sample size before the specified floor",
              "value": 6,
              "unit": "anchors"
            },
            {
              "label": "Load applied above the design tension",
              "value": 4000,
              "unit": "N"
            },
            {
              "label": "Anchors covered by each tested anchor",
              "value": 20,
              "unit": "anchors"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "15 kN design tension at 2.0x, 10% of 40 anchors",
          "inputs": {
            "designTension": 15000,
            "proofMultiplier": 2,
            "lotSize": 40,
            "samplePercent": 10,
            "minimumTests": 2
          },
          "expected": 30000,
          "toleranceDecimalPlaces": 1,
          "unit": "N",
          "confidence": "medium",
          "steps": [
            {
              "label": "Anchors to test in this lot",
              "value": 4,
              "unit": "anchors"
            },
            {
              "label": "Sample size before the specified floor",
              "value": 4,
              "unit": "anchors"
            },
            {
              "label": "Load applied above the design tension",
              "value": 15000,
              "unit": "N"
            },
            {
              "label": "Anchors covered by each tested anchor",
              "value": 10,
              "unit": "anchors"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Small lot where the specified floor governs the sample",
          "inputs": {
            "designTension": 4500,
            "proofMultiplier": 1.25,
            "lotSize": 8,
            "samplePercent": 5,
            "minimumTests": 3
          },
          "expected": 5625,
          "toleranceDecimalPlaces": 1,
          "unit": "N",
          "confidence": "medium",
          "steps": [
            {
              "label": "Anchors to test in this lot",
              "value": 3,
              "unit": "anchors"
            },
            {
              "label": "Sample size before the specified floor",
              "value": 1,
              "unit": "anchors"
            },
            {
              "label": "Load applied above the design tension",
              "value": 1125,
              "unit": "N"
            },
            {
              "label": "Anchors covered by each tested anchor",
              "value": 2.6666666666666665,
              "unit": "anchors"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "anti-fatigue-mat-calculator",
      "title": "Anti-Fatigue Mat Flooring Area Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/anti-fatigue-mat-calculator/",
      "sources": [
        "Total mat area = number of workstations × mat area per station, based on a standard anti-fatigue mat size (commonly around 0.6m × 1.4m = 0.84m²)"
      ],
      "vectors": [
        {
          "name": "10 workstations, 0.84m² mat",
          "inputs": {
            "workstationCount": 10,
            "matAreaPerStation": 0.84
          },
          "expected": 8.4,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15 workstations, 0.84m² mat",
          "inputs": {
            "workstationCount": 15,
            "matAreaPerStation": 0.84
          },
          "expected": 12.6,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "appliance-energy-cost-calculator",
      "title": "Appliance Energy Cost Calculator",
      "url": "https://craftquantities.com/calculators/electrical/appliance-energy-cost-calculator/",
      "sources": [
        "Annual cost = (wattage / 1000) x hours used per day x 365 x cost per kWh"
      ],
      "vectors": [
        {
          "name": "1500W, 2 hrs/day, $0.15/kWh",
          "inputs": {
            "wattage": 1500,
            "hoursPerDay": 2,
            "costPerKwh": 0.15
          },
          "expected": 164.25,
          "toleranceDecimalPlaces": 2,
          "unit": "currency/year",
          "confidence": "medium",
          "steps": [
            {
              "label": "Energy used per year",
              "value": 1095,
              "unit": "kWh"
            },
            {
              "label": "Daily energy use",
              "value": 3,
              "unit": "kWh"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1000W, 4 hrs/day, $0.12/kWh",
          "inputs": {
            "wattage": 1000,
            "hoursPerDay": 4,
            "costPerKwh": 0.12
          },
          "expected": 175.2,
          "toleranceDecimalPlaces": 1,
          "unit": "currency/year",
          "confidence": "medium",
          "steps": [
            {
              "label": "Energy used per year",
              "value": 1460,
              "unit": "kWh"
            },
            {
              "label": "Daily energy use",
              "value": 4,
              "unit": "kWh"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "aquarium-water-weight-calculator",
      "title": "Aquarium Display Tank Water Weight Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/aquarium-water-weight-calculator/",
      "sources": [
        "Water weight (kg) = Tank Volume (L) × 1.0 kg/L (fresh water density ≈ 1.0 kg/L at typical aquarium temperatures; saltwater is slightly denser, ≈1.025 kg/L). This is a load QUANTITY calculation only — actual structural adequacy of the supporting stand, floor, or wall must be verified by a qualified structural engineer, especially for large built-in or wall-mounted aquariums."
      ],
      "vectors": [
        {
          "name": "500L aquarium",
          "inputs": {
            "tankVolume": 500
          },
          "expected": 500,
          "toleranceDecimalPlaces": 0,
          "unit": "kg",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1000L aquarium",
          "inputs": {
            "tankVolume": 1000
          },
          "expected": 1000,
          "toleranceDecimalPlaces": 0,
          "unit": "kg",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "arc-chord-offset-calculator",
      "title": "Arc Chord and Mid-Ordinate Check Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/arc-chord-offset-calculator/",
      "sources": [
        "Circular curve setting out: for an arc distance s on a radius R the half angle is s ÷ 2R, the chord across it is 2R·sin(s ÷ 2R), and the mid-ordinate from that chord to the curve is R·(1 − cos(s ÷ 2R)). Geometry throughout; no coefficient is involved.",
        "FIBA Official Basketball Rules — the three-point arc is struck at 6.75 m from the point on the floor vertically beneath the centre of the ring, reducing to 6.60 m where the line runs parallel to the sideline, which is the default radius offered here"
      ],
      "vectors": [
        {
          "name": "Three-point arc at 6.75 m, stations one metre apart",
          "inputs": {
            "arcRadius": 6.75,
            "stationSpacing": 1,
            "arcLength": 12
          },
          "expected": 18.5101,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Chord between adjacent stations",
              "value": 0.9990857561157602,
              "unit": "m"
            },
            {
              "label": "Check stations that fall on the arc",
              "value": 12,
              "unit": "stations"
            },
            {
              "label": "Angle the arc turns through",
              "value": 101.85916357881302,
              "unit": "degrees"
            },
            {
              "label": "Chord across the whole arc",
              "value": 10.481020937558917,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Corner radius at 6.6 m, stations 0.75 m apart",
          "inputs": {
            "arcRadius": 6.6,
            "stationSpacing": 0.75,
            "arcLength": 8
          },
          "expected": 10.6505,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Chord between adjacent stations",
              "value": 0.749596526909092,
              "unit": "m"
            },
            {
              "label": "Check stations that fall on the arc",
              "value": 10,
              "unit": "stations"
            },
            {
              "label": "Angle the arc turns through",
              "value": 69.44942971282705,
              "unit": "degrees"
            },
            {
              "label": "Chord across the whole arc",
              "value": 7.519170211198346,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Tight 1.8 m radius, stations half a metre apart",
          "inputs": {
            "arcRadius": 1.8,
            "stationSpacing": 0.5,
            "arcLength": 5.65
          },
          "expected": 17.3332,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Chord between adjacent stations",
              "value": 0.498394039453615,
              "unit": "m"
            },
            {
              "label": "Check stations that fall on the arc",
              "value": 11,
              "unit": "stations"
            },
            {
              "label": "Angle the arc turns through",
              "value": 179.84508569384172,
              "unit": "degrees"
            },
            {
              "label": "Chord across the whole arc",
              "value": 3.5999967103459003,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Wide 30 m radius, stations two metres apart",
          "inputs": {
            "arcRadius": 30,
            "stationSpacing": 2,
            "arcLength": 40
          },
          "expected": 16.6651,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Chord between adjacent stations",
              "value": 1.999629650205217,
              "unit": "m"
            },
            {
              "label": "Check stations that fall on the arc",
              "value": 20,
              "unit": "stations"
            },
            {
              "label": "Angle the arc turns through",
              "value": 76.39437268410977,
              "unit": "degrees"
            },
            {
              "label": "Chord across the whole arc",
              "value": 37.10218818418422,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "arch-brick-wedge-taper-calculator",
      "title": "Radial Arch Brick Wedge Taper Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/arch-brick-wedge-taper-calculator/",
      "sources": [
        "Arc geometry: angle subtended per brick = arc length (brick length) / radius; the outer (extrados) face width = outer radius x that angle, and the taper is the difference between the outer and inner face widths"
      ],
      "vectors": [
        {
          "name": "2m radius, 0.2m brick length, 0.1m depth, 180° span",
          "inputs": {
            "archRadius": 2,
            "brickLength": 0.2,
            "brickDepth": 0.1,
            "archSpanAngle": 180
          },
          "expected": 32,
          "toleranceDecimalPlaces": 0,
          "unit": "bricks (per ring)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Angle per brick",
              "value": 5.729577951308232,
              "unit": "°"
            },
            {
              "label": "Wedge taper per brick",
              "value": 10.000000000000009,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1.5m radius, 0.2m brick length, 0.1m depth, 90° span",
          "inputs": {
            "archRadius": 1.5,
            "brickLength": 0.2,
            "brickDepth": 0.1,
            "archSpanAngle": 90
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "bricks (per ring)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Angle per brick",
              "value": 7.639437268410976,
              "unit": "°"
            },
            {
              "label": "Wedge taper per brick",
              "value": 13.333333333333336,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "arch-rise-span-ratio-calculator",
      "title": "Brick Arch Rise-to-Span Ratio Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/arch-rise-span-ratio-calculator/",
      "sources": [
        "Arch classification by rise-to-span ratio: flat/jack arch ≈ 1/8 or less, segmental arch ≈ 1/8 to 1/2, semicircular arch = 1/2"
      ],
      "vectors": [
        {
          "name": "1.2m span, 0.15m rise (flat)",
          "inputs": {
            "archSpan": 1.2,
            "archRise": 0.15
          },
          "expected": 0.125,
          "toleranceDecimalPlaces": 2,
          "unit": "(rise/span)",
          "confidence": "high",
          "steps": [
            {
              "label": "Radius to strike the curve",
              "value": 1.275,
              "unit": "m"
            },
            {
              "label": "Centre point, below the springline",
              "value": 1.125,
              "unit": "m"
            },
            {
              "label": "Angle the arch subtends at that centre",
              "value": 56.144973871705915,
              "unit": "°"
            },
            {
              "label": "Skewback, from horizontal",
              "value": 61.92751306414704,
              "unit": "°"
            },
            {
              "label": "Length along the intrados",
              "value": 1.249391181947007,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1.0m span, 0.5m rise (semicircular)",
          "inputs": {
            "archSpan": 1,
            "archRise": 0.5
          },
          "expected": 0.5,
          "toleranceDecimalPlaces": 2,
          "unit": "(rise/span)",
          "confidence": "high",
          "steps": [
            {
              "label": "Radius to strike the curve",
              "value": 0.5,
              "unit": "m"
            },
            {
              "label": "Centre point, below the springline",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Angle the arch subtends at that centre",
              "value": 180,
              "unit": "°"
            },
            {
              "label": "Skewback, from horizontal",
              "value": 0,
              "unit": "°"
            },
            {
              "label": "Length along the intrados",
              "value": 1.5707963267948966,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "architectural-glass-weight-calculator",
      "title": "Architectural Glass Weight Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/architectural-glass-weight-calculator/",
      "sources": [
        "Glass weight = area × thickness × glass density (2500 kg/m³ for standard soda-lime float glass)"
      ],
      "vectors": [
        {
          "name": "3m² panel, 10mm thick",
          "inputs": {
            "panelArea": 3,
            "thickness": 0.01,
            "density": 2500
          },
          "expected": 75,
          "toleranceDecimalPlaces": 0,
          "unit": "kg",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "5m² panel, 12mm thick",
          "inputs": {
            "panelArea": 5,
            "thickness": 0.012,
            "density": 2500
          },
          "expected": 150,
          "toleranceDecimalPlaces": 0,
          "unit": "kg",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "area-to-radius-calculator",
      "title": "Area to Radius Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/area-to-radius-calculator/",
      "sources": [
        "Area of a circle A = pi x r^2, so r = sqrt(A / pi)"
      ],
      "vectors": [
        {
          "name": "300 sq ft converts correctly",
          "inputs": {
            "areaSqFt": 300
          },
          "expected": 9.772050238058398,
          "toleranceDecimalPlaces": 6,
          "unit": "ft",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "areaSqFt": 3000
          },
          "expected": 30.90193616185517,
          "toleranceDecimalPlaces": 6,
          "unit": "ft",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "artificial-grass-calculator",
      "title": "Artificial Grass and Synthetic Turf Calculator",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/artificial-grass-calculator/",
      "sources": [
        "Artificial grass is sold cut to length off rolls of fixed width — commonly 4 m and 2 m where it is sold in metric widths, and 15 ft, with some products at 12 ft, in the US — so a lawn takes whole widths laid side by side, each cut to the lawn's length with extra for trimming",
        "Every piece is laid with its pile running the same way, conventionally facing the main view, because a piece turned the other way shows as a band of a different shade; offcuts therefore cannot be turned to fill a gap. Pieces are joined over joining tape with adhesive, after the factory edge is trimmed from both sides of the join",
        "Adhesive = total length of the joins ÷ the join length one pack covers, which is the manufacturer's figure printed on the product"
      ],
      "vectors": [
        {
          "name": "A 16.5 ft by 23 ft lawn in 15 ft rolls running away from the house — two pieces, one join",
          "inputs": {
            "lawnDepth": 5.0292,
            "lawnWidth": 7.0104,
            "rollWidth": "wide",
            "customRollWidth": 5,
            "rollDirection": "away",
            "trimPercent": 3,
            "adhesiveCoverage": 3.5052
          },
          "expected": 47.366615,
          "toleranceDecimalPlaces": 4,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Pieces to cut, each one full roll width",
              "value": 2,
              "unit": "pieces"
            },
            {
              "label": "Length of each piece",
              "value": 5.180076000000001,
              "unit": "m"
            },
            {
              "label": "Roll width",
              "value": 4.572,
              "unit": "m"
            },
            {
              "label": "Joins between the pieces",
              "value": 1,
              "unit": "joins"
            },
            {
              "label": "Joining tape, the full length of every join",
              "value": 5.180076000000001,
              "unit": "m"
            },
            {
              "label": "Adhesive, at the join length each pack covers",
              "value": 2,
              "unit": "packs"
            },
            {
              "label": "Lawn area",
              "value": 35.25670368,
              "unit": "m²"
            },
            {
              "label": "Grass bought beyond the lawn area",
              "value": 34.34782608695652,
              "unit": "%"
            },
            {
              "label": "Perimeter to fix down",
              "value": 24.0792,
              "unit": "m"
            },
            {
              "label": "Rolls laid the other way: grass to buy",
              "value": 66.026190528,
              "unit": "m²"
            },
            {
              "label": "Rolls laid the other way: joins",
              "value": 1,
              "unit": "joins"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "12 ft rolls across a 24 ft lawn — the trimming allowance makes it three pieces, not two",
          "inputs": {
            "lawnDepth": 6.096,
            "lawnWidth": 7.3152,
            "rollWidth": "narrow",
            "customRollWidth": 5,
            "rollDirection": "away",
            "trimPercent": 3,
            "adhesiveCoverage": 3.5052
          },
          "expected": 68.896894,
          "toleranceDecimalPlaces": 4,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Pieces to cut, each one full roll width",
              "value": 3,
              "unit": "pieces"
            },
            {
              "label": "Length of each piece",
              "value": 6.27888,
              "unit": "m"
            },
            {
              "label": "Roll width",
              "value": 3.6576000000000004,
              "unit": "m"
            },
            {
              "label": "Joins between the pieces",
              "value": 2,
              "unit": "joins"
            },
            {
              "label": "Joining tape, the full length of every join",
              "value": 12.55776,
              "unit": "m"
            },
            {
              "label": "Adhesive, at the join length each pack covers",
              "value": 4,
              "unit": "packs"
            },
            {
              "label": "Lawn area",
              "value": 44.5934592,
              "unit": "m²"
            },
            {
              "label": "Grass bought beyond the lawn area",
              "value": 54.500000000000036,
              "unit": "%"
            },
            {
              "label": "Perimeter to fix down",
              "value": 26.822400000000002,
              "unit": "m"
            },
            {
              "label": "Rolls laid the other way: grass to buy",
              "value": 55.11751557120001,
              "unit": "m²"
            },
            {
              "label": "Rolls laid the other way: joins",
              "value": 1,
              "unit": "joins"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A lawn exactly two 15 ft widths wide, with no trimming allowance — two pieces",
          "inputs": {
            "lawnDepth": 6.096,
            "lawnWidth": 9.144,
            "rollWidth": "wide",
            "customRollWidth": 5,
            "rollDirection": "away",
            "trimPercent": 0,
            "adhesiveCoverage": 3.5052
          },
          "expected": 55.741824,
          "toleranceDecimalPlaces": 4,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Pieces to cut, each one full roll width",
              "value": 2,
              "unit": "pieces"
            },
            {
              "label": "Length of each piece",
              "value": 6.096,
              "unit": "m"
            },
            {
              "label": "Roll width",
              "value": 4.572,
              "unit": "m"
            },
            {
              "label": "Joins between the pieces",
              "value": 1,
              "unit": "joins"
            },
            {
              "label": "Joining tape, the full length of every join",
              "value": 6.096,
              "unit": "m"
            },
            {
              "label": "Adhesive, at the join length each pack covers",
              "value": 2,
              "unit": "packs"
            },
            {
              "label": "Lawn area",
              "value": 55.741824,
              "unit": "m²"
            },
            {
              "label": "Grass bought beyond the lawn area",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Perimeter to fix down",
              "value": 30.48,
              "unit": "m"
            },
            {
              "label": "Rolls laid the other way: grass to buy",
              "value": 83.612736,
              "unit": "m²"
            },
            {
              "label": "Rolls laid the other way: joins",
              "value": 1,
              "unit": "joins"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The same lawn with a 3% trimming allowance — two widths leave nothing to trim, so three",
          "inputs": {
            "lawnDepth": 6.096,
            "lawnWidth": 9.144,
            "rollWidth": "wide",
            "customRollWidth": 5,
            "rollDirection": "away",
            "trimPercent": 3,
            "adhesiveCoverage": 3.5052
          },
          "expected": 86.121118,
          "toleranceDecimalPlaces": 4,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Pieces to cut, each one full roll width",
              "value": 3,
              "unit": "pieces"
            },
            {
              "label": "Length of each piece",
              "value": 6.27888,
              "unit": "m"
            },
            {
              "label": "Roll width",
              "value": 4.572,
              "unit": "m"
            },
            {
              "label": "Joins between the pieces",
              "value": 2,
              "unit": "joins"
            },
            {
              "label": "Joining tape, the full length of every join",
              "value": 12.55776,
              "unit": "m"
            },
            {
              "label": "Adhesive, at the join length each pack covers",
              "value": 4,
              "unit": "packs"
            },
            {
              "label": "Lawn area",
              "value": 55.741824,
              "unit": "m²"
            },
            {
              "label": "Grass bought beyond the lawn area",
              "value": 54.49999999999999,
              "unit": "%"
            },
            {
              "label": "Perimeter to fix down",
              "value": 30.48,
              "unit": "m"
            },
            {
              "label": "Rolls laid the other way: grass to buy",
              "value": 86.12111808,
              "unit": "m²"
            },
            {
              "label": "Rolls laid the other way: joins",
              "value": 1,
              "unit": "joins"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The 16.5 ft by 23 ft lawn with the rolls run across the view instead — longer pieces, more grass",
          "inputs": {
            "lawnDepth": 5.0292,
            "lawnWidth": 7.0104,
            "rollWidth": "wide",
            "customRollWidth": 5,
            "rollDirection": "across",
            "trimPercent": 3,
            "adhesiveCoverage": 3.5052
          },
          "expected": 66.026191,
          "toleranceDecimalPlaces": 4,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Pieces to cut, each one full roll width",
              "value": 2,
              "unit": "pieces"
            },
            {
              "label": "Length of each piece",
              "value": 7.220712,
              "unit": "m"
            },
            {
              "label": "Roll width",
              "value": 4.572,
              "unit": "m"
            },
            {
              "label": "Joins between the pieces",
              "value": 1,
              "unit": "joins"
            },
            {
              "label": "Joining tape, the full length of every join",
              "value": 7.220712,
              "unit": "m"
            },
            {
              "label": "Adhesive, at the join length each pack covers",
              "value": 3,
              "unit": "packs"
            },
            {
              "label": "Lawn area",
              "value": 35.25670368,
              "unit": "m²"
            },
            {
              "label": "Grass bought beyond the lawn area",
              "value": 87.27272727272728,
              "unit": "%"
            },
            {
              "label": "Perimeter to fix down",
              "value": 24.0792,
              "unit": "m"
            },
            {
              "label": "Rolls laid the other way: grass to buy",
              "value": 47.366614944000005,
              "unit": "m²"
            },
            {
              "label": "Rolls laid the other way: joins",
              "value": 1,
              "unit": "joins"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Another width — 5 m rolls on a 6 m by 9 m lawn",
          "inputs": {
            "lawnDepth": 6,
            "lawnWidth": 9,
            "rollWidth": "custom",
            "customRollWidth": 5,
            "rollDirection": "away",
            "trimPercent": 3,
            "adhesiveCoverage": 3.5
          },
          "expected": 61.8,
          "toleranceDecimalPlaces": 4,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Pieces to cut, each one full roll width",
              "value": 2,
              "unit": "pieces"
            },
            {
              "label": "Length of each piece",
              "value": 6.18,
              "unit": "m"
            },
            {
              "label": "Roll width",
              "value": 5,
              "unit": "m"
            },
            {
              "label": "Joins between the pieces",
              "value": 1,
              "unit": "joins"
            },
            {
              "label": "Joining tape, the full length of every join",
              "value": 6.18,
              "unit": "m"
            },
            {
              "label": "Adhesive, at the join length each pack covers",
              "value": 2,
              "unit": "packs"
            },
            {
              "label": "Lawn area",
              "value": 54,
              "unit": "m²"
            },
            {
              "label": "Grass bought beyond the lawn area",
              "value": 14.444444444444438,
              "unit": "%"
            },
            {
              "label": "Perimeter to fix down",
              "value": 30,
              "unit": "m"
            },
            {
              "label": "Rolls laid the other way: grass to buy",
              "value": 92.69999999999999,
              "unit": "m²"
            },
            {
              "label": "Rolls laid the other way: joins",
              "value": 1,
              "unit": "joins"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "asbestos-negative-pressure-cfm-calculator",
      "title": "Asbestos Enclosure Negative-Pressure Airflow Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/asbestos-negative-pressure-cfm-calculator/",
      "sources": [
        "Required CFM = Enclosure Volume (ft³) × Target Air Changes per Hour ÷ 60. A minimum of 4 air changes per hour is commonly required for negative-pressure asbestos containment enclosures under EPA guidance (the EPA 'Purple Book,' EPA 560/5-85-024) and state asbestos regulations (e.g. Minnesota Rule 4620.3570), widely applied in 29 CFR 1926.1101 compliance programs; industry practice sizes negative-air machines for 6 ACH or higher (accounting for HEPA filter loading over time) to reliably maintain the 4 ACH floor and the commonly-required -0.02 in. water column negative pressure differential relative to the area outside containment."
      ],
      "vectors": [
        {
          "name": "3000 ft³ enclosure, 6 ACH target",
          "inputs": {
            "enclosureVolumeFt3": 84950.5398,
            "targetAch": 6
          },
          "expected": 300,
          "toleranceDecimalPlaces": 0,
          "unit": "CFM",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "5000 ft³ enclosure, 4 ACH target",
          "inputs": {
            "enclosureVolumeFt3": 141584.233,
            "targetAch": 4
          },
          "expected": 333.33,
          "toleranceDecimalPlaces": 2,
          "unit": "CFM",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "ashlar-stone-joint-calculator",
      "title": "Ashlar Stone Masonry Joint Volumetrics Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/ashlar-stone-joint-calculator/",
      "sources": [
        "Coverage rate derived geometrically from nominal stone face dimensions (actual size + mortar joint width), the same method used for the Brick and CMU calculators; mortar volume from the joint gap area x wall thickness"
      ],
      "vectors": [
        {
          "name": "20m² wall, 0.4x0.2m stone, 10mm joint, 0.3m thick",
          "inputs": {
            "wallArea": 20,
            "stoneLength": 0.4,
            "stoneHeight": 0.2,
            "jointWidth": 0.01,
            "wallThickness": 0.3
          },
          "expected": 233,
          "toleranceDecimalPlaces": 0,
          "unit": "stone units",
          "confidence": "medium",
          "steps": [
            {
              "label": "Coverage rate",
              "value": 11.614401858304296,
              "unit": "units/m²"
            },
            {
              "label": "Mortar volume needed",
              "value": 0.42508710801393684,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "35m² wall, 0.5x0.25m stone, 15mm joint, 0.35m thick",
          "inputs": {
            "wallArea": 35,
            "stoneLength": 0.5,
            "stoneHeight": 0.25,
            "jointWidth": 0.015,
            "wallThickness": 0.35
          },
          "expected": 257,
          "toleranceDecimalPlaces": 0,
          "unit": "stone units",
          "confidence": "medium",
          "steps": [
            {
              "label": "Coverage rate",
              "value": 7.327349331379373,
              "unit": "units/m²"
            },
            {
              "label": "Mortar volume needed",
              "value": 1.0299963363253353,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "asphalt-crack-filler-calculator",
      "title": "Asphalt Crack Filler Calculator",
      "url": "https://craftquantities.com/calculators/auto-utility/asphalt-crack-filler-calculator/",
      "sources": [
        "A standard tube of cold-pour asphalt crack filler covers approximately 15 linear ft of a hairline-to-1/4 in wide crack"
      ],
      "vectors": [
        {
          "name": "30m of cracks",
          "inputs": {
            "crackLength": 30
          },
          "expected": 7,
          "toleranceDecimalPlaces": 0,
          "unit": "tubes",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total crack length",
              "value": 98.42519685039369,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "60m of cracks",
          "inputs": {
            "crackLength": 60
          },
          "expected": 14,
          "toleranceDecimalPlaces": 0,
          "unit": "tubes",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total crack length",
              "value": 196.85039370078738,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "asphalt-cubic-yards-to-tons-calculator",
      "title": "Asphalt Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/asphalt-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 1.9575 short tons per cubic yard",
        "Bulk density varies with moisture, compaction and grading — the supplier's weighbridge ticket governs"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 19.575,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.9575,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 195.75,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.9575,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "asphalt-driveway-calculator",
      "title": "Asphalt Driveway Calculator",
      "url": "https://craftquantities.com/calculators/auto-utility/asphalt-driveway-calculator/",
      "sources": [
        "Compacted hot-mix asphalt has a commonly-cited average density of about 145 lb per cubic foot",
        "Residential asphalt driveways are typically 2-3 in thick over a compacted gravel base"
      ],
      "vectors": [
        {
          "name": "12x3m driveway, 2.5in thick",
          "inputs": {
            "drivewayLength": 12,
            "drivewayWidth": 3,
            "thickness": 0.0635
          },
          "expected": 5.85,
          "toleranceDecimalPlaces": 1,
          "unit": "tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Driveway area",
              "value": 387.50077500155,
              "unit": "sq ft"
            },
            {
              "label": "Volume",
              "value": 80.72932812532291,
              "unit": "cubic ft"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "20x5.5m driveway, 3in thick",
          "inputs": {
            "drivewayLength": 20,
            "drivewayWidth": 5.5,
            "thickness": 0.0762
          },
          "expected": 21.46,
          "toleranceDecimalPlaces": 1,
          "unit": "tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Driveway area",
              "value": 1184.0301458380693,
              "unit": "sq ft"
            },
            {
              "label": "Volume",
              "value": 296.0075364595173,
              "unit": "cubic ft"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "asphalt-in-place-density-gmm-calculator",
      "title": "Asphalt In-Place Density (Percent of Gmm) Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/asphalt-in-place-density-gmm-calculator/",
      "sources": [
        "Percent of Gmm = Gmb ÷ Gmm × 100, and air voids = 100 − percent of Gmm. Both follow from the definitions of the two gravities; no coefficient is involved.",
        "AASHTO T 166, Bulk Specific Gravity (Gmb) of Compacted Asphalt Mixtures Using Saturated Surface-Dry Specimens — the test the core's Gmb comes from",
        "AASHTO T 209, Theoretical Maximum Specific Gravity and Density of Asphalt Mixtures (Gmm) — the test the mix's Gmm comes from"
      ],
      "vectors": [
        {
          "name": "Gmb 2.345 against Gmm 2.502",
          "inputs": {
            "gmb": 2.345,
            "gmm": 2.502,
            "targetDensity": 92
          },
          "expected": 93.7252,
          "toleranceDecimalPlaces": 2,
          "unit": "%",
          "confidence": "high",
          "steps": [
            {
              "label": "Air void content",
              "value": 6.274980015987197,
              "unit": "%"
            },
            {
              "label": "Margin over the specified minimum",
              "value": 1.7250199840128033,
              "unit": "%"
            },
            {
              "label": "Specified minimum applied",
              "value": 92,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Gmb 2.412 against Gmm 2.560",
          "inputs": {
            "gmb": 2.412,
            "gmm": 2.56,
            "targetDensity": 92
          },
          "expected": 94.2188,
          "toleranceDecimalPlaces": 2,
          "unit": "%",
          "confidence": "high",
          "steps": [
            {
              "label": "Air void content",
              "value": 5.78125,
              "unit": "%"
            },
            {
              "label": "Margin over the specified minimum",
              "value": 2.21875,
              "unit": "%"
            },
            {
              "label": "Specified minimum applied",
              "value": 92,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Under-rolled core, Gmb 2.250 against Gmm 2.502",
          "inputs": {
            "gmb": 2.25,
            "gmm": 2.502,
            "targetDensity": 92
          },
          "expected": 89.9281,
          "toleranceDecimalPlaces": 2,
          "unit": "%",
          "confidence": "high",
          "steps": [
            {
              "label": "Air void content",
              "value": 10.071942446043153,
              "unit": "%"
            },
            {
              "label": "Margin over the specified minimum",
              "value": -2.0719424460431526,
              "unit": "%"
            },
            {
              "label": "Specified minimum applied",
              "value": 92,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "asphalt-millings-cubic-yards-to-tons-calculator",
      "title": "Asphalt Millings Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/asphalt-millings-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 1.6 short tons per cubic yard",
        "Density varies with moisture, composition and how the material was broken or processed"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 16,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.6,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 160,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.6,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "asphalt-millings-tons-to-cubic-yards-calculator",
      "title": "Asphalt Millings Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/asphalt-millings-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 1.6 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 6.25,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.625,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 62.5,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.625,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "asphalt-pavement-esal-calculator",
      "title": "Pavement Design ESAL Calculator",
      "url": "https://craftquantities.com/calculators/heavy-civil/asphalt-pavement-esal-calculator/",
      "sources": [
        "AASHTO Guide for Design of Pavement Structures: damage scales approximately with the fourth power of axle load relative to the 18,000 lb (80 kN) standard axle",
        "Design ESAL = AADT × truck % × truck factor × directional distribution × lane distribution × 365 × growth-adjusted design years"
      ],
      "vectors": [
        {
          "name": "8,000 AADT, 8% trucks, 20 years at 2% growth",
          "inputs": {
            "aadt": 8000,
            "truckPercent": 8,
            "truckFactor": 1,
            "directionalFactor": 0.5,
            "laneFactor": 1,
            "designYears": 20,
            "growthPercent": 2
          },
          "expected": 2837933,
          "toleranceDecimalPlaces": -3,
          "unit": "ESALs",
          "confidence": "medium",
          "steps": [
            {
              "label": "Millions of ESALs",
              "value": 2.8379327925135924,
              "unit": "MESAL"
            },
            {
              "label": "Design-lane ESALs per day",
              "value": 320,
              "unit": "ESAL/day"
            },
            {
              "label": "First-year ESALs",
              "value": 116800,
              "unit": "ESALs"
            },
            {
              "label": "Growth factor over the life",
              "value": 24.297369798917746,
              "unit": "×"
            },
            {
              "label": "Trucks per day in the design lane",
              "value": 320,
              "unit": "trucks/day"
            },
            {
              "label": "Uplift from growth over a flat assumption",
              "value": 21.48684899458873,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "No growth gives the flat total",
          "inputs": {
            "aadt": 8000,
            "truckPercent": 8,
            "truckFactor": 1,
            "directionalFactor": 0.5,
            "laneFactor": 1,
            "designYears": 20,
            "growthPercent": 0
          },
          "expected": 2336000,
          "toleranceDecimalPlaces": -4,
          "unit": "ESALs",
          "confidence": "medium",
          "steps": [
            {
              "label": "Millions of ESALs",
              "value": 2.336,
              "unit": "MESAL"
            },
            {
              "label": "Design-lane ESALs per day",
              "value": 320,
              "unit": "ESAL/day"
            },
            {
              "label": "First-year ESALs",
              "value": 116800,
              "unit": "ESALs"
            },
            {
              "label": "Growth factor over the life",
              "value": 20,
              "unit": "×"
            },
            {
              "label": "Trucks per day in the design lane",
              "value": 320,
              "unit": "trucks/day"
            },
            {
              "label": "Uplift from growth over a flat assumption",
              "value": 0,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Doubling the truck share doubles the loading",
          "inputs": {
            "aadt": 8000,
            "truckPercent": 16,
            "truckFactor": 1,
            "directionalFactor": 0.5,
            "laneFactor": 1,
            "designYears": 20,
            "growthPercent": 0
          },
          "expected": 4672000,
          "toleranceDecimalPlaces": -4,
          "unit": "ESALs",
          "confidence": "medium",
          "steps": [
            {
              "label": "Millions of ESALs",
              "value": 4.672,
              "unit": "MESAL"
            },
            {
              "label": "Design-lane ESALs per day",
              "value": 640,
              "unit": "ESAL/day"
            },
            {
              "label": "First-year ESALs",
              "value": 233600,
              "unit": "ESALs"
            },
            {
              "label": "Growth factor over the life",
              "value": 20,
              "unit": "×"
            },
            {
              "label": "Trucks per day in the design lane",
              "value": 640,
              "unit": "trucks/day"
            },
            {
              "label": "Uplift from growth over a flat assumption",
              "value": 0,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "No trucks means almost no structural loading",
          "inputs": {
            "aadt": 8000,
            "truckPercent": 0,
            "truckFactor": 1,
            "directionalFactor": 0.5,
            "laneFactor": 1,
            "designYears": 20,
            "growthPercent": 2
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "ESALs",
          "confidence": "medium",
          "steps": [
            {
              "label": "Millions of ESALs",
              "value": 0,
              "unit": "MESAL"
            },
            {
              "label": "Design-lane ESALs per day",
              "value": 0,
              "unit": "ESAL/day"
            },
            {
              "label": "First-year ESALs",
              "value": 0,
              "unit": "ESALs"
            },
            {
              "label": "Growth factor over the life",
              "value": 24.297369798917746,
              "unit": "×"
            },
            {
              "label": "Trucks per day in the design lane",
              "value": 0,
              "unit": "trucks/day"
            },
            {
              "label": "Uplift from growth over a flat assumption",
              "value": 21.48684899458873,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A single year of traffic",
          "inputs": {
            "aadt": 8000,
            "truckPercent": 8,
            "truckFactor": 1,
            "directionalFactor": 0.5,
            "laneFactor": 1,
            "designYears": 1,
            "growthPercent": 0
          },
          "expected": 116800,
          "toleranceDecimalPlaces": -4,
          "unit": "ESALs",
          "confidence": "medium",
          "steps": [
            {
              "label": "Millions of ESALs",
              "value": 0.1168,
              "unit": "MESAL"
            },
            {
              "label": "Design-lane ESALs per day",
              "value": 320,
              "unit": "ESAL/day"
            },
            {
              "label": "First-year ESALs",
              "value": 116800,
              "unit": "ESALs"
            },
            {
              "label": "Growth factor over the life",
              "value": 1,
              "unit": "×"
            },
            {
              "label": "Trucks per day in the design lane",
              "value": 320,
              "unit": "trucks/day"
            },
            {
              "label": "Uplift from growth over a flat assumption",
              "value": 0,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "asphalt-prime-coat-calculator",
      "title": "Asphalt Emulsion Prime Coat Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/asphalt-prime-coat-calculator/",
      "sources": [
        "Prime coat volume = area × application rate, the standard method for estimating a sprayed-on bituminous prime coat that penetrates and bonds a granular base course"
      ],
      "vectors": [
        {
          "name": "500m² base, 1.2 L/m²",
          "inputs": {
            "area": 500,
            "applicationRate": 1.2
          },
          "expected": 600,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "750m² base, 1.0 L/m²",
          "inputs": {
            "area": 750,
            "applicationRate": 1
          },
          "expected": 750,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "asphalt-sealcoat-calculator",
      "title": "Asphalt Sealcoat Calculator",
      "url": "https://craftquantities.com/calculators/auto-utility/asphalt-sealcoat-calculator/",
      "sources": [
        "Squeegee-applied asphalt sealcoat typically covers about 70-80 sq ft per gallon per coat; spray application covers more area per gallon but is less common for DIY driveways"
      ],
      "vectors": [
        {
          "name": "40m² driveway, 1 coat",
          "inputs": {
            "drivewayArea": 40,
            "coats": 1
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "gallons",
          "confidence": "medium",
          "steps": [
            {
              "label": "Area to seal (all coats)",
              "value": 430.55641666838886,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "80m² driveway, 2 coats",
          "inputs": {
            "drivewayArea": 80,
            "coats": 2
          },
          "expected": 22,
          "toleranceDecimalPlaces": 0,
          "unit": "gallons",
          "confidence": "medium",
          "steps": [
            {
              "label": "Area to seal (all coats)",
              "value": 1722.2256666735555,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "asphalt-tack-coat-calculator",
      "title": "Asphalt Tack Coat Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/asphalt-tack-coat-calculator/",
      "sources": [
        "Tack coat volume = area × application rate, the standard method for estimating a light bituminous tack coat sprayed between asphalt pavement lifts to bond them together"
      ],
      "vectors": [
        {
          "name": "500m² pavement, 0.4 L/m²",
          "inputs": {
            "area": 500,
            "applicationRate": 0.4
          },
          "expected": 200,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "750m² pavement, 0.35 L/m²",
          "inputs": {
            "area": 750,
            "applicationRate": 0.35
          },
          "expected": 262.5,
          "toleranceDecimalPlaces": 1,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "asphalt-tons-to-cubic-yards-calculator",
      "title": "Asphalt Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/asphalt-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 1.9575 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 5.108556832694764,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.5108556832694764,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 51.08556832694764,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.5108556832694764,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "attic-baffle-count-calculator",
      "title": "Attic Rafter Baffle/Chute Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/attic-baffle-count-calculator/",
      "sources": [
        "Baffle count = ceil(eave run length ÷ rafter spacing), since one baffle is installed in each rafter bay to maintain a clear soffit-to-attic airflow path over the insulation; a run holds one fewer bay than it holds rafters, so no member-count adjustment applies"
      ],
      "vectors": [
        {
          "name": "15m eave, 0.61m rafter spacing",
          "inputs": {
            "eaveLength": 15,
            "rafterSpacing": 0.61
          },
          "expected": 25,
          "toleranceDecimalPlaces": 0,
          "unit": "baffles",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "20m eave, 0.41m rafter spacing",
          "inputs": {
            "eaveLength": 20,
            "rafterSpacing": 0.41
          },
          "expected": 49,
          "toleranceDecimalPlaces": 0,
          "unit": "baffles",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "attic-baffle-vent-calculator",
      "title": "Attic Baffle Vent Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/attic-baffle-vent-calculator/",
      "sources": [
        "One baffle vent is installed per rafter bay; bay count = attic width along the eave / rafter spacing, rounded up"
      ],
      "vectors": [
        {
          "name": "12m width, 16in spacing",
          "inputs": {
            "atticWidth": 12,
            "rafterSpacingIn": "16"
          },
          "expected": 30,
          "toleranceDecimalPlaces": 0,
          "unit": "baffles (one per rafter bay)",
          "confidence": "high",
          "steps": [
            {
              "label": "Attic width",
              "value": 39.37007874015748,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15m width, 24in spacing",
          "inputs": {
            "atticWidth": 15,
            "rafterSpacingIn": "24"
          },
          "expected": 25,
          "toleranceDecimalPlaces": 0,
          "unit": "baffles (one per rafter bay)",
          "confidence": "high",
          "steps": [
            {
              "label": "Attic width",
              "value": 49.212598425196845,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "attic-bypass-sealing-material-calculator",
      "title": "Attic Bypass Sealing Material Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/attic-bypass-sealing-material-calculator/",
      "sources": [
        "Bead length one gunnable cartridge lays down is a RULE OF THUMB, stated as one: about 25 linear ft (7.62 m) from a 10.1 oz cartridge at a quarter-inch bead. Bead width is what moves it, so a wide plate joint consumes the allowance faster than the arithmetic suggests.",
        "ASTM E779, Standard Test Method for Determining Air Leakage Rate by Fan Pressurization — the before-and-after measurement that tells you whether the schedule you sealed was the schedule that mattered",
        "Chase and soffit perimeters are estimated geometrically: a chase is treated as square, so its edge is four times the square root of its own plan area, and a soffit run is treated as one rectangle. Both are approximations and both are stated on the page.",
        "Foam can yield is a PRODUCT figure and is left as an input rather than assumed. The default of 25 small annular penetrations per can is an ordering rule of thumb; the yield printed on the can supersedes it."
      ],
      "vectors": [
        {
          "name": "Typical single-storey ceiling: 4 chases, 6 m of soffit, 45 m of plate",
          "inputs": {
            "chaseCount": 4,
            "chaseArea": 1.6,
            "soffitLength": 6,
            "soffitWidth": 0.6,
            "topPlateLength": 45,
            "housingCount": 8,
            "housingDiameter": 0.19,
            "penetrationCount": 25,
            "penetrationsPerCan": 25,
            "flueCount": 1,
            "flueSize": 0.25,
            "flueClearance": 0.05
          },
          "expected": 11,
          "toleranceDecimalPlaces": 0,
          "unit": "tubes",
          "confidence": "medium",
          "steps": [
            {
              "label": "One-part foam cans",
              "value": 1,
              "unit": "cans"
            },
            {
              "label": "Rigid board over chases and soffits",
              "value": 5.72,
              "unit": "m²"
            },
            {
              "label": "Sheet metal at flues",
              "value": 0.12249999999999998,
              "unit": "m²"
            },
            {
              "label": "Sealed bead run including the cut allowance",
              "value": 80.40396028059483,
              "unit": "m"
            }
          ],
          "includesAllowance": {
            "label": "Cut, start and stop allowance",
            "percent": 10
          },
          "basis": "ambiguous"
        },
        {
          "name": "Larger house: 6 chases, 8 m of soffit, 60 m of plate",
          "inputs": {
            "chaseCount": 6,
            "chaseArea": 2.2,
            "soffitLength": 8,
            "soffitWidth": 0.6,
            "topPlateLength": 60,
            "housingCount": 12,
            "housingDiameter": 0.19,
            "penetrationCount": 40,
            "penetrationsPerCan": 25,
            "flueCount": 1,
            "flueSize": 0.25,
            "flueClearance": 0.05
          },
          "expected": 15,
          "toleranceDecimalPlaces": 0,
          "unit": "tubes",
          "confidence": "medium",
          "steps": [
            {
              "label": "One-part foam cans",
              "value": 2,
              "unit": "cans"
            },
            {
              "label": "Rigid board over chases and soffits",
              "value": 7.700000000000001,
              "unit": "m²"
            },
            {
              "label": "Sheet metal at flues",
              "value": 0.12249999999999998,
              "unit": "m²"
            },
            {
              "label": "Sealed bead run including the cut allowance",
              "value": 108.78510824483796,
              "unit": "m"
            }
          ],
          "includesAllowance": {
            "label": "Cut, start and stop allowance",
            "percent": 10
          },
          "basis": "ambiguous"
        },
        {
          "name": "Single bedroom addition: one chase, no soffit, no flue",
          "inputs": {
            "chaseCount": 1,
            "chaseArea": 0.5,
            "soffitLength": 0,
            "soffitWidth": 0.6,
            "topPlateLength": 12,
            "housingCount": 2,
            "housingDiameter": 0.19,
            "penetrationCount": 8,
            "penetrationsPerCan": 25,
            "flueCount": 0,
            "flueSize": 0.25,
            "flueClearance": 0.05
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "tubes",
          "confidence": "medium",
          "steps": [
            {
              "label": "One-part foam cans",
              "value": 1,
              "unit": "cans"
            },
            {
              "label": "Rigid board over chases and soffits",
              "value": 0.55,
              "unit": "m²"
            },
            {
              "label": "Sheet metal at flues",
              "value": 0,
              "unit": "m²"
            },
            {
              "label": "Sealed bead run including the cut allowance",
              "value": 17.624455566421343,
              "unit": "m"
            }
          ],
          "includesAllowance": {
            "label": "Cut, start and stop allowance",
            "percent": 10
          },
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "attic-fan-cfm-calculator",
      "title": "Attic Fan CFM Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/attic-fan-cfm-calculator/",
      "sources": [
        "Home Ventilating Institute powered attic ventilator sizing: 0.7 CFM per square foot of attic floor area"
      ],
      "vectors": [
        {
          "name": "100m² attic",
          "inputs": {
            "atticArea": 100
          },
          "expected": 754,
          "toleranceDecimalPlaces": 1,
          "unit": "CFM (minimum)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Attic area",
              "value": 1076.391041670972,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150m² attic",
          "inputs": {
            "atticArea": 150
          },
          "expected": 1131,
          "toleranceDecimalPlaces": 1,
          "unit": "CFM (minimum)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Attic area",
              "value": 1614.5865625064582,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "attic-insulation-upgrade-calculator",
      "title": "Attic Insulation Upgrade Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/attic-insulation-upgrade-calculator/",
      "sources": [
        "Standard published R-value per inch for loose-fill blown insulation: fiberglass ~2.5, cellulose ~3.7, mineral wool ~3.0",
        "Additional depth needed (in) = (target R-value - current R-value) / R-value per inch of the chosen material"
      ],
      "vectors": [
        {
          "name": "R19 to R49, fiberglass",
          "inputs": {
            "currentRValue": 19,
            "targetRValue": 49,
            "insulationType": "fiberglass"
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "in of additional insulation",
          "confidence": "medium",
          "steps": [
            {
              "label": "Additional R-value needed",
              "value": 30,
              "unit": "R"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "R13 to R49, cellulose",
          "inputs": {
            "currentRValue": 13,
            "targetRValue": 49,
            "insulationType": "cellulose"
          },
          "expected": 9.73,
          "toleranceDecimalPlaces": 0.1,
          "unit": "in of additional insulation",
          "confidence": "medium",
          "steps": [
            {
              "label": "Additional R-value needed",
              "value": 36,
              "unit": "R"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "attic-radiant-barrier-calculator",
      "title": "Attic Radiant Barrier Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/attic-radiant-barrier-calculator/",
      "sources": [
        "A standard radiant barrier foil roll (4 ft x 125 ft) covers approximately 500 sq ft"
      ],
      "vectors": [
        {
          "name": "150m² roof area",
          "inputs": {
            "roofArea": 150
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Area to cover (with overlap allowance)",
              "value": 1776.0452187571043,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "250m² roof area",
          "inputs": {
            "roofArea": 250
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Area to cover (with overlap allowance)",
              "value": 2960.0753645951736,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "attic-ventilation-calculator",
      "title": "Attic and Loft Ventilation Calculator (Intake, Exhaust and Vent Count)",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/attic-ventilation-calculator/",
      "sources": [
        "International Code Council, 2021 International Residential Code, as adopted without amendment in the Colorado Division of Fire Prevention and Control Residential Code 2021: R806.2, net free ventilating area 1/150 of the vented space; exception, 1/300 where both conditions are met: a Class I or II vapor retarder on the warm-in-winter side of the ceiling in climate zones 6, 7 and 8, and 40 to 50 percent of the required area in ventilators in the upper portion of the attic or rafter space",
        "Residential Code of Ohio, Ohio Adm. Code 4101:8-8-01 (effective 1 July 2019), sections 806.1–806.3 on the 2018 IRC text: upper ventilators not more than 3 ft (914 mm) below the ridge or highest point, measured vertically; the balance in the bottom one-third of the attic space; installation lower where framing conflicts; not less than 1 in (25 mm) between insulation and roof sheathing (Ohio deletes the exception's vapor-retarder condition)",
        "National Research Council of Canada, National Building Code of Canada 2020, Division B, 9.19.1.1–9.19.1.3: vent area not less than 1/300 of the insulated ceiling area, or 1/150 where the roof slope is less than 1 in 6 or the roof has roof joists; vents distributed uniformly on opposite sides, at least 25% at the top and at least 25% at the bottom of the space; 63 mm between insulation and sheathing",
        "Marley, 'How do I ventilate a cold roof?' (technical support guidance, citing BS 5250, Management of moisture in buildings): with a high-resistance underlay, 25 mm along the eaves for pitches of 15° or less, 10 mm for pitches above 15°, and 5 mm at high level where the pitch exceeds 35°, the span exceeds 10 m, or the roof is lean-to or mono-pitch; Wienerberger, 'Roof space ventilation' (2013): a continuous 10 mm gap gives 10,000 mm² per metre run, and the 5 mm high-level vent where a building is 10 metres wide or more or the pitch 35 degrees or above (the page takes this, the stricter reading at the boundaries). Approved Document C (2013) 6.10–6.11 refers roof condensation to BS 5250",
        "Vent ratings and the balance rule: GAF Cobra RidgeRunner data sheet RESCB171 (2020), 12.5 sq in per lineal foot (26,458 mm² per lineal metre), exhaust never to exceed intake, and the chart 1,600 sq ft to 31 ft with 388 sq in of intake; Lomanco 140 soffit vent product specification (2012), 88 sq in per 8 ft unit; Marley Ventilated Dry Ridge System, 5 mm continuous",
        "Marley, Universal 25mm Eaves Vent System: 25,000 mm² free area of ventilation per linear metre, for roof pitches of 12.5° to 55° (product page; Marley's NBS Source data, ventilation opening 25 000 mm²/m, 6000 mm packs; fixing instructions, December 2018, a continuous 25 mm free ventilation path, pack code 46351)",
        "Australian Building Codes Board, National Construction Code 2022 (as adopted), Housing Provisions 10.8.3, ventilation of roof spaces: in climate zones 6, 7 and 8, Table 10.8.3, under 10° pitch 25,000 mm²/m at each of two opposing ends; 10° to under 15°, 25,000 mm²/m at the eaves and 5,000 mm²/m at high level; 15° to under 75°, 7,000 mm²/m at the eaves and 5,000 mm²/m at high level, plus 18,000 mm²/m at the eaves for a cathedral ceiling; areas per metre of the roof's longest horizontal dimension; high level within 900 mm below the ridge; not for concrete roofs, structural insulated panels or BAL-FZ. Applied along both eaves as the Australian Steel Institute's 'Ventilation in Steel Roofing' (VSR V27, 2024) works the table for a gable or hipped roof"
      ],
      "vectors": [
        {
          "name": "12x8m attic, no vapor barrier",
          "inputs": {
            "atticLength": 12,
            "atticWidth": 8,
            "hasVaporBarrier": "no"
          },
          "expected": 6.89,
          "toleranceDecimalPlaces": 1,
          "unit": "sq ft (net free area)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Attic floor area",
              "value": 1033.3354000041334,
              "unit": "sq ft"
            },
            {
              "label": "Net free area needed",
              "value": 640000,
              "unit": "mm²"
            },
            {
              "label": "Intake, low on the roof (eaves or soffit)",
              "value": 322580.00000000006,
              "unit": "mm²"
            },
            {
              "label": "Exhaust, high on the roof (ridge or upper vents)",
              "value": 320000,
              "unit": "mm²"
            },
            {
              "label": "Intake as a continuous gap along both eaves",
              "value": 13.440833333333334,
              "unit": "mm"
            },
            {
              "label": "Exhaust as a continuous gap along the ridge",
              "value": 26.666666666666668,
              "unit": "mm"
            },
            {
              "label": "Intake vent to fit",
              "value": 6,
              "unit": "vents (8 ft)"
            },
            {
              "label": "Exhaust vent to fit",
              "value": 40,
              "unit": "ft"
            },
            {
              "label": "High-level share of the total",
              "value": 50,
              "unit": "%"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "15x10m attic, with vapor barrier",
          "inputs": {
            "atticLength": 15,
            "atticWidth": 10,
            "hasVaporBarrier": "yes"
          },
          "expected": 5.38,
          "toleranceDecimalPlaces": 1,
          "unit": "sq ft (net free area)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Attic floor area",
              "value": 1614.5865625064582,
              "unit": "sq ft"
            },
            {
              "label": "Net free area needed",
              "value": 500000,
              "unit": "mm²"
            },
            {
              "label": "Intake, low on the roof (eaves or soffit)",
              "value": 258064.00000000003,
              "unit": "mm²"
            },
            {
              "label": "Exhaust, high on the roof (ridge or upper vents)",
              "value": 250000,
              "unit": "mm²"
            },
            {
              "label": "Intake as a continuous gap along both eaves",
              "value": 8.602133333333335,
              "unit": "mm"
            },
            {
              "label": "Exhaust as a continuous gap along the ridge",
              "value": 16.666666666666668,
              "unit": "mm"
            },
            {
              "label": "Intake vent to fit",
              "value": 5,
              "unit": "vents (8 ft)"
            },
            {
              "label": "Exhaust vent to fit",
              "value": 32,
              "unit": "ft"
            },
            {
              "label": "High-level share of the total",
              "value": 50,
              "unit": "%"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "GAF's chart: 1,600 sq ft under the 1/300 exception at 50% high is 5.33 sq ft",
          "inputs": {
            "atticLength": 12.192,
            "atticWidth": 12.192,
            "hasVaporBarrier": "yes",
            "exhaustShare": 50,
            "intakeVent": "soffit",
            "intakeArea": 0.01,
            "exhaustVent": "ridge",
            "exhaustArea": 0.005
          },
          "expected": 5.3333,
          "toleranceDecimalPlaces": 3,
          "unit": "sq ft (net free area)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Attic floor area",
              "value": 1600,
              "unit": "sq ft"
            },
            {
              "label": "Net free area needed",
              "value": 495482.88,
              "unit": "mm²"
            },
            {
              "label": "Intake, low on the roof (eaves or soffit)",
              "value": 249999.5,
              "unit": "mm²"
            },
            {
              "label": "Exhaust, high on the roof (ridge or upper vents)",
              "value": 247741.44,
              "unit": "mm²"
            },
            {
              "label": "Intake as a continuous gap along both eaves",
              "value": 10.252604166666666,
              "unit": "mm"
            },
            {
              "label": "Exhaust as a continuous gap along the ridge",
              "value": 20.32,
              "unit": "mm"
            },
            {
              "label": "Intake vent to fit",
              "value": 5,
              "unit": "vents (8 ft)"
            },
            {
              "label": "Exhaust vent to fit",
              "value": 31,
              "unit": "ft"
            },
            {
              "label": "High-level share of the total",
              "value": 50,
              "unit": "%"
            }
          ],
          "basis": "cited",
          "sourceIndex": 4
        },
        {
          "name": "The exception missed: 60% high up falls back to 1/150, 10.67 sq ft",
          "inputs": {
            "atticLength": 12.192,
            "atticWidth": 12.192,
            "hasVaporBarrier": "yes",
            "exhaustShare": 60,
            "intakeVent": "soffit",
            "intakeArea": 0.01,
            "exhaustVent": "ridge",
            "exhaustArea": 0.005
          },
          "expected": 10.6667,
          "toleranceDecimalPlaces": 3,
          "unit": "sq ft (net free area)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Attic floor area",
              "value": 1600,
              "unit": "sq ft"
            },
            {
              "label": "Net free area needed",
              "value": 990965.76,
              "unit": "mm²"
            },
            {
              "label": "Intake, low on the roof (eaves or soffit)",
              "value": 596773,
              "unit": "mm²"
            },
            {
              "label": "Exhaust, high on the roof (ridge or upper vents)",
              "value": 594579.456,
              "unit": "mm²"
            },
            {
              "label": "Intake as a continuous gap along both eaves",
              "value": 24.473958333333332,
              "unit": "mm"
            },
            {
              "label": "Exhaust as a continuous gap along the ridge",
              "value": 48.767999999999994,
              "unit": "mm"
            },
            {
              "label": "Intake vent to fit",
              "value": 11,
              "unit": "vents (8 ft)"
            },
            {
              "label": "Exhaust vent to fit",
              "value": 74,
              "unit": "ft"
            },
            {
              "label": "High-level share of the total",
              "value": 60,
              "unit": "%"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "NBC 9.19.1.2: 12 x 8 m at 1/300 is 0.32 m², 3.444 sq ft",
          "inputs": {
            "atticLength": 12,
            "atticWidth": 8,
            "hasVaporBarrier": "nbc",
            "exhaustShare": 50,
            "intakeVent": "soffit",
            "intakeArea": 0.01,
            "exhaustVent": "ridge",
            "exhaustArea": 0.005
          },
          "expected": 3.44445,
          "toleranceDecimalPlaces": 4,
          "unit": "sq ft (net free area)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Attic floor area",
              "value": 1033.3354000041334,
              "unit": "sq ft"
            },
            {
              "label": "Net free area needed",
              "value": 320000,
              "unit": "mm²"
            },
            {
              "label": "Intake, low on the roof (eaves or soffit)",
              "value": 161290.00000000003,
              "unit": "mm²"
            },
            {
              "label": "Exhaust, high on the roof (ridge or upper vents)",
              "value": 160000,
              "unit": "mm²"
            },
            {
              "label": "Intake as a continuous gap along both eaves",
              "value": 6.720416666666667,
              "unit": "mm"
            },
            {
              "label": "Exhaust as a continuous gap along the ridge",
              "value": 13.333333333333334,
              "unit": "mm"
            },
            {
              "label": "Intake vent to fit",
              "value": 3,
              "unit": "vents (8 ft)"
            },
            {
              "label": "Exhaust vent to fit",
              "value": 20,
              "unit": "ft"
            },
            {
              "label": "High-level share of the total",
              "value": 50,
              "unit": "%"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "BS 5250, pitch over 15° and under 35°, 12 x 8 m: 10 mm along both 12 m eaves, no ridge vent at an 8 m span",
          "inputs": {
            "atticLength": 12,
            "atticWidth": 8,
            "hasVaporBarrier": "ukMid",
            "exhaustShare": 50,
            "intakeVent": "soffit",
            "intakeArea": 0.01,
            "exhaustVent": "ridge",
            "exhaustArea": 0.005
          },
          "expected": 2.58334,
          "toleranceDecimalPlaces": 4,
          "unit": "sq ft (net free area)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Attic floor area",
              "value": 1033.3354000041334,
              "unit": "sq ft"
            },
            {
              "label": "Net free area needed",
              "value": 240000,
              "unit": "mm²"
            },
            {
              "label": "Intake, low on the roof (eaves or soffit)",
              "value": 240000,
              "unit": "mm²"
            },
            {
              "label": "Exhaust, high on the roof (ridge or upper vents)",
              "value": 0,
              "unit": "mm²"
            },
            {
              "label": "Intake as a continuous gap along both eaves",
              "value": 10,
              "unit": "mm"
            },
            {
              "label": "Exhaust as a continuous gap along the ridge",
              "value": 0,
              "unit": "mm"
            },
            {
              "label": "Intake vent to fit",
              "value": 10,
              "unit": "vents (8 ft)"
            },
            {
              "label": "Exhaust vent to fit",
              "value": 0,
              "unit": "ft"
            },
            {
              "label": "High-level share of the total",
              "value": 0,
              "unit": "%"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "BS 5250, pitch 35° or more, 12 x 8 m: eaves 0.24 m² and a 5 mm ridge, 0.06 m², 3.229 sq ft",
          "inputs": {
            "atticLength": 12,
            "atticWidth": 8,
            "hasVaporBarrier": "ukSteep",
            "exhaustShare": 50,
            "intakeVent": "soffit",
            "intakeArea": 0.01,
            "exhaustVent": "ridge",
            "exhaustArea": 0.005
          },
          "expected": 3.22917,
          "toleranceDecimalPlaces": 4,
          "unit": "sq ft (net free area)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Attic floor area",
              "value": 1033.3354000041334,
              "unit": "sq ft"
            },
            {
              "label": "Net free area needed",
              "value": 300000,
              "unit": "mm²"
            },
            {
              "label": "Intake, low on the roof (eaves or soffit)",
              "value": 240000,
              "unit": "mm²"
            },
            {
              "label": "Exhaust, high on the roof (ridge or upper vents)",
              "value": 60000,
              "unit": "mm²"
            },
            {
              "label": "Intake as a continuous gap along both eaves",
              "value": 10,
              "unit": "mm"
            },
            {
              "label": "Exhaust as a continuous gap along the ridge",
              "value": 5,
              "unit": "mm"
            },
            {
              "label": "Intake vent to fit",
              "value": 10,
              "unit": "vents (8 ft)"
            },
            {
              "label": "Exhaust vent to fit",
              "value": 40,
              "unit": "ft"
            },
            {
              "label": "High-level share of the total",
              "value": 20,
              "unit": "%"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "NBC 9.19.1.2 below a one-in-six slope, with vents rated by the reader: 1/150 of 12 x 7.5 m, 6.458 sq ft",
          "inputs": {
            "atticLength": 12,
            "atticWidth": 7.5,
            "hasVaporBarrier": "nbcLow",
            "exhaustShare": 50,
            "intakeVent": "custom",
            "intakeArea": 0.01,
            "exhaustVent": "custom",
            "exhaustArea": 0.026458
          },
          "expected": 6.45835,
          "toleranceDecimalPlaces": 4,
          "unit": "sq ft (net free area)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Attic floor area",
              "value": 968.751937503875,
              "unit": "sq ft"
            },
            {
              "label": "Net free area needed",
              "value": 600000,
              "unit": "mm²"
            },
            {
              "label": "Intake, low on the roof (eaves or soffit)",
              "value": 317496,
              "unit": "mm²"
            },
            {
              "label": "Exhaust, high on the roof (ridge or upper vents)",
              "value": 300000,
              "unit": "mm²"
            },
            {
              "label": "Intake as a continuous gap along both eaves",
              "value": 13.229,
              "unit": "mm"
            },
            {
              "label": "Exhaust as a continuous gap along the ridge",
              "value": 24.999999999999996,
              "unit": "mm"
            },
            {
              "label": "Intake vent to fit",
              "value": 32,
              "unit": "vents"
            },
            {
              "label": "Exhaust vent to fit",
              "value": 12,
              "unit": "vents"
            },
            {
              "label": "High-level share of the total",
              "value": 50,
              "unit": "%"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "BS 5250, pitch 15° or less over an 11 m span: 25 mm at both eaves and 5 mm at high level, 7.104 sq ft",
          "inputs": {
            "atticLength": 12,
            "atticWidth": 11,
            "hasVaporBarrier": "ukLow",
            "exhaustShare": 50,
            "intakeVent": "custom",
            "intakeArea": 0.01,
            "exhaustVent": "custom",
            "exhaustArea": 0.026458
          },
          "expected": 7.10418,
          "toleranceDecimalPlaces": 4,
          "unit": "sq ft (net free area)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Attic floor area",
              "value": 1420.8361750056833,
              "unit": "sq ft"
            },
            {
              "label": "Net free area needed",
              "value": 660000.0000000001,
              "unit": "mm²"
            },
            {
              "label": "Intake, low on the roof (eaves or soffit)",
              "value": 600000.0000000001,
              "unit": "mm²"
            },
            {
              "label": "Exhaust, high on the roof (ridge or upper vents)",
              "value": 60000,
              "unit": "mm²"
            },
            {
              "label": "Intake as a continuous gap along both eaves",
              "value": 25.000000000000004,
              "unit": "mm"
            },
            {
              "label": "Exhaust as a continuous gap along the ridge",
              "value": 5,
              "unit": "mm"
            },
            {
              "label": "Intake vent to fit",
              "value": 60,
              "unit": "vents"
            },
            {
              "label": "Exhaust vent to fit",
              "value": 3,
              "unit": "vents"
            },
            {
              "label": "High-level share of the total",
              "value": 9.090909090909088,
              "unit": "%"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "NCC 2022 Table 10.8.3, pitch 15° to under 75°, 12 x 7.5 m: 7,000 mm² a metre at each eave and 5,000 high up, 2.454 sq ft",
          "inputs": {
            "atticLength": 12,
            "atticWidth": 7.5,
            "hasVaporBarrier": "auSteep",
            "exhaustShare": 50,
            "intakeVent": "soffit",
            "intakeArea": 0.025,
            "exhaustVent": "ridge",
            "exhaustArea": 0.026458
          },
          "expected": 2.45417,
          "toleranceDecimalPlaces": 4,
          "unit": "sq ft (net free area)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Attic floor area",
              "value": 968.751937503875,
              "unit": "sq ft"
            },
            {
              "label": "Net free area needed",
              "value": 228000,
              "unit": "mm²"
            },
            {
              "label": "Intake, low on the roof (eaves or soffit)",
              "value": 168000,
              "unit": "mm²"
            },
            {
              "label": "Exhaust, high on the roof (ridge or upper vents)",
              "value": 60000,
              "unit": "mm²"
            },
            {
              "label": "Intake as a continuous gap along both eaves",
              "value": 7,
              "unit": "mm"
            },
            {
              "label": "Exhaust as a continuous gap along the ridge",
              "value": 5,
              "unit": "mm"
            },
            {
              "label": "Intake vent to fit",
              "value": 10,
              "unit": "vents (8 ft)"
            },
            {
              "label": "Exhaust vent to fit",
              "value": 40,
              "unit": "ft"
            },
            {
              "label": "High-level share of the total",
              "value": 26.31578947368421,
              "unit": "%"
            }
          ],
          "basis": "cited",
          "sourceIndex": 6
        },
        {
          "name": "NCC 2022 Table 10.8.3, pitch 10° to under 15°, 12 x 7.5 m: 25,000 mm² a metre at each eave and 5,000 high up, 7.104 sq ft",
          "inputs": {
            "atticLength": 12,
            "atticWidth": 7.5,
            "hasVaporBarrier": "auMid",
            "exhaustShare": 50,
            "intakeVent": "soffit",
            "intakeArea": 0.025,
            "exhaustVent": "ridge",
            "exhaustArea": 0.026458
          },
          "expected": 7.10418,
          "toleranceDecimalPlaces": 4,
          "unit": "sq ft (net free area)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Attic floor area",
              "value": 968.751937503875,
              "unit": "sq ft"
            },
            {
              "label": "Net free area needed",
              "value": 660000.0000000001,
              "unit": "mm²"
            },
            {
              "label": "Intake, low on the roof (eaves or soffit)",
              "value": 600000.0000000001,
              "unit": "mm²"
            },
            {
              "label": "Exhaust, high on the roof (ridge or upper vents)",
              "value": 60000,
              "unit": "mm²"
            },
            {
              "label": "Intake as a continuous gap along both eaves",
              "value": 25.000000000000004,
              "unit": "mm"
            },
            {
              "label": "Exhaust as a continuous gap along the ridge",
              "value": 5,
              "unit": "mm"
            },
            {
              "label": "Intake vent to fit",
              "value": 11,
              "unit": "vents (8 ft)"
            },
            {
              "label": "Exhaust vent to fit",
              "value": 40,
              "unit": "ft"
            },
            {
              "label": "High-level share of the total",
              "value": 9.090909090909088,
              "unit": "%"
            }
          ],
          "basis": "cited",
          "sourceIndex": 6
        },
        {
          "name": "NCC 2022 Table 10.8.3, pitch under 10°, a 8 x 10 m roof whose width is its longest side: 25,000 mm² a metre at each of two ends, 5.382 sq ft",
          "inputs": {
            "atticLength": 8,
            "atticWidth": 10,
            "hasVaporBarrier": "auLow",
            "exhaustShare": 50,
            "intakeVent": "soffit",
            "intakeArea": 0.025,
            "exhaustVent": "ridge",
            "exhaustArea": 0.026458
          },
          "expected": 5.38196,
          "toleranceDecimalPlaces": 4,
          "unit": "sq ft (net free area)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Attic floor area",
              "value": 861.1128333367777,
              "unit": "sq ft"
            },
            {
              "label": "Net free area needed",
              "value": 500000,
              "unit": "mm²"
            },
            {
              "label": "Intake, low on the roof (eaves or soffit)",
              "value": 500000,
              "unit": "mm²"
            },
            {
              "label": "Exhaust, high on the roof (ridge or upper vents)",
              "value": 0,
              "unit": "mm²"
            },
            {
              "label": "Intake as a continuous gap along both eaves",
              "value": 31.25,
              "unit": "mm"
            },
            {
              "label": "Exhaust as a continuous gap along the ridge",
              "value": 0,
              "unit": "mm"
            },
            {
              "label": "Intake vent to fit",
              "value": 9,
              "unit": "vents (8 ft)"
            },
            {
              "label": "Exhaust vent to fit",
              "value": 0,
              "unit": "ft"
            },
            {
              "label": "High-level share of the total",
              "value": 0,
              "unit": "%"
            }
          ],
          "basis": "cited",
          "sourceIndex": 6
        }
      ]
    },
    {
      "slug": "awg-to-mm2-calculator",
      "title": "AWG to mm² Wire Size Calculator",
      "url": "https://craftquantities.com/calculators/electrical/awg-to-mm2-calculator/",
      "sources": [
        "AWG is defined geometrically: 4/0 is 0.4600 in and 36 AWG is 0.0050 in, with 39 equal ratio steps between them, so diameter = 0.005 in × 92^((36 − n)/39)",
        "NEC Chapter 9, Table 8 (conductor properties) gives the same areas to three significant figures: 12 AWG = 3.31 mm², 6 AWG = 13.3 mm², 4/0 AWG = 107 mm²",
        "IEC 60228 nominal cross-sectional areas for standard metric conductors: 0.5, 0.75, 1, 1.5, 2.5, 4, 6, 10, 16, 25, 35, 50, 70, 95, 120, 150, 185, 240, 300, 400 mm²"
      ],
      "vectors": [
        {
          "name": "12 AWG is 3.31 mm² (NEC Chapter 9 Table 8)",
          "inputs": {
            "direction": "awg-to-mm2",
            "gauge": "12",
            "areaMm2": 16
          },
          "expected": 3.30877,
          "toleranceDecimalPlaces": 4,
          "unit": "mm²",
          "confidence": "high",
          "steps": [
            {
              "label": "Conductor diameter",
              "value": 2.0525253884939474,
              "unit": "mm"
            },
            {
              "label": "Nearest standard metric size",
              "value": 4,
              "unit": "mm²"
            },
            {
              "label": "Nearest metric size that is not smaller",
              "value": 4,
              "unit": "mm²"
            },
            {
              "label": "Difference from that size",
              "value": 20.890739551179664,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "6 AWG is 13.3 mm²",
          "inputs": {
            "direction": "awg-to-mm2",
            "gauge": "6",
            "areaMm2": 16
          },
          "expected": 13.30177,
          "toleranceDecimalPlaces": 4,
          "unit": "mm²",
          "confidence": "high",
          "steps": [
            {
              "label": "Conductor diameter",
              "value": 4.115378098506909,
              "unit": "mm"
            },
            {
              "label": "Nearest standard metric size",
              "value": 16,
              "unit": "mm²"
            },
            {
              "label": "Nearest metric size that is not smaller",
              "value": 16,
              "unit": "mm²"
            },
            {
              "label": "Difference from that size",
              "value": 20.284763131844745,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "4/0 AWG is 107 mm²",
          "inputs": {
            "direction": "awg-to-mm2",
            "gauge": "-3",
            "areaMm2": 16
          },
          "expected": 107.2193,
          "toleranceDecimalPlaces": 3,
          "unit": "mm²",
          "confidence": "high",
          "steps": [
            {
              "label": "Conductor diameter",
              "value": 11.684,
              "unit": "mm"
            },
            {
              "label": "Nearest standard metric size",
              "value": 95,
              "unit": "mm²"
            },
            {
              "label": "Nearest metric size that is not smaller",
              "value": 120,
              "unit": "mm²"
            },
            {
              "label": "Difference from that size",
              "value": 11.920146014554934,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "16 mm² needs 4 AWG, which is 21.15 mm²",
          "inputs": {
            "direction": "mm2-to-awg",
            "gauge": "6",
            "areaMm2": 16
          },
          "expected": 21.15064,
          "toleranceDecimalPlaces": 4,
          "unit": "mm² (4 AWG)",
          "confidence": "high",
          "steps": [
            {
              "label": "Area you asked for",
              "value": 16,
              "unit": "mm²"
            },
            {
              "label": "Area of that gauge",
              "value": 21.15063942544283,
              "unit": "mm²"
            },
            {
              "label": "How much larger the gauge is",
              "value": 32.19149640901768,
              "unit": "%"
            },
            {
              "label": "Conductor diameter of that gauge",
              "value": 5.189395968020595,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "2.5 mm² needs 12 AWG, which is 3.31 mm²",
          "inputs": {
            "direction": "mm2-to-awg",
            "gauge": "6",
            "areaMm2": 2.5
          },
          "expected": 3.30877,
          "toleranceDecimalPlaces": 4,
          "unit": "mm² (12 AWG)",
          "confidence": "high",
          "steps": [
            {
              "label": "Area you asked for",
              "value": 2.5,
              "unit": "mm²"
            },
            {
              "label": "Area of that gauge",
              "value": 3.308772876111475,
              "unit": "mm²"
            },
            {
              "label": "How much larger the gauge is",
              "value": 32.35091504445901,
              "unit": "%"
            },
            {
              "label": "Conductor diameter of that gauge",
              "value": 2.0525253884939474,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "backer-board-calculator",
      "title": "Tile Backer Board Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/backer-board-calculator/",
      "sources": [
        "Fastener spacing 200 mm (8 in) on centre through the field and at edges — manufacturer installation instructions and TCNA Handbook",
        "Joints taped with alkali-resistant mesh tape and set in the same mortar used to bed the tile"
      ],
      "vectors": [
        {
          "name": "15 m² in 1200×800 boards at 15% waste",
          "inputs": {
            "area": 15,
            "boardSize": "1200x800",
            "wastePercent": 15
          },
          "expected": 18,
          "toleranceDecimalPlaces": 0,
          "unit": "boards",
          "confidence": "medium",
          "steps": [
            {
              "label": "Board coverage",
              "value": 0.96,
              "unit": "m²"
            },
            {
              "label": "Area with waste",
              "value": 17.25,
              "unit": "m²"
            },
            {
              "label": "Backer board screws",
              "value": 305,
              "unit": "screws"
            },
            {
              "label": "Alkali-resistant mesh tape",
              "value": 58,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Larger sheets need fewer boards",
          "inputs": {
            "area": 15,
            "boardSize": "2400x1200",
            "wastePercent": 15
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "boards",
          "confidence": "medium",
          "steps": [
            {
              "label": "Board coverage",
              "value": 2.88,
              "unit": "m²"
            },
            {
              "label": "Area with waste",
              "value": 17.25,
              "unit": "m²"
            },
            {
              "label": "Backer board screws",
              "value": 305,
              "unit": "screws"
            },
            {
              "label": "Alkali-resistant mesh tape",
              "value": 20,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "No waste allowance",
          "inputs": {
            "area": 15,
            "boardSize": "1200x800",
            "wastePercent": 0
          },
          "expected": 16,
          "toleranceDecimalPlaces": 0,
          "unit": "boards",
          "confidence": "medium",
          "steps": [
            {
              "label": "Board coverage",
              "value": 0.96,
              "unit": "m²"
            },
            {
              "label": "Area with waste",
              "value": 15,
              "unit": "m²"
            },
            {
              "label": "Backer board screws",
              "value": 271,
              "unit": "screws"
            },
            {
              "label": "Alkali-resistant mesh tape",
              "value": 52,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Double the area",
          "inputs": {
            "area": 30,
            "boardSize": "1200x800",
            "wastePercent": 15
          },
          "expected": 36,
          "toleranceDecimalPlaces": 0,
          "unit": "boards",
          "confidence": "medium",
          "steps": [
            {
              "label": "Board coverage",
              "value": 0.96,
              "unit": "m²"
            },
            {
              "label": "Area with waste",
              "value": 34.5,
              "unit": "m²"
            },
            {
              "label": "Backer board screws",
              "value": 609,
              "unit": "screws"
            },
            {
              "label": "Alkali-resistant mesh tape",
              "value": 116,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "backfill-lift-count-calculator",
      "title": "Backfill Compaction Lift Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/backfill-lift-count-calculator/",
      "sources": [
        "Structural fill is placed and compacted in controlled lift thicknesses to achieve uniform density throughout the fill depth; number of lifts = ceiling(total fill height / lift thickness)"
      ],
      "vectors": [
        {
          "name": "3m height, 0.2m lifts",
          "inputs": {
            "totalFillHeight": 3,
            "liftThickness": 0.2
          },
          "expected": 15,
          "toleranceDecimalPlaces": 0,
          "unit": "lifts",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2.4m height, 0.15m lifts",
          "inputs": {
            "totalFillHeight": 2.4,
            "liftThickness": 0.15
          },
          "expected": 16,
          "toleranceDecimalPlaces": 0,
          "unit": "lifts",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "backflow-preventer-velocity-calculator",
      "title": "Backflow Preventer Discharge Velocity Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/backflow-preventer-velocity-calculator/",
      "sources": [
        "Velocity = flow rate ÷ pipe cross-sectional area, the standard method for checking flow velocity through a backflow preventer assembly against the manufacturer's rated maximum velocity"
      ],
      "vectors": [
        {
          "name": "5 L/s through 50mm pipe",
          "inputs": {
            "flowRate": 300,
            "pipeDiameter": 0.05
          },
          "expected": 2.55,
          "toleranceDecimalPlaces": 1,
          "unit": "m/s",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "8 L/s through 65mm pipe",
          "inputs": {
            "flowRate": 480,
            "pipeDiameter": 0.065
          },
          "expected": 2.41,
          "toleranceDecimalPlaces": 1,
          "unit": "m/s",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "balcony-flashing-calculator",
      "title": "Liquid-Applied Polyurethane Balcony Flashing Seam Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/balcony-flashing-calculator/",
      "sources": [
        "Total seam flashing = total seam/detail length × (1 + waste allowance), the standard method for estimating reinforcement fabric or flashing strips at seams, drains, and edge details in a liquid-applied waterproofing system"
      ],
      "vectors": [
        {
          "name": "25m seam length, 8% waste",
          "inputs": {
            "seamLength": 25,
            "wastePercent": 8
          },
          "expected": 27,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "35m seam length, 10% waste",
          "inputs": {
            "seamLength": 35,
            "wastePercent": 10
          },
          "expected": 38.5,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "baluster-calculator",
      "title": "Deck Baluster Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/baluster-calculator/",
      "sources": [
        "US: International Residential Code R312.1.3 — openings in a required guard must not allow passage of a 4 in (101.6 mm) diameter sphere; the imperial page solves to it",
        "UK: Approved Document K (2013), Section 3 — guarding in a building likely to be used by children under five should not have openings that allow passage of a 100 mm (3.94 in) sphere; the metric page solves to it"
      ],
      "vectors": [
        {
          "name": "2.4m rail section, 1.5in balusters",
          "inputs": {
            "railSectionLength": 2.4,
            "balusterWidth": 0.0381
          },
          "expected": 17,
          "toleranceDecimalPlaces": 0,
          "unit": "balusters",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rail section length",
              "value": 94.48818897637794,
              "unit": "in"
            },
            {
              "label": "Actual gap between balusters",
              "value": 3.83267716535433,
              "unit": "in"
            },
            {
              "label": "Largest gap allowed",
              "value": 4,
              "unit": "in"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1.8m rail section, 2in balusters",
          "inputs": {
            "railSectionLength": 1.8,
            "balusterWidth": 0.0508
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "balusters",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rail section length",
              "value": 70.86614173228347,
              "unit": "in"
            },
            {
              "label": "Actual gap between balusters",
              "value": 3.6050878255602665,
              "unit": "in"
            },
            {
              "label": "Largest gap allowed",
              "value": 4,
              "unit": "in"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "0.67m rail section, 41mm balusters (the span the two rules part on)",
          "inputs": {
            "railSectionLength": 0.67,
            "balusterWidth": 0.041
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "balusters",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rail section length",
              "value": 26.377952755905515,
              "unit": "in"
            },
            {
              "label": "Actual gap between balusters",
              "value": 3.984251968503938,
              "unit": "in"
            },
            {
              "label": "Largest gap allowed",
              "value": 4,
              "unit": "in"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "bar-to-psi-calculator",
      "title": "Bar to PSI Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/bar-to-psi-calculator/",
      "sources": [
        "1 bar = 100,000 Pa = 14.503773773 psi"
      ],
      "vectors": [
        {
          "name": "4 bar converts correctly",
          "inputs": {
            "bar": 4
          },
          "expected": 58.015095092,
          "toleranceDecimalPlaces": 6,
          "unit": "psi",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 14.503773773,
              "unit": "psi per bar"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "bar": 40
          },
          "expected": 580.15095092,
          "toleranceDecimalPlaces": 6,
          "unit": "psi",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 14.503773773,
              "unit": "psi per bar"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "bark-mulch-cubic-yards-to-tons-calculator",
      "title": "Bark Mulch Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/bark-mulch-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 0.35 short tons per cubic yard",
        "Density varies with moisture, grading and how the material was processed"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 3.5,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.35,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 35,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.35,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "bark-mulch-tons-to-cubic-yards-calculator",
      "title": "Bark Mulch Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/bark-mulch-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 0.35 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 28.571428571428573,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 2.857142857142857,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 285.7142857142857,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 2.857142857142857,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "base-course-tonnage-calculator",
      "title": "Roadway Base Course Aggregate Tonnage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/base-course-tonnage-calculator/",
      "sources": [
        "Mass = area × depth × material density, converted to metric tons, the standard method for estimating bulk aggregate base course material"
      ],
      "vectors": [
        {
          "name": "1000m² area, 150mm depth, 2000 kg/m³",
          "inputs": {
            "area": 1000,
            "depth": 0.15,
            "density": 2000
          },
          "expected": 300,
          "toleranceDecimalPlaces": 0,
          "unit": "metric tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume",
              "value": 150,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1500m² area, 200mm depth, 2100 kg/m³",
          "inputs": {
            "area": 1500,
            "depth": 0.2,
            "density": 2100
          },
          "expected": 630,
          "toleranceDecimalPlaces": 0,
          "unit": "metric tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume",
              "value": 300,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "baseboard-heater-btu-calculator",
      "title": "Electric Baseboard Heater Sizing Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/baseboard-heater-btu-calculator/",
      "sources": [
        "Common electric baseboard heating rule of thumb: 10 watts per square foot for an average-insulated room with 8 ft ceilings"
      ],
      "vectors": [
        {
          "name": "20m² room",
          "inputs": {
            "roomArea": 20
          },
          "expected": 2152.8,
          "toleranceDecimalPlaces": 1,
          "unit": "W",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent heat output",
              "value": 7345.597373623011,
              "unit": "BTU/hr"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15m² room",
          "inputs": {
            "roomArea": 15
          },
          "expected": 1614.6,
          "toleranceDecimalPlaces": 1,
          "unit": "W",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent heat output",
              "value": 5509.198030217258,
              "unit": "BTU/hr"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "baseboard-heater-length-calculator",
      "title": "Baseboard Heater Length Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/baseboard-heater-length-calculator/",
      "sources": [
        "Standard electric baseboard heaters are commonly rated around 250 watts per linear foot; required length = target watts / watts per foot, rounded up to a standard stock length"
      ],
      "vectors": [
        {
          "name": "2000W target, 250 W/ft heater",
          "inputs": {
            "wattsNeeded": 2000,
            "wattsPerFoot": 250
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Minimum length needed",
              "value": 8,
              "unit": "ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1000W target, 250 W/ft heater",
          "inputs": {
            "wattsNeeded": 1000,
            "wattsPerFoot": 250
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Minimum length needed",
              "value": 4,
              "unit": "ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "baseboard-trim-calculator",
      "title": "Baseboard & Trim Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/baseboard-trim-calculator/",
      "sources": [
        "Room perimeter = 2 x (length + width) for a rectangular room; trim is commonly stocked in 8, 10, 12, 14, and 16 ft sticks in North America, and in the 2.4, 3, 3.6, 4.2 and 4.8 m lengths metric merchants run, moulding there stepping by 300 mm",
        "10-15% waste is standard to account for cuts, corners (mitered at 45°), and mistakes"
      ],
      "vectors": [
        {
          "name": "4x3.5m room, 1 doorway, 8ft sticks",
          "inputs": {
            "roomLength": 4,
            "roomWidth": 3.5,
            "doorwayCount": 1,
            "stickLengthFt": 8
          },
          "expected": 50.88,
          "toleranceDecimalPlaces": 1,
          "unit": "linear ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Room perimeter (minus doorways)",
              "value": 46.25984251968504,
              "unit": "linear ft"
            },
            {
              "label": "Sticks needed",
              "value": 7,
              "unit": "x 8 ft sticks"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "5x4m room, no doorways, 12ft sticks",
          "inputs": {
            "roomLength": 5,
            "roomWidth": 4,
            "doorwayCount": 0,
            "stickLengthFt": 12
          },
          "expected": 64.96,
          "toleranceDecimalPlaces": 1,
          "unit": "linear ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Room perimeter (minus doorways)",
              "value": 59.055118110236215,
              "unit": "linear ft"
            },
            {
              "label": "Sticks needed",
              "value": 6,
              "unit": "x 12 ft sticks"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "The first room at a 15% cutting allowance",
          "inputs": {
            "roomLength": 4,
            "roomWidth": 3.5,
            "doorwayCount": 1,
            "stickLengthFt": 8,
            "wastePercent": 15
          },
          "expected": 53.2,
          "toleranceDecimalPlaces": 1,
          "unit": "linear ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Room perimeter (minus doorways)",
              "value": 46.25984251968504,
              "unit": "linear ft"
            },
            {
              "label": "Sticks needed",
              "value": 7,
              "unit": "x 8 ft sticks"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "basement-wall-at-rest-pressure-calculator",
      "title": "Basement Wall At-Rest Earth Pressure Calculator (with Groundwater)",
      "url": "https://craftquantities.com/calculators/materials-quantities/basement-wall-at-rest-pressure-calculator/",
      "sources": [
        "BS EN 1997-1 (Eurocode 7), 9.5.2: for a horizontal ground surface the at-rest coefficient is K0 = (1 − sin φ′) × √OCR, not to be used for very high overconsolidation ratios; with OCR = 1 it is Jaky's relation, K0 = 1 − sin φ′",
        "Effective-stress earth pressure with the pore water on its own line: horizontal pressure = K × σ′v on the soil skeleton plus γw × depth below the water table, the water taking no earth-pressure coefficient because it has no shear strength (Craig's Soil Mechanics; CIRIA C760); IBC 1610.1 requires at-rest pressure for walls restrained from moving at the top"
      ],
      "vectors": [
        {
          "name": "The backfill guide's wall: φ′ 34°, 20 kN/m³, 2.7 m, no water",
          "inputs": {
            "retainedHeight": 2.7,
            "coefficientSource": "at-rest",
            "frictionAngle": 34,
            "overconsolidationRatio": 1,
            "coefficient": 0.5,
            "moistUnitWeight": 20,
            "saturatedUnitWeight": 20,
            "waterTableDepth": 10,
            "surcharge": 0
          },
          "expected": 32.1348,
          "toleranceDecimalPlaces": 3,
          "unit": "kN/m",
          "confidence": "medium",
          "steps": [
            {
              "label": "At-rest coefficient K0",
              "value": 0.4408070965292531
            },
            {
              "label": "Soil pressure at the base",
              "value": 23.803583212579667,
              "unit": "kN/m²"
            },
            {
              "label": "Water pressure at the base",
              "value": 0,
              "unit": "kN/m²"
            },
            {
              "label": "Total pressure at the base",
              "value": 23.803583212579667,
              "unit": "kN/m²"
            },
            {
              "label": "Soil thrust per unit run",
              "value": 32.13483733698255,
              "unit": "kN/m"
            },
            {
              "label": "Water thrust per unit run",
              "value": 0,
              "unit": "kN/m"
            },
            {
              "label": "Height of the resultant above the base",
              "value": 0.9,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Water to the surface, K 0.33: the soil report guide's 39.5 kPa at 3 m, and the tank guide's 44 kN/m of water",
          "inputs": {
            "retainedHeight": 3,
            "coefficientSource": "entered",
            "frictionAngle": 30,
            "overconsolidationRatio": 1,
            "coefficient": 0.33,
            "moistUnitWeight": 19,
            "saturatedUnitWeight": 20.01,
            "waterTableDepth": 0,
            "surcharge": 0
          },
          "expected": 59.292,
          "toleranceDecimalPlaces": 3,
          "unit": "kN/m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Earth pressure coefficient K",
              "value": 0.33
            },
            {
              "label": "Soil pressure at the base",
              "value": 10.098,
              "unit": "kN/m²"
            },
            {
              "label": "Water pressure at the base",
              "value": 29.43,
              "unit": "kN/m²"
            },
            {
              "label": "Total pressure at the base",
              "value": 39.528,
              "unit": "kN/m²"
            },
            {
              "label": "Soil thrust per unit run",
              "value": 15.147000000000004,
              "unit": "kN/m"
            },
            {
              "label": "Water thrust per unit run",
              "value": 44.144999999999996,
              "unit": "kN/m"
            },
            {
              "label": "Height of the resultant above the base",
              "value": 1,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Part submerged with a 10 kPa surcharge",
          "inputs": {
            "retainedHeight": 4,
            "coefficientSource": "at-rest",
            "frictionAngle": 30,
            "overconsolidationRatio": 1,
            "coefficient": 0.5,
            "moistUnitWeight": 18,
            "saturatedUnitWeight": 20,
            "waterTableDepth": 2,
            "surcharge": 10000
          },
          "expected": 103.81,
          "toleranceDecimalPlaces": 3,
          "unit": "kN/m",
          "confidence": "medium",
          "steps": [
            {
              "label": "At-rest coefficient K0",
              "value": 0.5
            },
            {
              "label": "Soil pressure at the base",
              "value": 33.19,
              "unit": "kN/m²"
            },
            {
              "label": "Water pressure at the base",
              "value": 19.62,
              "unit": "kN/m²"
            },
            {
              "label": "Total pressure at the base",
              "value": 52.81,
              "unit": "kN/m²"
            },
            {
              "label": "Soil thrust per unit run",
              "value": 84.19,
              "unit": "kN/m"
            },
            {
              "label": "Water thrust per unit run",
              "value": 19.62,
              "unit": "kN/m"
            },
            {
              "label": "Height of the resultant above the base",
              "value": 1.3859294223420993,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Overconsolidated fill, OCR 2",
          "inputs": {
            "retainedHeight": 3,
            "coefficientSource": "at-rest",
            "frictionAngle": 30,
            "overconsolidationRatio": 2,
            "coefficient": 0.5,
            "moistUnitWeight": 19,
            "saturatedUnitWeight": 20,
            "waterTableDepth": 3,
            "surcharge": 0
          },
          "expected": 60.4576,
          "toleranceDecimalPlaces": 3,
          "unit": "kN/m",
          "confidence": "medium",
          "steps": [
            {
              "label": "At-rest coefficient K0",
              "value": 0.7071067811865476
            },
            {
              "label": "Soil pressure at the base",
              "value": 40.305086527633215,
              "unit": "kN/m²"
            },
            {
              "label": "Water pressure at the base",
              "value": 0,
              "unit": "kN/m²"
            },
            {
              "label": "Total pressure at the base",
              "value": 40.305086527633215,
              "unit": "kN/m²"
            },
            {
              "label": "Soil thrust per unit run",
              "value": 60.45762979144981,
              "unit": "kN/m"
            },
            {
              "label": "Water thrust per unit run",
              "value": 0,
              "unit": "kN/m"
            },
            {
              "label": "Height of the resultant above the base",
              "value": 1,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "basement-waterproofing-coating-calculator",
      "title": "Basement Wall Waterproofing Coating Coverage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/basement-waterproofing-coating-calculator/",
      "sources": [
        "Material needed = (area ÷ coverage rate per coat) × number of coats, the standard multi-coat coverage method"
      ],
      "vectors": [
        {
          "name": "60m² wall, 6 m²/L, 2 coats",
          "inputs": {
            "area": 60,
            "coverageRate": 6,
            "numberOfCoats": 2
          },
          "expected": 20,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "80m² wall, 7 m²/L, 2 coats",
          "inputs": {
            "area": 80,
            "coverageRate": 7,
            "numberOfCoats": 2
          },
          "expected": 22.86,
          "toleranceDecimalPlaces": 1,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "baseplate-anchor-grout-calculator",
      "title": "Baseplate Anchor Bolt Count & Grout Pocket Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/baseplate-anchor-grout-calculator/",
      "sources": [
        "Anchor bolt tension is governed by the lowest of several ACI 318 Chapter 17 strength limit states (steel strength, concrete breakout, pullout) — this calculator divides the total required uplift load by your own anchor's governing rated tensile capacity; grout pocket volume follows AISC Design Guide 1 practice: plate footprint × grout thickness"
      ],
      "vectors": [
        {
          "name": "200kN uplift, 50kN/anchor, 0.36m² plate, 38mm grout",
          "inputs": {
            "upliftLoad": 200000,
            "perAnchorCapacity": 50000,
            "plateArea": 0.36,
            "groutThickness": 0.038
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "anchors",
          "confidence": "medium",
          "steps": [
            {
              "label": "Grout pocket volume",
              "value": 13.68,
              "unit": "L"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "350kN uplift, 60kN/anchor, 0.49m² plate, 50mm grout",
          "inputs": {
            "upliftLoad": 350000,
            "perAnchorCapacity": 60000,
            "plateArea": 0.49,
            "groutThickness": 0.05
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "anchors",
          "confidence": "medium",
          "steps": [
            {
              "label": "Grout pocket volume",
              "value": 24.5,
              "unit": "L"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "baseplate-pier-size-calculator",
      "title": "Column Pier Size from Baseplate Edge Distance Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/baseplate-pier-size-calculator/",
      "sources": [
        "Pier plan size = plate dimension + 2 × the edge distance wanted on each side; concrete volume = pier length × pier width × pier height × the number of piers, plus a waste allowance",
        "The margin of concrete outside a baseplate is set by the anchor's edge-distance requirement and by the bearing assumption the plate was designed on — both come from the design, not from this page"
      ],
      "vectors": [
        {
          "name": "Four 400 mm square plates, 100 mm margin, 900 mm piers, 8% waste",
          "inputs": {
            "plateLength": 0.4,
            "plateWidth": 0.4,
            "edgeDistance": 0.1,
            "pierHeight": 0.9,
            "pierCount": 4,
            "wasteAllowance": 8
          },
          "expected": 1.39968,
          "toleranceDecimalPlaces": 3,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Pier length",
              "value": 600.0000000000001,
              "unit": "mm"
            },
            {
              "label": "Pier width",
              "value": 600.0000000000001,
              "unit": "mm"
            },
            {
              "label": "Plan area of one pier",
              "value": 0.3600000000000001,
              "unit": "m²"
            },
            {
              "label": "Volume per pier",
              "value": 0.3240000000000001,
              "unit": "m³"
            },
            {
              "label": "Base volume before waste",
              "value": 1.2960000000000005,
              "unit": "m³"
            }
          ],
          "includesAllowance": {
            "label": "Form loss and over-break allowance",
            "percent": 8
          },
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "One rectangular plate, 75 mm margin, 1.2 m pier, no waste",
          "inputs": {
            "plateLength": 0.5,
            "plateWidth": 0.3,
            "edgeDistance": 0.075,
            "pierHeight": 1.2,
            "pierCount": 1,
            "wasteAllowance": 0
          },
          "expected": 0.351,
          "toleranceDecimalPlaces": 4,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Pier length",
              "value": 650,
              "unit": "mm"
            },
            {
              "label": "Pier width",
              "value": 449.99999999999994,
              "unit": "mm"
            },
            {
              "label": "Plan area of one pier",
              "value": 0.2925,
              "unit": "m²"
            },
            {
              "label": "Volume per pier",
              "value": 0.351,
              "unit": "m³"
            },
            {
              "label": "Base volume before waste",
              "value": 0.351,
              "unit": "m³"
            }
          ],
          "includesAllowance": {
            "label": "Form loss and over-break allowance",
            "percent": 0
          },
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "bathroom-extract-rate-calculator",
      "title": "Bathroom Extract Fan Rate and Duct Resistance Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/bathroom-extract-rate-calculator/",
      "sources": [
        "Required extract flow is the room volume multiplied by the target air changes per hour, divided by 3.6 to convert cubic metres per hour into litres per second",
        "A fan's quoted flow is measured at zero static pressure — free air, with no duct attached — so it is an upper bound rather than a delivered rate, and the difference on a real run is substantial",
        "Duct fittings are costed as an equivalent length of the same straight duct; a bend in corrugated flexible duct is worth considerably more than the same bend in rigid, because the inner wall compresses as it turns"
      ],
      "vectors": [
        {
          "name": "6 m² room at 2.4 m, 8 air changes",
          "inputs": {
            "floorArea": 6,
            "ceilingHeight": 2.4,
            "airChanges": 8,
            "ductLength": 3,
            "bends": 2,
            "ductType": "flexible"
          },
          "expected": 67.804,
          "toleranceDecimalPlaces": 2,
          "unit": "CFM",
          "confidence": "medium",
          "steps": [
            {
              "label": "Room volume",
              "value": 508.5312007894356,
              "unit": "cu ft"
            },
            {
              "label": "Equivalent duct length",
              "value": 26.246719160104984,
              "unit": "ft"
            },
            {
              "label": "Each bend is worth",
              "value": 8.202099737532809,
              "unit": "ft of duct"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The same room at 15 air changes, as a shower room",
          "inputs": {
            "floorArea": 6,
            "ceilingHeight": 2.4,
            "airChanges": 15,
            "ductLength": 3,
            "bends": 2,
            "ductType": "flexible"
          },
          "expected": 127.133,
          "toleranceDecimalPlaces": 2,
          "unit": "CFM",
          "confidence": "medium",
          "steps": [
            {
              "label": "Room volume",
              "value": 508.5312007894356,
              "unit": "cu ft"
            },
            {
              "label": "Equivalent duct length",
              "value": 26.246719160104984,
              "unit": "ft"
            },
            {
              "label": "Each bend is worth",
              "value": 8.202099737532809,
              "unit": "ft of duct"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Rigid duct changes the resistance, not the requirement",
          "inputs": {
            "floorArea": 6,
            "ceilingHeight": 2.4,
            "airChanges": 8,
            "ductLength": 3,
            "bends": 2,
            "ductType": "rigid"
          },
          "expected": 67.804,
          "toleranceDecimalPlaces": 2,
          "unit": "CFM",
          "confidence": "medium",
          "steps": [
            {
              "label": "Room volume",
              "value": 508.5312007894356,
              "unit": "cu ft"
            },
            {
              "label": "Equivalent duct length",
              "value": 16.404199475065617,
              "unit": "ft"
            },
            {
              "label": "Each bend is worth",
              "value": 3.280839895013123,
              "unit": "ft of duct"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "bathroom-remodel-cost-calculator",
      "title": "Bathroom Remodel Cost Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/bathroom-remodel-cost-calculator/",
      "sources": [
        "Element-based estimating; rates are user-supplied. No market data is embedded.",
        "Fixtures are priced per point (supply, waste and fitting); waterproofing and tiling per square metre"
      ],
      "vectors": [
        {
          "name": "A fully priced four-fixture bathroom",
          "inputs": {
            "fixtureCount": 4,
            "fixtureRate": 850,
            "tiledArea": 22,
            "tilingRate": 130,
            "waterproofedArea": 8,
            "waterproofingRate": 55,
            "ventilationAllowance": 450,
            "otherAllowance": 900,
            "contingencyPercent": 15
          },
          "expected": 9257.5,
          "toleranceDecimalPlaces": 2,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Fixtures",
              "value": 3400,
              "unit": "currency"
            },
            {
              "label": "Tiling",
              "value": 2860,
              "unit": "currency"
            },
            {
              "label": "Waterproofing",
              "value": 440,
              "unit": "currency"
            },
            {
              "label": "Ventilation",
              "value": 450,
              "unit": "currency"
            },
            {
              "label": "Electrics and finishes",
              "value": 900,
              "unit": "currency"
            },
            {
              "label": "Contingency",
              "value": 1207.5,
              "unit": "currency"
            },
            {
              "label": "Cost per fixture",
              "value": 2314.375,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Fixtures only",
          "inputs": {
            "fixtureCount": 4,
            "fixtureRate": 850,
            "tiledArea": 0,
            "tilingRate": 130,
            "waterproofedArea": 0,
            "waterproofingRate": 55,
            "ventilationAllowance": 0,
            "otherAllowance": 0,
            "contingencyPercent": 0
          },
          "expected": 3400,
          "toleranceDecimalPlaces": 2,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Fixtures",
              "value": 3400,
              "unit": "currency"
            },
            {
              "label": "Tiling",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Waterproofing",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Ventilation",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Electrics and finishes",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Contingency",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Cost per fixture",
              "value": 850,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A larger wet room, everything tanked",
          "inputs": {
            "fixtureCount": 4,
            "fixtureRate": 850,
            "tiledArea": 35,
            "tilingRate": 130,
            "waterproofedArea": 35,
            "waterproofingRate": 55,
            "ventilationAllowance": 450,
            "otherAllowance": 900,
            "contingencyPercent": 15
          },
          "expected": 12908.75,
          "toleranceDecimalPlaces": 2,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Fixtures",
              "value": 3400,
              "unit": "currency"
            },
            {
              "label": "Tiling",
              "value": 4550,
              "unit": "currency"
            },
            {
              "label": "Waterproofing",
              "value": 1925,
              "unit": "currency"
            },
            {
              "label": "Ventilation",
              "value": 450,
              "unit": "currency"
            },
            {
              "label": "Electrics and finishes",
              "value": 900,
              "unit": "currency"
            },
            {
              "label": "Contingency",
              "value": 1683.75,
              "unit": "currency"
            },
            {
              "label": "Cost per fixture",
              "value": 3227.1875,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Zero rates give zero",
          "inputs": {
            "fixtureCount": 4,
            "fixtureRate": 0,
            "tiledArea": 22,
            "tilingRate": 0,
            "waterproofedArea": 8,
            "waterproofingRate": 0,
            "ventilationAllowance": 0,
            "otherAllowance": 0,
            "contingencyPercent": 15
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Fixtures",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Tiling",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Waterproofing",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Ventilation",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Electrics and finishes",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Contingency",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Cost per fixture",
              "value": 0,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "battery-backup-runtime-calculator",
      "title": "Battery Backup Runtime Calculator",
      "url": "https://craftquantities.com/calculators/solar-energy/battery-backup-runtime-calculator/",
      "sources": [
        "Runtime (hours) = (battery capacity in watt-hours x system efficiency) / load in watts"
      ],
      "vectors": [
        {
          "name": "2000Wh battery, 300W load, 85% efficiency",
          "inputs": {
            "batteryCapacityWh": 2000,
            "loadWatts": 300,
            "systemEfficiencyPercent": 85
          },
          "expected": 5.667,
          "toleranceDecimalPlaces": 3,
          "unit": "hours",
          "confidence": "medium",
          "steps": [
            {
              "label": "Usable energy",
              "value": 1700,
              "unit": "Wh"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "5000Wh battery, 500W load, 90% efficiency",
          "inputs": {
            "batteryCapacityWh": 5000,
            "loadWatts": 500,
            "systemEfficiencyPercent": 90
          },
          "expected": 9,
          "toleranceDecimalPlaces": 0,
          "unit": "hours",
          "confidence": "medium",
          "steps": [
            {
              "label": "Usable energy",
              "value": 4500,
              "unit": "Wh"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "battery-bank-sizing-calculator",
      "title": "Battery Bank Sizing Calculator",
      "url": "https://craftquantities.com/calculators/solar-energy/battery-bank-sizing-calculator/",
      "sources": [
        "Usable capacity = nameplate × depth of discharge × round-trip efficiency. Lithium iron phosphate DoD 80-100%; lead-acid 50% to preserve cycle life",
        "Round-trip efficiency: LiFePO₄ 90-95%; flooded lead-acid 75-85% — manufacturer datasheets"
      ],
      "vectors": [
        {
          "name": "10 kWh/day, 1 day, LiFePO₄",
          "inputs": {
            "dailyLoadKwh": 10,
            "autonomyDays": 1,
            "chemistry": "lifepo4"
          },
          "expected": 11.7,
          "toleranceDecimalPlaces": 1,
          "unit": "kWh nameplate",
          "confidence": "medium",
          "steps": [
            {
              "label": "Energy required at the load",
              "value": 10,
              "unit": "kWh"
            },
            {
              "label": "Usable share of nameplate",
              "value": 85.5,
              "unit": "%"
            },
            {
              "label": "Depth of discharge",
              "value": 90,
              "unit": "%"
            },
            {
              "label": "Round-trip efficiency",
              "value": 95,
              "unit": "%"
            },
            {
              "label": "At 48 V nominal",
              "value": 243.66471734892787,
              "unit": "Ah"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Lead-acid needs more than twice as much",
          "inputs": {
            "dailyLoadKwh": 10,
            "autonomyDays": 1,
            "chemistry": "flooded"
          },
          "expected": 25,
          "toleranceDecimalPlaces": 0,
          "unit": "kWh nameplate",
          "confidence": "medium",
          "steps": [
            {
              "label": "Energy required at the load",
              "value": 10,
              "unit": "kWh"
            },
            {
              "label": "Usable share of nameplate",
              "value": 40,
              "unit": "%"
            },
            {
              "label": "Depth of discharge",
              "value": 50,
              "unit": "%"
            },
            {
              "label": "Round-trip efficiency",
              "value": 80,
              "unit": "%"
            },
            {
              "label": "At 48 V nominal",
              "value": 520.8333333333334,
              "unit": "Ah"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Three days of autonomy triples it",
          "inputs": {
            "dailyLoadKwh": 10,
            "autonomyDays": 3,
            "chemistry": "lifepo4"
          },
          "expected": 35.09,
          "toleranceDecimalPlaces": 1,
          "unit": "kWh nameplate",
          "confidence": "medium",
          "steps": [
            {
              "label": "Energy required at the load",
              "value": 30,
              "unit": "kWh"
            },
            {
              "label": "Usable share of nameplate",
              "value": 85.5,
              "unit": "%"
            },
            {
              "label": "Depth of discharge",
              "value": 90,
              "unit": "%"
            },
            {
              "label": "Round-trip efficiency",
              "value": 95,
              "unit": "%"
            },
            {
              "label": "At 48 V nominal",
              "value": 730.9941520467837,
              "unit": "Ah"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A smaller load scales down",
          "inputs": {
            "dailyLoadKwh": 2,
            "autonomyDays": 1,
            "chemistry": "lifepo4"
          },
          "expected": 2.34,
          "toleranceDecimalPlaces": 1,
          "unit": "kWh nameplate",
          "confidence": "medium",
          "steps": [
            {
              "label": "Energy required at the load",
              "value": 2,
              "unit": "kWh"
            },
            {
              "label": "Usable share of nameplate",
              "value": 85.5,
              "unit": "%"
            },
            {
              "label": "Depth of discharge",
              "value": 90,
              "unit": "%"
            },
            {
              "label": "Round-trip efficiency",
              "value": 95,
              "unit": "%"
            },
            {
              "label": "At 48 V nominal",
              "value": 48.732943469785575,
              "unit": "Ah"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "beam-point-load-moment-calculator",
      "title": "Beam and Joist Point Load Moment Calculator (Equivalent UDL)",
      "url": "https://craftquantities.com/calculators/materials-quantities/beam-point-load-moment-calculator/",
      "sources": [
        "Simply supported beam (AISC Steel Construction Manual, Table 3-23, beam diagrams 1 and 7): a uniform load w gives R = wL/2 at each end and M = wL²/8 at mid-span; a point load P at a from one end and b from the other gives R1 = Pb/L, R2 = Pa/L and M = Pab/L under the load; combined, the moment peaks where the shear crosses zero",
        "The uniform load giving the same peak moment as the point load alone: w = 8Pab ÷ L³, which is 2P ÷ L for a load at mid-span"
      ],
      "vectors": [
        {
          "name": "A 10 kN point load at the middle of a 4 m span",
          "inputs": {
            "span": 4,
            "uniformLoad": 0,
            "pointLoad": 10000,
            "loadPosition": 2
          },
          "expected": 10,
          "toleranceDecimalPlaces": 3,
          "unit": "kN·m",
          "confidence": "high",
          "steps": [
            {
              "label": "Where the moment peaks, from the left support",
              "value": 2,
              "unit": "m"
            },
            {
              "label": "Left reaction",
              "value": 5,
              "unit": "kN"
            },
            {
              "label": "Right reaction",
              "value": 5,
              "unit": "kN"
            },
            {
              "label": "Moment from the point load alone",
              "value": 10,
              "unit": "kN·m"
            },
            {
              "label": "Uniform load that bends the beam as much as the point load",
              "value": 5,
              "unit": "kN/m"
            },
            {
              "label": "End shear the point load puts into the nearer support",
              "value": 5,
              "unit": "kN"
            },
            {
              "label": "End shear the equivalent uniform load gives",
              "value": 10,
              "unit": "kN"
            },
            {
              "label": "The two maxima added (safe-side shortcut)",
              "value": 10,
              "unit": "kN·m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The same load 1 m from a support",
          "inputs": {
            "span": 4,
            "uniformLoad": 0,
            "pointLoad": 10000,
            "loadPosition": 1
          },
          "expected": 7.5,
          "toleranceDecimalPlaces": 3,
          "unit": "kN·m",
          "confidence": "high",
          "steps": [
            {
              "label": "Where the moment peaks, from the left support",
              "value": 1,
              "unit": "m"
            },
            {
              "label": "Left reaction",
              "value": 7.5,
              "unit": "kN"
            },
            {
              "label": "Right reaction",
              "value": 2.5,
              "unit": "kN"
            },
            {
              "label": "Moment from the point load alone",
              "value": 7.5,
              "unit": "kN·m"
            },
            {
              "label": "Uniform load that bends the beam as much as the point load",
              "value": 3.75,
              "unit": "kN/m"
            },
            {
              "label": "End shear the point load puts into the nearer support",
              "value": 7.5,
              "unit": "kN"
            },
            {
              "label": "End shear the equivalent uniform load gives",
              "value": 7.5,
              "unit": "kN"
            },
            {
              "label": "The two maxima added (safe-side shortcut)",
              "value": 7.5,
              "unit": "kN·m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "2 kN/m plus 10 kN at mid-span: the maxima coincide",
          "inputs": {
            "span": 4,
            "uniformLoad": 2000,
            "pointLoad": 10000,
            "loadPosition": 2
          },
          "expected": 14,
          "toleranceDecimalPlaces": 3,
          "unit": "kN·m",
          "confidence": "high",
          "steps": [
            {
              "label": "Where the moment peaks, from the left support",
              "value": 2,
              "unit": "m"
            },
            {
              "label": "Left reaction",
              "value": 9,
              "unit": "kN"
            },
            {
              "label": "Right reaction",
              "value": 9,
              "unit": "kN"
            },
            {
              "label": "Moment from the point load alone",
              "value": 10,
              "unit": "kN·m"
            },
            {
              "label": "Uniform load that bends the beam as much as the point load",
              "value": 5,
              "unit": "kN/m"
            },
            {
              "label": "End shear the point load puts into the nearer support",
              "value": 5,
              "unit": "kN"
            },
            {
              "label": "End shear the equivalent uniform load gives",
              "value": 10,
              "unit": "kN"
            },
            {
              "label": "The two maxima added (safe-side shortcut)",
              "value": 14,
              "unit": "kN·m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "2 kN/m plus 10 kN at 1 m: the exact peak is below the sum of the two maxima",
          "inputs": {
            "span": 4,
            "uniformLoad": 2000,
            "pointLoad": 10000,
            "loadPosition": 1
          },
          "expected": 10.5,
          "toleranceDecimalPlaces": 3,
          "unit": "kN·m",
          "confidence": "high",
          "steps": [
            {
              "label": "Where the moment peaks, from the left support",
              "value": 1,
              "unit": "m"
            },
            {
              "label": "Left reaction",
              "value": 11.5,
              "unit": "kN"
            },
            {
              "label": "Right reaction",
              "value": 6.5,
              "unit": "kN"
            },
            {
              "label": "Moment from the point load alone",
              "value": 7.5,
              "unit": "kN·m"
            },
            {
              "label": "Uniform load that bends the beam as much as the point load",
              "value": 3.75,
              "unit": "kN/m"
            },
            {
              "label": "End shear the point load puts into the nearer support",
              "value": 7.5,
              "unit": "kN"
            },
            {
              "label": "End shear the equivalent uniform load gives",
              "value": 7.5,
              "unit": "kN"
            },
            {
              "label": "The two maxima added (safe-side shortcut)",
              "value": 11.5,
              "unit": "kN·m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "bentonite-swell-calculator",
      "title": "Bentonite Waterproofing Swell Thickness Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/bentonite-swell-calculator/",
      "sources": [
        "Dry bentonite layer thickness = bentonite content per area ÷ dry density; hydrated bentonite clay swells dramatically when wetted (commonly cited swell factors of roughly 10-15x by volume) to form a self-healing, low-permeability gel that seals small punctures and cracks"
      ],
      "vectors": [
        {
          "name": "5 kg/m², 800 kg/m³ dry density, 10x swell",
          "inputs": {
            "bentoniteContent": 5,
            "dryDensity": 800,
            "swellFactor": 10
          },
          "expected": 62.5,
          "toleranceDecimalPlaces": 1,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Dry (unhydrated) thickness",
              "value": 6.25,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "6 kg/m², 850 kg/m³ dry density, 12x swell",
          "inputs": {
            "bentoniteContent": 6,
            "dryDensity": 850,
            "swellFactor": 12
          },
          "expected": 84.71,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Dry (unhydrated) thickness",
              "value": 7.058823529411765,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "birds-mouth-cut-calculator",
      "title": "Rafter Bird's Mouth Cut Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/birds-mouth-cut-calculator/",
      "sources": [
        "Standard carpentry bird's mouth layout: seat cut length equals the wall plate width; heel cut height = wall plate width × tan(roof pitch angle)"
      ],
      "vectors": [
        {
          "name": "3.5in plate, 6/12 pitch",
          "inputs": {
            "wallPlateWidth": 0.0889,
            "roofPitch": 6
          },
          "expected": 1.75,
          "toleranceDecimalPlaces": 2,
          "unit": "in",
          "confidence": "high",
          "steps": [
            {
              "label": "Seat cut length (= plate width)",
              "value": 3.5000000000000004,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "3.5in plate, 8/12 pitch",
          "inputs": {
            "wallPlateWidth": 0.0889,
            "roofPitch": 8
          },
          "expected": 2.333,
          "toleranceDecimalPlaces": 3,
          "unit": "in",
          "confidence": "high",
          "steps": [
            {
              "label": "Seat cut length (= plate width)",
              "value": 3.5000000000000004,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "blast-glazing-rating-checker",
      "title": "Blast-Resistant Fenestration Rating Checker",
      "url": "https://craftquantities.com/calculators/materials-quantities/blast-glazing-rating-checker/",
      "sources": [
        "Full blast-resistant glazing design (dynamic rebound, pressure-impulse response) requires specialized SDOF/finite-element software (WINGARD, HazL) per UFC 3-340-02/ASTM F2248 — it cannot be reduced to a simple formula. This tool instead compares a glazing's already-published ASTM F1642/GSA hazard rating against the project's required performance condition, both on the standard GSA scale where a LOWER number is better (1 = best/no hazard, 5 = worst)"
      ],
      "vectors": [
        {
          "name": "Achieved 2, required 3 (pass)",
          "inputs": {
            "achievedCondition": 2,
            "requiredCondition": 3
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "GSA Condition",
          "confidence": "medium",
          "steps": [
            {
              "label": "Required condition",
              "value": 3,
              "unit": "GSA Condition"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Achieved 4, required 3 (fail)",
          "inputs": {
            "achievedCondition": 4,
            "requiredCondition": 3
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "GSA Condition",
          "confidence": "medium",
          "steps": [
            {
              "label": "Required condition",
              "value": 3,
              "unit": "GSA Condition"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "block-filler-coverage-calculator",
      "title": "Block Filler Coverage Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/block-filler-coverage-calculator/",
      "sources": [
        "Material = area ÷ (rated spread rate ÷ texture multiplier), then the waste allowance. The texture multipliers are a STATED RULE OF THUMB, not a published table — where a product's data sheet gives its own coarse-block coverage, enter that figure and set the texture to smooth so no multiplier is applied.",
        "ASTM D4258, Standard Practice for Surface Cleaning Concrete for Coating, and ASTM D4259, Standard Practice for Abrading Concrete — the preparation a quoted spread rate assumes has been done"
      ],
      "vectors": [
        {
          "name": "90 m² of medium block at the default rate",
          "inputs": {
            "netWallArea": 90,
            "ratedSpreadRate": 8.6,
            "textureClass": "medium",
            "wasteAllowance": 10
          },
          "expected": 28.7791,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Effective spread rate over this block face",
              "value": 3.44,
              "unit": "m²/L"
            },
            {
              "label": "Quantity before the waste allowance",
              "value": 26.16279069767442,
              "unit": "L"
            },
            {
              "label": "Absorption multiplier applied",
              "value": 2.5,
              "unit": "x rated rate"
            }
          ],
          "includesAllowance": {
            "label": "Waste and touch-up allowance",
            "percent": 10
          },
          "basis": "ambiguous"
        },
        {
          "name": "45 m² of open block, no waste allowance",
          "inputs": {
            "netWallArea": 45,
            "ratedSpreadRate": 8.6,
            "textureClass": "open",
            "wasteAllowance": 0
          },
          "expected": 20.9302,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Effective spread rate over this block face",
              "value": 2.15,
              "unit": "m²/L"
            },
            {
              "label": "Quantity before the waste allowance",
              "value": 20.930232558139537,
              "unit": "L"
            },
            {
              "label": "Absorption multiplier applied",
              "value": 4,
              "unit": "x rated rate"
            }
          ],
          "includesAllowance": {
            "label": "Waste and touch-up allowance",
            "percent": 0
          },
          "basis": "ambiguous"
        },
        {
          "name": "Smooth substrate leaves the rated rate untouched",
          "inputs": {
            "netWallArea": 90,
            "ratedSpreadRate": 8.6,
            "textureClass": "smooth",
            "wasteAllowance": 10
          },
          "expected": 11.5116,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Effective spread rate over this block face",
              "value": 8.6,
              "unit": "m²/L"
            },
            {
              "label": "Quantity before the waste allowance",
              "value": 10.465116279069768,
              "unit": "L"
            },
            {
              "label": "Absorption multiplier applied",
              "value": 1,
              "unit": "x rated rate"
            }
          ],
          "includesAllowance": {
            "label": "Waste and touch-up allowance",
            "percent": 10
          },
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "blower-door-cfm-target-calculator",
      "title": "Blower Door CFM50 Target Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/blower-door-cfm-target-calculator/",
      "sources": [
        "Standard blower door formula rearranged: target CFM50 = (target ACH50 x building volume in cubic feet) / 60"
      ],
      "vectors": [
        {
          "name": "100m² home, 2.4m ceilings, target ACH50=3",
          "inputs": {
            "floorArea": 100,
            "ceilingHeight": 2.4,
            "targetAch50": 3
          },
          "expected": 423.79,
          "toleranceDecimalPlaces": 1,
          "unit": "CFM50 (target maximum)",
          "confidence": "high",
          "steps": [
            {
              "label": "Building volume",
              "value": 8475.52001315726,
              "unit": "ft³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150m² home, 2.7m ceilings, target ACH50=5",
          "inputs": {
            "floorArea": 150,
            "ceilingHeight": 2.7,
            "targetAch50": 5
          },
          "expected": 1192.05,
          "toleranceDecimalPlaces": 0,
          "unit": "CFM50 (target maximum)",
          "confidence": "high",
          "steps": [
            {
              "label": "Building volume",
              "value": 14302.440022202878,
              "unit": "ft³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "blown-insulation-bag-calculator",
      "title": "Blown-In Insulation Bag Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/blown-insulation-bag-calculator/",
      "sources": [
        "Bags needed = ceil(required volume ÷ the bag's rated coverage yield at the installed density), the standard method for estimating blown-in (loose-fill) insulation material from the manufacturer's bag coverage chart"
      ],
      "vectors": [
        {
          "name": "100m² area, 0.3m depth, 2.6m³/bag",
          "inputs": {
            "area": 100,
            "depth": 0.3,
            "bagYield": 2.6
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "bags",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total insulation volume",
              "value": 30,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150m² area, 0.35m depth, 2.6m³/bag",
          "inputs": {
            "area": 150,
            "depth": 0.35,
            "bagYield": 2.6
          },
          "expected": 21,
          "toleranceDecimalPlaces": 0,
          "unit": "bags",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total insulation volume",
              "value": 52.5,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "board-and-batten-siding-calculator",
      "title": "Board and Batten Siding Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/board-and-batten-siding-calculator/",
      "sources": [
        "Board count = wall width / board width, rounded up; batten count = board count + 1, since a batten covers each seam including the two outer edges"
      ],
      "vectors": [
        {
          "name": "6m wall, 10in boards",
          "inputs": {
            "wallWidth": 6,
            "boardWidth": 0.254
          },
          "expected": 24,
          "toleranceDecimalPlaces": 0,
          "unit": "boards",
          "confidence": "high",
          "steps": [
            {
              "label": "Battens needed",
              "value": 25,
              "unit": "battens"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "9m wall, 10in boards",
          "inputs": {
            "wallWidth": 9,
            "boardWidth": 0.254
          },
          "expected": 36,
          "toleranceDecimalPlaces": 0,
          "unit": "boards",
          "confidence": "high",
          "steps": [
            {
              "label": "Battens needed",
              "value": 37,
              "unit": "battens"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "board-feet-calculator",
      "title": "Board Feet Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/board-feet-calculator/",
      "sources": [
        "Standard formula: board feet = (thickness in inches x width in inches x length in feet) / 12"
      ],
      "vectors": [
        {
          "name": "1x6x8 board, quantity 1",
          "inputs": {
            "thicknessIn": 0.0254,
            "widthIn": 0.1524,
            "lengthFt": 2.4384,
            "quantity": 1
          },
          "expected": 4,
          "toleranceDecimalPlaces": 2,
          "unit": "board feet",
          "confidence": "high",
          "steps": [
            {
              "label": "Per board",
              "value": 4.000000000000001,
              "unit": "board ft"
            },
            {
              "label": "Number of boards",
              "value": 1,
              "unit": "boards"
            },
            {
              "label": "Cubic feet (total)",
              "value": 0.3333333333333334,
              "unit": "cu ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2x8x10 boards, quantity 20",
          "inputs": {
            "thicknessIn": 0.0508,
            "widthIn": 0.2032,
            "lengthFt": 3.048,
            "quantity": 20
          },
          "expected": 266.67,
          "toleranceDecimalPlaces": 1,
          "unit": "board feet",
          "confidence": "high",
          "steps": [
            {
              "label": "Per board",
              "value": 13.333333333333334,
              "unit": "board ft"
            },
            {
              "label": "Number of boards",
              "value": 20,
              "unit": "boards"
            },
            {
              "label": "Cubic feet (total)",
              "value": 22.222222222222225,
              "unit": "cu ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "board-feet-to-cubic-feet-calculator",
      "title": "Board Feet to Cubic Feet Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/board-feet-to-cubic-feet-calculator/",
      "sources": [
        "1 board foot = 144 cubic inches = 1/12 cubic foot",
        "Board footage is calculated on NOMINAL dimensions, not the actual dressed size"
      ],
      "vectors": [
        {
          "name": "100 bd ft converts correctly",
          "inputs": {
            "boardFeet": 100
          },
          "expected": 8.333333333333332,
          "toleranceDecimalPlaces": 6,
          "unit": "cu ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.08333333333333333,
              "unit": "cu ft per bd ft"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "boardFeet": 1000
          },
          "expected": 83.33333333333333,
          "toleranceDecimalPlaces": 6,
          "unit": "cu ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.08333333333333333,
              "unit": "cu ft per bd ft"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "board-foot-calculator",
      "title": "Board Foot Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/board-foot-calculator/",
      "sources": [
        "1 board foot = 144 in³ — nominally 1 in thick by 12 in wide by 1 ft long",
        "NHLA Rules for the Measurement and Inspection of Hardwood — board footage is measured on nominal thickness before surfacing"
      ],
      "vectors": [
        {
          "name": "1 × 6 × 8 ft is 4 board feet",
          "inputs": {
            "thicknessIn": 0.0254,
            "widthIn": 0.1524,
            "lengthFt": 2.4384,
            "quantity": 1
          },
          "expected": 4,
          "toleranceDecimalPlaces": 1,
          "unit": "board feet",
          "confidence": "high",
          "steps": [
            {
              "label": "Per board",
              "value": 4.000000000000001,
              "unit": "bf"
            },
            {
              "label": "Cubic feet",
              "value": 0.3333333333333334,
              "unit": "ft³"
            },
            {
              "label": "Cubic metres",
              "value": 0.009438948864000003,
              "unit": "m³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "1 in × 12 in × 1 ft is exactly 1 bf",
          "inputs": {
            "thicknessIn": 0.0254,
            "widthIn": 0.3048,
            "lengthFt": 0.3048,
            "quantity": 1
          },
          "expected": 1,
          "toleranceDecimalPlaces": 2,
          "unit": "board feet",
          "confidence": "high",
          "steps": [
            {
              "label": "Per board",
              "value": 1.0000000000000002,
              "unit": "bf"
            },
            {
              "label": "Cubic feet",
              "value": 0.08333333333333336,
              "unit": "ft³"
            },
            {
              "label": "Cubic metres",
              "value": 0.0023597372160000006,
              "unit": "m³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "8/4 stock doubles the footage",
          "inputs": {
            "thicknessIn": 0.0508,
            "widthIn": 0.1524,
            "lengthFt": 2.4384,
            "quantity": 1
          },
          "expected": 8,
          "toleranceDecimalPlaces": 6,
          "unit": "board feet",
          "confidence": "high",
          "steps": [
            {
              "label": "Per board",
              "value": 8.000000000000002,
              "unit": "bf"
            },
            {
              "label": "Cubic feet",
              "value": 0.6666666666666669,
              "unit": "ft³"
            },
            {
              "label": "Cubic metres",
              "value": 0.018877897728000005,
              "unit": "m³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Twelve boards",
          "inputs": {
            "thicknessIn": 0.0254,
            "widthIn": 0.1524,
            "lengthFt": 2.4384,
            "quantity": 12
          },
          "expected": 48,
          "toleranceDecimalPlaces": 0,
          "unit": "board feet",
          "confidence": "high",
          "steps": [
            {
              "label": "Per board",
              "value": 4.000000000000001,
              "unit": "bf"
            },
            {
              "label": "Cubic feet",
              "value": 4.000000000000001,
              "unit": "ft³"
            },
            {
              "label": "Cubic metres",
              "value": 0.11326738636800003,
              "unit": "m³"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "board-foot-lumber-cost-calculator",
      "title": "Board Foot Lumber Cost Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/board-foot-lumber-cost-calculator/",
      "sources": [
        "Total cost = board feet x price per board foot — hardwood and specialty lumber are commonly priced this way, unlike dimensional softwood which is usually priced per piece"
      ],
      "vectors": [
        {
          "name": "100 board ft at $3.50/bf",
          "inputs": {
            "boardFeet": 100,
            "pricePerBoardFoot": 3.5
          },
          "expected": 350,
          "toleranceDecimalPlaces": 0,
          "unit": "$",
          "confidence": "high",
          "steps": [
            {
              "label": "Board feet",
              "value": 100,
              "unit": "board feet"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "250 board ft at $4.25/bf",
          "inputs": {
            "boardFeet": 250,
            "pricePerBoardFoot": 4.25
          },
          "expected": 1062.5,
          "toleranceDecimalPlaces": 1,
          "unit": "$",
          "confidence": "high",
          "steps": [
            {
              "label": "Board feet",
              "value": 250,
              "unit": "board feet"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "boiler-makeup-water-calculator",
      "title": "Boiler Makeup Water Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/boiler-makeup-water-calculator/",
      "sources": [
        "Makeup water rate = system water volume × estimated loss rate percentage, a standard method for estimating the water treatment/makeup demand from typical system losses (minor leaks, air venting, maintenance draindowns)"
      ],
      "vectors": [
        {
          "name": "2000L system, 2% loss",
          "inputs": {
            "systemVolume": 2000,
            "lossRatePercent": 2
          },
          "expected": 40,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "3000L system, 1.5% loss",
          "inputs": {
            "systemVolume": 3000,
            "lossRatePercent": 1.5
          },
          "expected": 45,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "bollard-spacing-calculator",
      "title": "Security Bollard Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/bollard-spacing-calculator/",
      "sources": [
        "Bollard count = ceil(protected length ÷ bollard spacing) + 1, the standard layout method for spacing security/traffic bollards (commonly 1.2-1.5m o.c. to prevent vehicle passage)"
      ],
      "vectors": [
        {
          "name": "20m frontage, 1.5m spacing",
          "inputs": {
            "protectedLength": 20,
            "bollardSpacing": 1.5
          },
          "expected": 15,
          "toleranceDecimalPlaces": 0,
          "unit": "bollards",
          "confidence": "high",
          "steps": [
            {
              "label": "Bays between bollards",
              "value": 14
            },
            {
              "label": "Bollard centres, as installed",
              "value": 1.4285714285714286,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30m frontage, 1.4m spacing",
          "inputs": {
            "protectedLength": 30,
            "bollardSpacing": 1.4
          },
          "expected": 23,
          "toleranceDecimalPlaces": 0,
          "unit": "bollards",
          "confidence": "high",
          "steps": [
            {
              "label": "Bays between bollards",
              "value": 22
            },
            {
              "label": "Bollard centres, as installed",
              "value": 1.3636363636363635,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "bolt-group-shear-bearing-capacity-calculator",
      "title": "Bolt Group Shear, Bearing and Tearout Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/bolt-group-shear-bearing-capacity-calculator/",
      "sources": [
        "AISC 360, Specification for Structural Steel Buildings, Section J3.6 — nominal shear strength of a bolt is Fnv times the nominal bolt area, with Table J3.2 giving Fnv as 54 ksi for a Group A bolt with threads in the shear plane and 68 ksi with them excluded, and 68 ksi and 84 ksi respectively for Group B",
        "AISC 360, Section J3.10 — bearing at a bolt hole is 2.4·d·t·Fu and tearout is 1.2·lc·t·Fu where deformation at the hole is a design consideration, 3.0 and 1.5 where it is not, and 2.0 and 1.0 for a long-slotted hole with its slot perpendicular to the line of force. The resistance factor is 0.75.",
        "RCSC Specification for Structural Joints Using High-Strength Bolts — installation, joint type and faying surface condition; in a slip-critical joint the force crosses by friction before it reaches the shank and this check does not describe it",
        "ASTM F3125, Standard Specification for High Strength Structural Bolts and Assemblies — the grades behind the Group A and Group B designations. Hole size is left as a clearance input rather than assumed, because the standard hole table varies with bolt diameter."
      ],
      "vectors": [
        {
          "name": "Six 3/4 in Group A bolts, single shear, 1/2 in ply — the shank governs",
          "inputs": {
            "boltDiameter": 0.01905,
            "boltGrade": "a-n",
            "shearPlanes": 1,
            "boltCount": 6,
            "plyThickness": 0.0127,
            "holeClearance": 0.0015875,
            "tensileStrength": 448159000,
            "bearingCase": "deformation",
            "edgeDistance": 0.03175,
            "boltSpacing": 0.0762
          },
          "expected": 477.534879,
          "toleranceDecimalPlaces": 3,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Shear capacity of one bolt",
              "value": 79.58914651345212,
              "unit": "kN"
            },
            {
              "label": "Bearing capacity of one bolt",
              "value": 195.16562579700002,
              "unit": "kN"
            },
            {
              "label": "Tearout capacity at the end bolt",
              "value": 109.78066451081249,
              "unit": "kN"
            },
            {
              "label": "Tearout capacity at an interior bolt",
              "value": 284.6165376206249,
              "unit": "kN"
            },
            {
              "label": "Governing capacity of one bolt",
              "value": 79.58914651345212,
              "unit": "kN"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Eight Group B bolts in double shear — the plate governs instead",
          "inputs": {
            "boltDiameter": 0.01905,
            "boltGrade": "b-x",
            "shearPlanes": 2,
            "boltCount": 8,
            "plyThickness": 0.0127,
            "holeClearance": 0.0015875,
            "tensileStrength": 448159000,
            "bearingCase": "deformation",
            "edgeDistance": 0.03175,
            "boltSpacing": 0.0762
          },
          "expected": 878.245316,
          "toleranceDecimalPlaces": 3,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Shear capacity of one bolt",
              "value": 247.61067804185106,
              "unit": "kN"
            },
            {
              "label": "Bearing capacity of one bolt",
              "value": 195.16562579700002,
              "unit": "kN"
            },
            {
              "label": "Tearout capacity at the end bolt",
              "value": 109.78066451081249,
              "unit": "kN"
            },
            {
              "label": "Tearout capacity at an interior bolt",
              "value": 284.6165376206249,
              "unit": "kN"
            },
            {
              "label": "Governing capacity of one bolt",
              "value": 109.78066451081249,
              "unit": "kN"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Plate trimmed to a 3/4 in edge distance on a 1/4 in ply — tearout governs",
          "inputs": {
            "boltDiameter": 0.01905,
            "boltGrade": "a-n",
            "shearPlanes": 1,
            "boltCount": 6,
            "plyThickness": 0.00635,
            "holeClearance": 0.0015875,
            "tensileStrength": 448159000,
            "bearingCase": "deformation",
            "edgeDistance": 0.01905,
            "boltSpacing": 0.0762
          },
          "expected": 134.176368,
          "toleranceDecimalPlaces": 3,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Shear capacity of one bolt",
              "value": 79.58914651345212,
              "unit": "kN"
            },
            {
              "label": "Bearing capacity of one bolt",
              "value": 97.58281289850001,
              "unit": "kN"
            },
            {
              "label": "Tearout capacity at the end bolt",
              "value": 22.36272795590625,
              "unit": "kN"
            },
            {
              "label": "Tearout capacity at an interior bolt",
              "value": 142.30826881031246,
              "unit": "kN"
            },
            {
              "label": "Governing capacity of one bolt",
              "value": 22.36272795590625,
              "unit": "kN"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Generous edges on a thin ply — bearing governs",
          "inputs": {
            "boltDiameter": 0.01905,
            "boltGrade": "a-n",
            "shearPlanes": 1,
            "boltCount": 6,
            "plyThickness": 0.003,
            "holeClearance": 0.0015875,
            "tensileStrength": 448159000,
            "bearingCase": "deformation",
            "edgeDistance": 0.06,
            "boltSpacing": 0.15
          },
          "expected": 276.612698,
          "toleranceDecimalPlaces": 3,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Shear capacity of one bolt",
              "value": 79.58914651345212,
              "unit": "kN"
            },
            {
              "label": "Bearing capacity of one bolt",
              "value": 46.10211633,
              "unit": "kN"
            },
            {
              "label": "Tearout capacity at the end bolt",
              "value": 60.115768160624995,
              "unit": "kN"
            },
            {
              "label": "Tearout capacity at an interior bolt",
              "value": 156.53241532124997,
              "unit": "kN"
            },
            {
              "label": "Governing capacity of one bolt",
              "value": 46.10211633,
              "unit": "kN"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "boulder-weight-calculator",
      "title": "Boulder Weight Range Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/boulder-weight-calculator/",
      "sources": [
        "Volume is estimated as the bounding box times a SHAPE FACTOR. An ellipsoid fills π/6 ≈ 0.524 of its box, which anchors the rounded end; angular quarried stone retains more of its corners and fills more. The factor is given as a band because no measurement from outside resolves it",
        "Rock densities are the bands each type spans rather than single figures — granite roughly 2600 to 2800 kg/m³, basalt 2700 to 3100, limestone 2300 to 2700, sandstone 2000 to 2600. Porosity and weathering move a specimen within its band and cannot be seen from the surface",
        "THIS FIGURE IS NOT A LIFT PLAN. A lift is planned from a weighed load or from an engineered assumption carrying its own margin. Nothing estimated from outside a rock belongs in a comparison against a machine's rated capacity, which is why this page does not link to one"
      ],
      "vectors": [
        {
          "name": "a 1.2 x 0.9 x 0.7 m irregular granite boulder, upper end",
          "inputs": {
            "longAxis": 1.2,
            "midAxis": 0.9,
            "shortAxis": 0.7,
            "rockType": "granite",
            "shape": "irregular"
          },
          "expected": 3266.72,
          "toleranceDecimalPlaces": 0,
          "unit": "lb",
          "confidence": "low",
          "steps": [
            {
              "label": "Lower end of the range",
              "value": 2166.7031127529767,
              "unit": "lb"
            },
            {
              "label": "Upper end of the range",
              "value": 3266.7216161506417,
              "unit": "lb"
            },
            {
              "label": "Width of the range",
              "value": 50.76923076923078,
              "unit": "%"
            },
            {
              "label": "Bounding box, all three measurements",
              "value": 26.697888041445374,
              "unit": "ft³"
            },
            {
              "label": "Estimated rock volume, lower",
              "value": 13.348944020722687,
              "unit": "ft³"
            },
            {
              "label": "Estimated rock volume, upper",
              "value": 18.688521629011763,
              "unit": "ft³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "the same rock as basalt is markedly heavier",
          "inputs": {
            "longAxis": 1.2,
            "midAxis": 0.9,
            "shortAxis": 0.7,
            "rockType": "basalt",
            "shape": "irregular"
          },
          "expected": 3616.73,
          "toleranceDecimalPlaces": 0,
          "unit": "lb",
          "confidence": "low",
          "steps": [
            {
              "label": "Lower end of the range",
              "value": 2250.0378478588605,
              "unit": "lb"
            },
            {
              "label": "Upper end of the range",
              "value": 3616.7275035953535,
              "unit": "lb"
            },
            {
              "label": "Width of the range",
              "value": 60.74074074074074,
              "unit": "%"
            },
            {
              "label": "Bounding box, all three measurements",
              "value": 26.697888041445374,
              "unit": "ft³"
            },
            {
              "label": "Estimated rock volume, lower",
              "value": 13.348944020722687,
              "unit": "ft³"
            },
            {
              "label": "Estimated rock volume, upper",
              "value": 18.688521629011763,
              "unit": "ft³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "a rounded sandstone boulder of the same size, upper end",
          "inputs": {
            "longAxis": 1.2,
            "midAxis": 0.9,
            "shortAxis": 0.7,
            "rockType": "sandstone",
            "shape": "rounded"
          },
          "expected": 2600.04,
          "toleranceDecimalPlaces": 0,
          "unit": "lb",
          "confidence": "low",
          "steps": [
            {
              "label": "Lower end of the range",
              "value": 1500.0252319059068,
              "unit": "lb"
            },
            {
              "label": "Upper end of the range",
              "value": 2600.043735303572,
              "unit": "lb"
            },
            {
              "label": "Width of the range",
              "value": 73.33333333333333,
              "unit": "%"
            },
            {
              "label": "Bounding box, all three measurements",
              "value": 26.697888041445374,
              "unit": "ft³"
            },
            {
              "label": "Estimated rock volume, lower",
              "value": 12.014049618650418,
              "unit": "ft³"
            },
            {
              "label": "Estimated rock volume, upper",
              "value": 16.018732824867225,
              "unit": "ft³"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "box-fill-calculator",
      "title": "Electrical Box Fill Calculator (NEC 314.16, US)",
      "url": "https://craftquantities.com/calculators/electrical/box-fill-calculator/",
      "sources": [
        "City of Republic, Missouri, Community Development Department, Electrical Box Fill Calculations (revised December 2016): 2012 IRC Table E3905.12.2.1, the volume allowance per conductor — 18 AWG 1.50, 16 AWG 1.75, 14 AWG 2.00, 12 AWG 2.25, 10 AWG 2.50, 8 AWG 3.00, 6 AWG 5.00 in³ — and Table E3905.12.1, the volumes of standard metal boxes, the residential code's copies of NEC Tables 314.16(B) and 314.16(A); and the counting rules of NEC 314.16(B)(1) to (5) with worked examples (eleven 14 AWG allowances, 22 in³; five 14 AWG and six 12 AWG, 23.5 in³ in a 4 × 2⅛ in square box). Its support-fitting rule, an allowance for each stud or hickey, is not the code's, which gives one for each type of fitting (Emerson's reprint, below); the page follows the code",
        "Minnesota Department of Labor and Industry, Electrical Inspection Checklist for One-Family Dwellings based on the 2023 NEC (revised 2023-05-06), item 046, NEC 314.16: each insulated wire one allowance, all grounding wires combined one, each switch or receptacle two, all internal cable clamps one; more than four equipment grounding conductors add a quarter allowance each; four 14/2 cables with a switch, a receptacle and clamps need 28 in³",
        "City of San Antonio Development Services, 2020 National Electrical Code training (November 2022): 314.16(B)(5), new in 2020 — an additional ¼ volume allowance for equipment grounding conductors exceeding four",
        "Emerson (Appleton and O-Z/Gedney), Capacity of Steel Boxes and Covers, commercial and industrial fittings catalogue page 444 (February 2017), which reprints NEC 314.16 from the 2008 edition with NFPA's permission: 314.16(A), a box's volume including plaster rings, domed covers and extension rings that are marked with their volume or made from a box size listed in Table 314.16(A); 314.16(B)(3), a single allowance for each type of support fitting, luminaire studs or hickeys, at the largest conductor in the box; 314.16(B)(5), one allowance for the equipment grounding conductors and, for an additional set of isolated ones under 250.146(D), one more; and Tables 314.16(A) and 314.16(B) in cm³ with in³ in brackets, a 4 × 2⅛ in square box at 497 cm³ (30.3 in³) and a 14 AWG conductor at 32.8 cm³ (2.00 in³)",
        "Leviton, Captain Code 2020 NEC change summary, 314.16(B)(5): from 2020 a quarter allowance for each equipment grounding conductor or bonding jumper beyond four, a change that \"eliminates the need to specifically address\" the isolated-ground conductors of 250.146(D)"
      ],
      "vectors": [
        {
          "name": "Minnesota's example: four 14/2 cables, a switch, a receptacle and clamps need 28 in³",
          "inputs": {
            "box": "square-4x2.125",
            "addedVolume": 0,
            "conductors14": 8,
            "conductors12": 0,
            "conductors10": 0,
            "conductors8": 0,
            "conductors6": 0,
            "grounds": 4,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "yes",
            "supportFittings": "none",
            "devicesA": 2,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 28,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 30.3
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 2.3000000000000007
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 16
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 8
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 2
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 29.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Republic's figure 3: eleven 14 AWG allowances are 22 in³",
          "inputs": {
            "box": "square-4x2.125",
            "addedVolume": 0,
            "conductors14": 5,
            "grounds": 2,
            "groundSize": "14",
            "edition": "2017",
            "clamps": "yes",
            "supportFittings": "none",
            "devicesA": 2,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 22,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 30.3
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 8.3
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 10
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 8
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 2
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 25.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Republic's mixed example: 14/3 to a switch and 12/2 to a receptacle, 23.5 in³",
          "inputs": {
            "box": "square-4x2.125",
            "addedVolume": 0,
            "conductors14": 3,
            "conductors12": 2,
            "grounds": 2,
            "groundSize": "12",
            "edition": "2017",
            "clamps": "yes",
            "supportFittings": "none",
            "devicesA": 1,
            "devicesASize": "14",
            "devicesB": 1,
            "devicesBSize": "12"
          },
          "expected": 23.5,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 30.3
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 6.800000000000001
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 10.5
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2.25
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 8.5
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 2.25
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 25.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "six grounds under the 2020 NEC: one allowance plus two quarters, 3.375 in³ of 12 AWG",
          "inputs": {
            "box": "square-4.6875x2.125",
            "addedVolume": 0,
            "conductors12": 12,
            "grounds": 6,
            "groundSize": "12",
            "edition": "2020",
            "clamps": "no",
            "supportFittings": "none",
            "devicesA": 0,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 30.375,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 42
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 11.625
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 27
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 3.375
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 0
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 0
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 42
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "the same box under the 2017 NEC counts the six grounds once: 29.25 in³",
          "inputs": {
            "box": "square-4.6875x2.125",
            "addedVolume": 0,
            "conductors12": 12,
            "grounds": 6,
            "groundSize": "12",
            "edition": "2017",
            "clamps": "no",
            "supportFittings": "none",
            "devicesA": 0,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 29.25,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 42
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 12.75
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 27
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2.25
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 0
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 0
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 29.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a 6 AWG junction: four conductors at 5.00 in³, an 8 AWG grounds allowance at 3.00 and the clamps at 6 AWG make 28 in³",
          "inputs": {
            "box": "square-4.6875x2.125",
            "addedVolume": 0,
            "conductors6": 4,
            "grounds": 2,
            "groundSize": "8",
            "edition": "2020",
            "clamps": "yes",
            "supportFittings": "none",
            "devicesA": 0,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 28,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 42
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 14
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 20
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 3
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 0
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 5
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 29.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "luminaire studs, however many, are one allowance at the largest conductor: 13 + 2.50 = 15.5 in³",
          "inputs": {
            "box": "square-4x2.125",
            "addedVolume": 0,
            "conductors14": 4,
            "conductors10": 2,
            "grounds": 0,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "no",
            "supportFittings": "studs",
            "devicesA": 0,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 15.5,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 30.3
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 14.8
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 13
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 0
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 0
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 0
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 2.5
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 15.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "hickeys alone are one allowance too: 15.5 in³",
          "inputs": {
            "box": "square-4x2.125",
            "addedVolume": 0,
            "conductors14": 4,
            "conductors10": 2,
            "grounds": 0,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "no",
            "supportFittings": "hickeys",
            "devicesA": 0,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 15.5,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 30.3
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 14.8
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 13
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 0
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 0
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 0
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 2.5
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 15.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "a stud and a hickey are two types, two allowances: 13 + 2 x 2.50 = 18 in³",
          "inputs": {
            "box": "square-4x2.125",
            "addedVolume": 0,
            "conductors14": 4,
            "conductors10": 2,
            "grounds": 0,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "no",
            "supportFittings": "both",
            "devicesA": 0,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 18,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 30.3
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 12.3
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 13
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 0
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 0
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 0
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 5
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 18
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "one 14 AWG ground is one allowance: 2 in³",
          "inputs": {
            "box": "square-4x2.125",
            "grounds": 1,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "no",
            "devicesA": 0,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 2,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 30.3
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 28.3
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 0
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 0
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 0
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 7.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a device on 14 AWG is two allowances: 4 in³",
          "inputs": {
            "box": "square-4x2.125",
            "grounds": 0,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "no",
            "devicesA": 1,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 4,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 30.3
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 26.3
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 0
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 0
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 4
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 0
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 7.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a second-group device on 14 AWG is two allowances too",
          "inputs": {
            "box": "square-4x2.125",
            "grounds": 0,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "no",
            "devicesA": 0,
            "devicesASize": "14",
            "devicesB": 1,
            "devicesBSize": "14"
          },
          "expected": 4,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 30.3
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 26.3
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 0
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 0
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 4
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 0
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 7.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "one 12 AWG ground is one allowance: 2.25 in³",
          "inputs": {
            "box": "square-4x2.125",
            "grounds": 1,
            "groundSize": "12",
            "edition": "2020",
            "clamps": "no",
            "devicesA": 0,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 2.25,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 30.3
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 28.05
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 0
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2.25
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 0
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 0
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 7.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a device on 12 AWG is two allowances: 4.5 in³",
          "inputs": {
            "box": "square-4x2.125",
            "grounds": 0,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "no",
            "devicesA": 1,
            "devicesASize": "12",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 4.5,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 30.3
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 25.8
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 0
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 0
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 4.5
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 0
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 7.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a second-group device on 12 AWG is two allowances too",
          "inputs": {
            "box": "square-4x2.125",
            "grounds": 0,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "no",
            "devicesA": 0,
            "devicesASize": "14",
            "devicesB": 1,
            "devicesBSize": "12"
          },
          "expected": 4.5,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 30.3
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 25.8
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 0
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 0
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 4.5
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 0
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 7.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "one 10 AWG ground is one allowance: 2.5 in³",
          "inputs": {
            "box": "square-4x2.125",
            "grounds": 1,
            "groundSize": "10",
            "edition": "2020",
            "clamps": "no",
            "devicesA": 0,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 2.5,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 30.3
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 27.8
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 0
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2.5
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 0
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 0
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 7.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a device on 10 AWG is two allowances: 5 in³",
          "inputs": {
            "box": "square-4x2.125",
            "grounds": 0,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "no",
            "devicesA": 1,
            "devicesASize": "10",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 5,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 30.3
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 25.3
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 0
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 0
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 5
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 0
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 7.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a second-group device on 10 AWG is two allowances too",
          "inputs": {
            "box": "square-4x2.125",
            "grounds": 0,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "no",
            "devicesA": 0,
            "devicesASize": "14",
            "devicesB": 1,
            "devicesBSize": "10"
          },
          "expected": 5,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 30.3
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 25.3
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 0
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 0
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 5
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 0
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 7.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "one 8 AWG ground is one allowance: 3 in³",
          "inputs": {
            "box": "square-4x2.125",
            "grounds": 1,
            "groundSize": "8",
            "edition": "2020",
            "clamps": "no",
            "devicesA": 0,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 3,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 30.3
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 27.3
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 0
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 3
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 0
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 0
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 7.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a device on 8 AWG is two allowances: 6 in³",
          "inputs": {
            "box": "square-4x2.125",
            "grounds": 0,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "no",
            "devicesA": 1,
            "devicesASize": "8",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 6,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 30.3
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 24.3
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 0
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 0
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 6
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 0
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 7.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a second-group device on 8 AWG is two allowances too",
          "inputs": {
            "box": "square-4x2.125",
            "grounds": 0,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "no",
            "devicesA": 0,
            "devicesASize": "14",
            "devicesB": 1,
            "devicesBSize": "8"
          },
          "expected": 6,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 30.3
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 24.3
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 0
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 0
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 6
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 0
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 7.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "one 6 AWG ground is one allowance: 5 in³",
          "inputs": {
            "box": "square-4x2.125",
            "grounds": 1,
            "groundSize": "6",
            "edition": "2020",
            "clamps": "no",
            "devicesA": 0,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 5,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 30.3
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 25.3
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 0
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 5
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 0
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 0
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 7.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a device on 6 AWG is two allowances: 10 in³",
          "inputs": {
            "box": "square-4x2.125",
            "grounds": 0,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "no",
            "devicesA": 1,
            "devicesASize": "6",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 10,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 30.3
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 20.3
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 0
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 0
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 10
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 0
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 10
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a second-group device on 6 AWG is two allowances too",
          "inputs": {
            "box": "square-4x2.125",
            "grounds": 0,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "no",
            "devicesA": 0,
            "devicesASize": "14",
            "devicesB": 1,
            "devicesBSize": "6"
          },
          "expected": 10,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 30.3
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 20.3
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 0
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 0
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 10
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 0
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 10
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Minnesota's contents in a 4 × 1¼ in round or octagonal box need 28 in³",
          "inputs": {
            "box": "round-4x1.25",
            "markedVolume": 22.5,
            "addedVolume": 0,
            "conductors14": 8,
            "grounds": 4,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "yes",
            "supportFittings": "none",
            "devicesA": 2,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 28,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 12.5
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": -15.5
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 16
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 8
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 2
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 29.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Minnesota's contents in a 4 × 1½ in round or octagonal box need 28 in³",
          "inputs": {
            "box": "round-4x1.5",
            "markedVolume": 22.5,
            "addedVolume": 0,
            "conductors14": 8,
            "grounds": 4,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "yes",
            "supportFittings": "none",
            "devicesA": 2,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 28,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 15.5
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": -12.5
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 16
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 8
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 2
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 29.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Minnesota's contents in a 4 × 2⅛ in round or octagonal box need 28 in³",
          "inputs": {
            "box": "round-4x2.125",
            "markedVolume": 22.5,
            "addedVolume": 0,
            "conductors14": 8,
            "grounds": 4,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "yes",
            "supportFittings": "none",
            "devicesA": 2,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 28,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 21.5
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": -6.5
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 16
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 8
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 2
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 29.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Minnesota's contents in a 4 × 1¼ in square box need 28 in³",
          "inputs": {
            "box": "square-4x1.25",
            "markedVolume": 22.5,
            "addedVolume": 0,
            "conductors14": 8,
            "grounds": 4,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "yes",
            "supportFittings": "none",
            "devicesA": 2,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 28,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 18
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": -10
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 16
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 8
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 2
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 29.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Minnesota's contents in a 4 × 1½ in square box need 28 in³",
          "inputs": {
            "box": "square-4x1.5",
            "markedVolume": 22.5,
            "addedVolume": 0,
            "conductors14": 8,
            "grounds": 4,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "yes",
            "supportFittings": "none",
            "devicesA": 2,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 28,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 21
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": -7
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 16
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 8
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 2
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 29.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Minnesota's contents in a 4 × 2⅛ in square box need 28 in³",
          "inputs": {
            "box": "square-4x2.125",
            "markedVolume": 22.5,
            "addedVolume": 0,
            "conductors14": 8,
            "grounds": 4,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "yes",
            "supportFittings": "none",
            "devicesA": 2,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 28,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 30.3
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 2.3000000000000007
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 16
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 8
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 2
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 29.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Minnesota's contents in a 4 11/16 × 1¼ in square box need 28 in³",
          "inputs": {
            "box": "square-4.6875x1.25",
            "markedVolume": 22.5,
            "addedVolume": 0,
            "conductors14": 8,
            "grounds": 4,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "yes",
            "supportFittings": "none",
            "devicesA": 2,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 28,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 25.5
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": -2.5
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 16
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 8
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 2
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 29.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Minnesota's contents in a 4 11/16 × 1½ in square box need 28 in³",
          "inputs": {
            "box": "square-4.6875x1.5",
            "markedVolume": 22.5,
            "addedVolume": 0,
            "conductors14": 8,
            "grounds": 4,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "yes",
            "supportFittings": "none",
            "devicesA": 2,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 28,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 29.5
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 1.5
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 16
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 8
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 2
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 29.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Minnesota's contents in a 4 11/16 × 2⅛ in square box need 28 in³",
          "inputs": {
            "box": "square-4.6875x2.125",
            "markedVolume": 22.5,
            "addedVolume": 0,
            "conductors14": 8,
            "grounds": 4,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "yes",
            "supportFittings": "none",
            "devicesA": 2,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 28,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 42
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": 14
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 16
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 8
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 2
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 29.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Minnesota's contents in a 3 × 2 × 1½ in device box need 28 in³",
          "inputs": {
            "box": "device-3x2x1.5",
            "markedVolume": 22.5,
            "addedVolume": 0,
            "conductors14": 8,
            "grounds": 4,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "yes",
            "supportFittings": "none",
            "devicesA": 2,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 28,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 7.5
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": -20.5
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 16
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 8
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 2
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 29.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Minnesota's contents in a 3 × 2 × 2 in device box need 28 in³",
          "inputs": {
            "box": "device-3x2x2",
            "markedVolume": 22.5,
            "addedVolume": 0,
            "conductors14": 8,
            "grounds": 4,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "yes",
            "supportFittings": "none",
            "devicesA": 2,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 28,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 10
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": -18
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 16
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 8
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 2
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 29.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Minnesota's contents in a 3 × 2 × 2¼ in device box need 28 in³",
          "inputs": {
            "box": "device-3x2x2.25",
            "markedVolume": 22.5,
            "addedVolume": 0,
            "conductors14": 8,
            "grounds": 4,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "yes",
            "supportFittings": "none",
            "devicesA": 2,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 28,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 10.5
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": -17.5
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 16
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 8
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 2
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 29.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Minnesota's contents in a 3 × 2 × 2½ in device box need 28 in³",
          "inputs": {
            "box": "device-3x2x2.5",
            "markedVolume": 22.5,
            "addedVolume": 0,
            "conductors14": 8,
            "grounds": 4,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "yes",
            "supportFittings": "none",
            "devicesA": 2,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 28,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 12.5
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": -15.5
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 16
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 8
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 2
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 29.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Minnesota's contents in a 3 × 2 × 2¾ in device box need 28 in³",
          "inputs": {
            "box": "device-3x2x2.75",
            "markedVolume": 22.5,
            "addedVolume": 0,
            "conductors14": 8,
            "grounds": 4,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "yes",
            "supportFittings": "none",
            "devicesA": 2,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 28,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 14
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": -14
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 16
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 8
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 2
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 29.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Minnesota's contents in a 3 × 2 × 3½ in device box need 28 in³",
          "inputs": {
            "box": "device-3x2x3.5",
            "markedVolume": 22.5,
            "addedVolume": 0,
            "conductors14": 8,
            "grounds": 4,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "yes",
            "supportFittings": "none",
            "devicesA": 2,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 28,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 18
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": -10
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 16
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 8
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 2
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 29.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Minnesota's contents in a 4 × 2⅛ × 1½ in device box need 28 in³",
          "inputs": {
            "box": "device-4x2.125x1.5",
            "markedVolume": 22.5,
            "addedVolume": 0,
            "conductors14": 8,
            "grounds": 4,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "yes",
            "supportFittings": "none",
            "devicesA": 2,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 28,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 10.3
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": -17.7
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 16
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 8
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 2
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 29.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Minnesota's contents in a 4 × 2⅛ × 1⅞ in device box need 28 in³",
          "inputs": {
            "box": "device-4x2.125x1.875",
            "markedVolume": 22.5,
            "addedVolume": 0,
            "conductors14": 8,
            "grounds": 4,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "yes",
            "supportFittings": "none",
            "devicesA": 2,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 28,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 13
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": -15
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 16
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 8
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 2
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 29.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Minnesota's contents in a 4 × 2⅛ × 2⅛ in device box need 28 in³",
          "inputs": {
            "box": "device-4x2.125x2.125",
            "markedVolume": 22.5,
            "addedVolume": 0,
            "conductors14": 8,
            "grounds": 4,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "yes",
            "supportFittings": "none",
            "devicesA": 2,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 28,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 14.5
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": -13.5
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 16
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 8
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 2
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 29.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Minnesota's contents in a 3¾ × 2 × 2½ in masonry box or gang box need 28 in³",
          "inputs": {
            "box": "masonry-3.75x2x2.5",
            "markedVolume": 22.5,
            "addedVolume": 0,
            "conductors14": 8,
            "grounds": 4,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "yes",
            "supportFittings": "none",
            "devicesA": 2,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 28,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 14
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": -14
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 16
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 8
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 2
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 29.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Minnesota's contents in a 3¾ × 2 × 3½ in masonry box or gang box need 28 in³",
          "inputs": {
            "box": "masonry-3.75x2x3.5",
            "markedVolume": 22.5,
            "addedVolume": 0,
            "conductors14": 8,
            "grounds": 4,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "yes",
            "supportFittings": "none",
            "devicesA": 2,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 28,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 21
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": -7
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 16
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 8
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 2
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 29.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Minnesota's contents in a box marked with its volume box need 28 in³",
          "inputs": {
            "box": "marked",
            "markedVolume": 22.5,
            "addedVolume": 0,
            "conductors14": 8,
            "grounds": 4,
            "groundSize": "14",
            "edition": "2020",
            "clamps": "yes",
            "supportFittings": "none",
            "devicesA": 2,
            "devicesASize": "14",
            "devicesB": 0,
            "devicesBSize": "12"
          },
          "expected": 28,
          "toleranceDecimalPlaces": 6,
          "unit": "in³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Box volume, with rings or covers (in³)",
              "value": 22.5
            },
            {
              "label": "Box volume less the contents' allowances (in³)",
              "value": -5.5
            },
            {
              "label": "Insulated conductors (in³)",
              "value": 16
            },
            {
              "label": "Equipment grounding conductors (in³)",
              "value": 2
            },
            {
              "label": "Devices, two allowances per yoke (in³)",
              "value": 8
            },
            {
              "label": "Internal cable clamps (in³)",
              "value": 2
            },
            {
              "label": "Luminaire studs and hickeys, one allowance per type (in³)",
              "value": 0
            },
            {
              "label": "Smallest volume in Table 314.16(A) that holds this (in³)",
              "value": 29.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "breaker-size-calculator",
      "title": "Breaker Size Calculator",
      "url": "https://craftquantities.com/calculators/electrical/breaker-size-calculator/",
      "sources": [
        "NEC 240.6(A): standard ampere ratings for inverse-time circuit breakers and fuses — 15, 20, 25, 30, 35, 40, 45, 50, 60, 70, 80, 90, 100, 110, 125, 150, 175, 200, 225, 250, 300, 350, 400, 450, 500, 600 A",
        "NEC 210.20(A) and 215.3: the overcurrent device rating shall be not less than 100% of the noncontinuous load plus 125% of the continuous load",
        "NEC 210.19(A)(1): branch-circuit conductors shall have an ampacity not less than the same figure, before any temperature or conduit-fill correction",
        "NEC 240.4: conductors shall be protected at their ampacity — the device rating follows the conductor, not the load it happens to serve",
        "NEC Article 430 governs motor branch circuits: short-circuit and ground-fault protection is sized from Table 430.52 and may substantially exceed the motor's full-load current, so this page does not apply to motors"
      ],
      "vectors": [
        {
          "name": "A 4.8 kW continuous load at 240 V needs 25 A",
          "inputs": {
            "loadMode": "watts",
            "loadWatts": 4800,
            "loadAmps": 20,
            "voltage": "240",
            "phase": "single",
            "continuous": "yes"
          },
          "expected": 25,
          "toleranceDecimalPlaces": 6,
          "unit": "A",
          "confidence": "medium",
          "steps": [
            {
              "label": "Load current",
              "value": 20,
              "unit": "A"
            },
            {
              "label": "Required minimum at 125% (continuous)",
              "value": 25,
              "unit": "A"
            },
            {
              "label": "Minimum conductor ampacity after corrections",
              "value": 25,
              "unit": "A"
            },
            {
              "label": "Headroom to the next trip point",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Load as a share of the breaker",
              "value": 80,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "The same load intermittently needs only 20 A",
          "inputs": {
            "loadMode": "watts",
            "loadWatts": 4800,
            "loadAmps": 20,
            "voltage": "240",
            "phase": "single",
            "continuous": "no"
          },
          "expected": 20,
          "toleranceDecimalPlaces": 6,
          "unit": "A",
          "confidence": "medium",
          "steps": [
            {
              "label": "Load current",
              "value": 20,
              "unit": "A"
            },
            {
              "label": "Required minimum (noncontinuous)",
              "value": 20,
              "unit": "A"
            },
            {
              "label": "Minimum conductor ampacity after corrections",
              "value": 20,
              "unit": "A"
            },
            {
              "label": "Headroom to the next trip point",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Load as a share of the breaker",
              "value": 100,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A 1.5 kW continuous load at 120 V steps past 15 A to 20 A",
          "inputs": {
            "loadMode": "watts",
            "loadWatts": 1500,
            "loadAmps": 20,
            "voltage": "120",
            "phase": "single",
            "continuous": "yes"
          },
          "expected": 20,
          "toleranceDecimalPlaces": 6,
          "unit": "A",
          "confidence": "medium",
          "steps": [
            {
              "label": "Load current",
              "value": 12.5,
              "unit": "A"
            },
            {
              "label": "Required minimum at 125% (continuous)",
              "value": 15.625,
              "unit": "A"
            },
            {
              "label": "Minimum conductor ampacity after corrections",
              "value": 20,
              "unit": "A"
            },
            {
              "label": "Headroom to the next trip point",
              "value": 28.000000000000004,
              "unit": "%"
            },
            {
              "label": "Load as a share of the breaker",
              "value": 62.5,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A 20 kW three-phase load at 208 V needs 60 A",
          "inputs": {
            "loadMode": "watts",
            "loadWatts": 20000,
            "loadAmps": 20,
            "voltage": "208",
            "phase": "three",
            "continuous": "no"
          },
          "expected": 60,
          "toleranceDecimalPlaces": 6,
          "unit": "A",
          "confidence": "medium",
          "steps": [
            {
              "label": "Load current",
              "value": 55.514448960540946,
              "unit": "A"
            },
            {
              "label": "Required minimum (noncontinuous)",
              "value": 55.514448960540946,
              "unit": "A"
            },
            {
              "label": "Minimum conductor ampacity after corrections",
              "value": 60,
              "unit": "A"
            },
            {
              "label": "Headroom to the next trip point",
              "value": 8.079970392297929,
              "unit": "%"
            },
            {
              "label": "Load as a share of the breaker",
              "value": 92.52408160090158,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A 30 A continuous nameplate needs 40 A",
          "inputs": {
            "loadMode": "amps",
            "loadWatts": 4800,
            "loadAmps": 30,
            "voltage": "480",
            "phase": "three",
            "continuous": "yes"
          },
          "expected": 40,
          "toleranceDecimalPlaces": 6,
          "unit": "A",
          "confidence": "medium",
          "steps": [
            {
              "label": "Load current",
              "value": 30,
              "unit": "A"
            },
            {
              "label": "Required minimum at 125% (continuous)",
              "value": 37.5,
              "unit": "A"
            },
            {
              "label": "Minimum conductor ampacity after corrections",
              "value": 40,
              "unit": "A"
            },
            {
              "label": "Headroom to the next trip point",
              "value": 6.666666666666667,
              "unit": "%"
            },
            {
              "label": "Load as a share of the breaker",
              "value": 75,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "brick-anchor-spacing-calculator",
      "title": "Brick Veneer Anchor Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/brick-anchor-spacing-calculator/",
      "sources": [
        "IBC 1404.4 / IRC R703.8.4.1: each veneer tie supports no more than 2.67 sq ft of wall area, and in no case more than 32 in on-center horizontally or 25 in on-center vertically — all three limits apply at once"
      ],
      "vectors": [
        {
          "name": "10x3m wall at both spacing maxima — the area rule tightens the rows",
          "inputs": {
            "wallLength": 10,
            "wallHeight": 3,
            "maxHorizontalSpacing": 0.8128,
            "maxVerticalSpacing": 0.6096
          },
          "expected": 154,
          "toleranceDecimalPlaces": 0,
          "unit": "anchors",
          "confidence": "medium",
          "steps": [
            {
              "label": "Anchors per row (horizontal)",
              "value": 14
            },
            {
              "label": "Anchor rows (vertical)",
              "value": 11
            },
            {
              "label": "Vertical spacing used",
              "value": 12.02,
              "unit": "in"
            },
            {
              "label": "Wall area per anchor",
              "value": 2.67,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15x4m wall at both spacing maxima",
          "inputs": {
            "wallLength": 15,
            "wallHeight": 4,
            "maxHorizontalSpacing": 0.8128,
            "maxVerticalSpacing": 0.6096
          },
          "expected": 300,
          "toleranceDecimalPlaces": 0,
          "unit": "anchors",
          "confidence": "medium",
          "steps": [
            {
              "label": "Anchors per row (horizontal)",
              "value": 20
            },
            {
              "label": "Anchor rows (vertical)",
              "value": 15
            },
            {
              "label": "Vertical spacing used",
              "value": 12.02,
              "unit": "in"
            },
            {
              "label": "Wall area per anchor",
              "value": 2.67,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "24in x 16in is already compliant, so nothing is tightened",
          "inputs": {
            "wallLength": 10,
            "wallHeight": 3,
            "maxHorizontalSpacing": 0.6096,
            "maxVerticalSpacing": 0.4064
          },
          "expected": 162,
          "toleranceDecimalPlaces": 0,
          "unit": "anchors",
          "confidence": "medium",
          "steps": [
            {
              "label": "Anchors per row (horizontal)",
              "value": 18
            },
            {
              "label": "Anchor rows (vertical)",
              "value": 9
            },
            {
              "label": "Vertical spacing used",
              "value": 16,
              "unit": "in"
            },
            {
              "label": "Wall area per anchor",
              "value": 2.67,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "brick-calculator",
      "title": "Brick Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/brick-calculator/",
      "sources": [
        "Bricks per square foot is derived geometrically from nominal brick face dimensions (actual brick size + mortar joint width) rather than a single fixed rate, since brick products and joint widths vary",
        "Mortar volume is derived from the gap between actual and nominal brick face dimensions across the wall's depth; one 80 lb bag of mortar mix yields approximately 0.66 cubic feet when mixed, a rate of 0.00825 cubic feet per pound of dry mix — which puts the 25 kg bag metric merchants stock at about 12.9 litres"
      ],
      "vectors": [
        {
          "name": "6x2.4m wall, 10% waste, standard modular brick",
          "inputs": {
            "wallLength": 6,
            "wallHeight": 2.4,
            "wasteFactorPercent": 10,
            "brickLengthIn": 0.193675,
            "brickHeightIn": 0.05715,
            "mortarJointIn": 0.009525,
            "brickDepthIn": 0.092075
          },
          "expected": 1170,
          "toleranceDecimalPlaces": -1,
          "unit": "bricks",
          "confidence": "high",
          "steps": [
            {
              "label": "Wall area",
              "value": 155.00031000061998,
              "unit": "sq ft"
            },
            {
              "label": "Coverage rate (from your dimensions)",
              "value": 6.857142857142856,
              "unit": "bricks/sq ft"
            },
            {
              "label": "Base brick count (no waste)",
              "value": 1063,
              "unit": "bricks"
            },
            {
              "label": "Mortar mix needed",
              "value": 13,
              "unit": "80 lb bags"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "10x3m wall, 5% waste, standard modular brick",
          "inputs": {
            "wallLength": 10,
            "wallHeight": 3,
            "wasteFactorPercent": 5,
            "brickLengthIn": 0.193675,
            "brickHeightIn": 0.05715,
            "mortarJointIn": 0.009525,
            "brickDepthIn": 0.092075
          },
          "expected": 2326,
          "toleranceDecimalPlaces": -1,
          "unit": "bricks",
          "confidence": "high",
          "steps": [
            {
              "label": "Wall area",
              "value": 322.91731250129163,
              "unit": "sq ft"
            },
            {
              "label": "Coverage rate (from your dimensions)",
              "value": 6.857142857142856,
              "unit": "bricks/sq ft"
            },
            {
              "label": "Base brick count (no waste)",
              "value": 2215,
              "unit": "bricks"
            },
            {
              "label": "Mortar mix needed",
              "value": 28,
              "unit": "80 lb bags"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "brick-ira-calculator",
      "title": "Brick Initial Rate of Absorption (IRA) Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/brick-ira-calculator/",
      "sources": [
        "ASTM C67 Initial Rate of Absorption test: IRA = (wet mass − dry mass) x (30 / test area), reported in grams per minute per 30 in² of brick surface"
      ],
      "vectors": [
        {
          "name": "500g dry, 515g wet, 30in² area",
          "inputs": {
            "dryWeight": 500,
            "wetWeight": 515,
            "testArea": 30
          },
          "expected": 15,
          "toleranceDecimalPlaces": 0,
          "unit": "g/min/30in²",
          "confidence": "high",
          "steps": [
            {
              "label": "Mass absorbed",
              "value": 15,
              "unit": "g"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "480g dry, 510g wet, 25in² area",
          "inputs": {
            "dryWeight": 480,
            "wetWeight": 510,
            "testArea": 25
          },
          "expected": 36,
          "toleranceDecimalPlaces": 0,
          "unit": "g/min/30in²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Mass absorbed",
              "value": 30,
              "unit": "g"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "brick-movement-joint-spacing-calculator",
      "title": "Brick Movement Joint Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/brick-movement-joint-spacing-calculator/",
      "sources": [
        "Brick Industry Association, Technical Note 18A, Accommodating Expansion of Brickwork (2019): vertical expansion joints at no more than 25 ft (7.6 m) in brickwork without openings and 20 ft (6.1 m) with multiple openings; the distances from a corner to the first joint in each wall sum to no more than the straight-wall spacing",
        "Brick Development Association, Designing for Movement in Brickwork (2023), citing PD 6697: clay brickwork joints at approximately 10-12 m and never more than 15 m; the first joint no more than half the spacing from a corner or return; parapets and freestanding walls at twice the frequency",
        "Joints = equal bays over (run + half the spacing for each end that turns a corner), at no more than the spacing each, less one. Sealant and backer rod = joints × wall height, one face."
      ],
      "vectors": [
        {
          "name": "20 m run, one corner, 7.5 m spacing — not an exact multiple",
          "inputs": {
            "wallLength": 20,
            "cornerEnds": 1,
            "maxJointDistance": 7.5,
            "wallHeight": 2.5
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "movement joints",
          "confidence": "medium",
          "steps": [
            {
              "label": "Maximum spacing used",
              "value": 7.5,
              "unit": "m"
            },
            {
              "label": "Joint centres, as set out",
              "value": 5.714285714285714,
              "unit": "m"
            },
            {
              "label": "First joint from the corner",
              "value": 2.857142857142857,
              "unit": "m"
            },
            {
              "label": "Sealant and backer rod, one face",
              "value": 7.5,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "15 m run between two corners, 7.5 m spacing",
          "inputs": {
            "wallLength": 15,
            "cornerEnds": 2,
            "maxJointDistance": 7.5,
            "wallHeight": 2.5
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "movement joints",
          "confidence": "medium",
          "steps": [
            {
              "label": "Maximum spacing used",
              "value": 7.5,
              "unit": "m"
            },
            {
              "label": "Joint centres, as set out",
              "value": 7.5,
              "unit": "m"
            },
            {
              "label": "First joint from each corner",
              "value": 3.75,
              "unit": "m"
            },
            {
              "label": "Sealant and backer rod, one face",
              "value": 5,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "15 m run between two stops, 7.5 m spacing — an exact multiple adds no joint",
          "inputs": {
            "wallLength": 15,
            "cornerEnds": 0,
            "maxJointDistance": 7.5,
            "wallHeight": 2.5
          },
          "expected": 1,
          "toleranceDecimalPlaces": 0,
          "unit": "movement joints",
          "confidence": "medium",
          "steps": [
            {
              "label": "Maximum spacing used",
              "value": 7.5,
              "unit": "m"
            },
            {
              "label": "Joint centres, as set out",
              "value": 7.5,
              "unit": "m"
            },
            {
              "label": "Sealant and backer rod, one face",
              "value": 2.5,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "30 m run, one corner, UK 12 m spacing",
          "inputs": {
            "wallLength": 30,
            "cornerEnds": 1,
            "maxJointDistance": 12,
            "wallHeight": 5
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "movement joints",
          "confidence": "medium",
          "steps": [
            {
              "label": "Maximum spacing used",
              "value": 12,
              "unit": "m"
            },
            {
              "label": "Joint centres, as set out",
              "value": 12,
              "unit": "m"
            },
            {
              "label": "First joint from the corner",
              "value": 6,
              "unit": "m"
            },
            {
              "label": "Sealant and backer rod, one face",
              "value": 10,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "40 m run between two corners, 25 ft (7.62 m) spacing",
          "inputs": {
            "wallLength": 40,
            "cornerEnds": 2,
            "maxJointDistance": 7.62,
            "wallHeight": 3
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "movement joints",
          "confidence": "medium",
          "steps": [
            {
              "label": "Maximum spacing used",
              "value": 7.62,
              "unit": "m"
            },
            {
              "label": "Joint centres, as set out",
              "value": 6.666666666666667,
              "unit": "m"
            },
            {
              "label": "First joint from each corner",
              "value": 3.3333333333333335,
              "unit": "m"
            },
            {
              "label": "Sealant and backer rod, one face",
              "value": 18,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "5 m run between two stops needs no joint",
          "inputs": {
            "wallLength": 5,
            "cornerEnds": 0,
            "maxJointDistance": 7.5,
            "wallHeight": 2.5
          },
          "expected": 0,
          "toleranceDecimalPlaces": 0,
          "unit": "movement joints",
          "confidence": "medium",
          "steps": [
            {
              "label": "Maximum spacing used",
              "value": 7.5,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "brick-rubble-cubic-yards-to-tons-calculator",
      "title": "Brick Rubble Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/brick-rubble-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 1.2 short tons per cubic yard",
        "Density varies with moisture, composition and how the material was broken or processed"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 12,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.2,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 120,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.2,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "brick-rubble-tons-to-cubic-yards-calculator",
      "title": "Brick Rubble Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/brick-rubble-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 1.2 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 8.333333333333334,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.8333333333333334,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 83.33333333333334,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.8333333333333334,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "bricks-to-square-feet-calculator",
      "title": "Bricks to Square Feet Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/bricks-to-square-feet-calculator/",
      "sources": [
        "Inverse of approximately 7 modular bricks per square foot with 3/8 in joints"
      ],
      "vectors": [
        {
          "name": "1000 bricks converts correctly",
          "inputs": {
            "bricks": 1000
          },
          "expected": 142.85714285714286,
          "toleranceDecimalPlaces": 6,
          "unit": "sq ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.14285714285714285,
              "unit": "sq ft per bricks"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "bricks": 10000
          },
          "expected": 1428.5714285714284,
          "toleranceDecimalPlaces": 6,
          "unit": "sq ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.14285714285714285,
              "unit": "sq ft per bricks"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "btu-cooling-calculator",
      "title": "BTU Cooling / AC Sizing Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/btu-cooling-calculator/",
      "sources": [
        "Rule-of-thumb baseline: approximately 20 BTU per square foot for cooling, within a commonly cited 18-30 BTU/sq ft range depending on insulation, ceiling height, and climate",
        "A precise sizing should use a full Manual J load calculation performed by an HVAC professional — this tool gives a rough planning estimate only"
      ],
      "vectors": [
        {
          "name": "4x3.5m room, standard ceiling, moderate sun",
          "inputs": {
            "roomLength": 4,
            "roomWidth": 3.5,
            "ceilingHeight": "standard",
            "sunExposure": "moderate"
          },
          "expected": 3014,
          "toleranceDecimalPlaces": -1,
          "unit": "BTU/hr",
          "confidence": "medium",
          "steps": [
            {
              "label": "Room area",
              "value": 150.6947458339361,
              "unit": "sq ft"
            },
            {
              "label": "Baseline (20 BTU/sq ft)",
              "value": 3013.8949166787224,
              "unit": "BTU/hr"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "5x4m room, vaulted ceiling, high sun",
          "inputs": {
            "roomLength": 5,
            "roomWidth": 4,
            "ceilingHeight": "vaulted",
            "sunExposure": "high"
          },
          "expected": 6437,
          "toleranceDecimalPlaces": -1,
          "unit": "BTU/hr",
          "confidence": "medium",
          "steps": [
            {
              "label": "Room area",
              "value": 215.27820833419443,
              "unit": "sq ft"
            },
            {
              "label": "Baseline (20 BTU/sq ft)",
              "value": 4305.564166683888,
              "unit": "BTU/hr"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "btu-to-kw-calculator",
      "title": "BTU/hr to kW Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/btu-to-kw-calculator/",
      "sources": [
        "1 BTU/h = 0.29307107017222 W (International Table BTU), so 1000 BTU/h = 0.293071 kW"
      ],
      "vectors": [
        {
          "name": "12000 BTU/hr converts correctly",
          "inputs": {
            "btuPerHour": 12000
          },
          "expected": 3.5168528420666405,
          "toleranceDecimalPlaces": 6,
          "unit": "kW",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.00029307107017222003,
              "unit": "kW per BTU/hr"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "btuPerHour": 120000
          },
          "expected": 35.168528420666405,
          "toleranceDecimalPlaces": 6,
          "unit": "kW",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.00029307107017222003,
              "unit": "kW per BTU/hr"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "btu-to-watts-calculator",
      "title": "BTU/hr to Watts Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/btu-to-watts-calculator/",
      "sources": [
        "1 watt = 3.412141633 BTU/hr, from the IT British thermal unit of 1,055.05585262 J"
      ],
      "vectors": [
        {
          "name": "5000 BTU/hr to watts",
          "inputs": {
            "value": 5000,
            "fromUnit": "btu"
          },
          "expected": 1465.4,
          "toleranceDecimalPlaces": 1,
          "unit": "W",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1500 watts to BTU/hr",
          "inputs": {
            "value": 1500,
            "fromUnit": "watts"
          },
          "expected": 5118,
          "toleranceDecimalPlaces": 0,
          "unit": "BTU/hr",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "bur-base-sheet-calculator",
      "title": "Built-Up Roofing (BUR) Base Sheet Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/bur-base-sheet-calculator/",
      "sources": [
        "Sheet count = ceil((roof area × (1 + overlap allowance)) ÷ sheet coverage area), accounting for the mandatory side and end laps between adjacent base sheet plies in a built-up roofing system"
      ],
      "vectors": [
        {
          "name": "100m² roof, 9.3m² coverage, 10% overlap",
          "inputs": {
            "roofArea": 100,
            "sheetCoverageArea": 9.3,
            "overlapPercent": 10
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150m² roof, 9.3m² coverage, 12% overlap",
          "inputs": {
            "roofArea": 150,
            "sheetCoverageArea": 9.3,
            "overlapPercent": 12
          },
          "expected": 19,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "busbar-ampacity-calculator",
      "title": "Busbar Ampacity Calculator (Current Density Method)",
      "url": "https://craftquantities.com/calculators/materials-quantities/busbar-ampacity-calculator/",
      "sources": [
        "Simplified current density method: ampacity = busbar cross-sectional area x rated current density (commonly cited as ~1.6 A/mm2 for copper busbar in free air at a moderate temperature rise, lower for aluminum) — a widely-used preliminary sizing approximation; actual ampacity also depends on temperature rise limits, ambient temperature, enclosure ventilation, and proximity effects from adjacent busbars"
      ],
      "vectors": [
        {
          "name": "50mm x 6mm copper busbar, 1.6 A/mm²",
          "inputs": {
            "busbarWidth": 0.05,
            "busbarThickness": 0.006,
            "currentDensity": 1.6
          },
          "expected": 480,
          "toleranceDecimalPlaces": 0,
          "unit": "A",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cross-sectional area",
              "value": 300,
              "unit": "mm²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "60mm x 10mm copper busbar, 1.6 A/mm²",
          "inputs": {
            "busbarWidth": 0.06,
            "busbarThickness": 0.01,
            "currentDensity": 1.6
          },
          "expected": 960,
          "toleranceDecimalPlaces": 0,
          "unit": "A",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cross-sectional area",
              "value": 600,
              "unit": "mm²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cable-railing-calculator",
      "title": "Cable Railing Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/cable-railing-calculator/",
      "sources": [
        "Total cable length = railing run length x number of horizontal cable runs, since each run spans the full length of the railing"
      ],
      "vectors": [
        {
          "name": "6m railing, 9 cable runs",
          "inputs": {
            "railingLength": 6,
            "cableRuns": 9
          },
          "expected": 194.88,
          "toleranceDecimalPlaces": 2,
          "unit": "linear ft of cable",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cable before waste allowance",
              "value": 177.16535433070868,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "10m railing, 9 cable runs",
          "inputs": {
            "railingLength": 10,
            "cableRuns": 9
          },
          "expected": 324.8,
          "toleranceDecimalPlaces": 1,
          "unit": "linear ft of cable",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cable before waste allowance",
              "value": 295.2755905511811,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cable-tray-deflection-calculator",
      "title": "Cable Tray Center-Span Deflection Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/cable-tray-deflection-calculator/",
      "sources": [
        "Uniformly-loaded simple beam deflection: Δ = 5wL⁴/(384EI), applied to a cable tray section between supports; standard cable tray deflection limit per NEMA VE 1 load/deflection test rating is commonly L/100 of the support span"
      ],
      "vectors": [
        {
          "name": "3m span, 50 N/m load, steel rail (pass)",
          "inputs": {
            "cableLoad": 50,
            "spanLength": 3,
            "elasticModulus": 200000000000,
            "momentOfInertia": 2
          },
          "expected": 0.132,
          "toleranceDecimalPlaces": 3,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "L/100 allowable limit (NEMA VE 1)",
              "value": 30,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "3.6m span, 70 N/m load, steel rail (pass)",
          "inputs": {
            "cableLoad": 70,
            "spanLength": 3.6,
            "elasticModulus": 200000000000,
            "momentOfInertia": 2.5
          },
          "expected": 0.306,
          "toleranceDecimalPlaces": 3,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "L/100 allowable limit (NEMA VE 1)",
              "value": 36,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cable-tray-fill-calculator",
      "title": "Cable Tray Fill Percentage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/cable-tray-fill-calculator/",
      "sources": [
        "Cable tray fill percentage = total cable cross-sectional area ÷ tray usable cross-sectional area × 100, per NEC Article 392 cable tray fill requirements (specific maximum fill percentages vary by tray type and cable type per NEC 392.22)"
      ],
      "vectors": [
        {
          "name": "300mm x 100mm tray, 9000mm² cables",
          "inputs": {
            "trayWidth": 0.3,
            "trayDepth": 0.1,
            "totalCableArea": 0.009
          },
          "expected": 30,
          "toleranceDecimalPlaces": 0,
          "unit": "%",
          "confidence": "medium",
          "steps": [
            {
              "label": "Tray usable cross-sectional area",
              "value": 30000,
              "unit": "mm²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "450mm x 100mm tray, 18000mm² cables",
          "inputs": {
            "trayWidth": 0.45,
            "trayDepth": 0.1,
            "totalCableArea": 0.018
          },
          "expected": 40,
          "toleranceDecimalPlaces": 0,
          "unit": "%",
          "confidence": "medium",
          "steps": [
            {
              "label": "Tray usable cross-sectional area",
              "value": 45000,
              "unit": "mm²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cable-tray-loaded-weight-calculator",
      "title": "Cable Tray Loaded Weight Per Unit Length Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/cable-tray-loaded-weight-calculator/",
      "sources": [
        "NEMA VE 1, Metal Cable Tray Systems — tray is rated for a uniformly distributed working load applied together with a concentrated load at mid-span, which is why a worker allowance has to be carried alongside the distributed cable weight rather than folded into it",
        "NEMA VE 2, Cable Tray Installation Guidelines — the concentrated allowance represents an installer standing or kneeling in the tray during a pull, and it is applied where it does most harm, at mid-span",
        "Restating a mid-span point load as an equivalent uniform load is exact beam statics, and the factor depends on what is being checked: 2P/L matches the bending moment (PL/4 = wL²/8) and 1.6P/L matches the deflection (PL³/48EI = 5wL⁴/384EI). Both are reported because using one where the other belongs overstates or understates by 25%",
        "Distinct from this site's Cable Tray Center-Span Deflection Calculator, which takes a load per unit length as an input. This one builds that number from the segment's own schedule and hands it over — but hand over one of the two N/m rows in the breakdown, NOT the kg/m headline: that field is a force per unit length and the headline is a mass per unit length, a factor of 9.81 apart"
      ],
      "vectors": [
        {
          "name": "14 + 4.5 + 2 kg/m loaded, 200 lb worker allowance on a 3 m span",
          "inputs": {
            "cableWeightPerLength": 14,
            "trayWeightPerLength": 4.5,
            "conduitWeightPerLength": 2,
            "iceSnowPerLength": 0,
            "concentratedAllowance": 90.718474,
            "supportSpan": 3
          },
          "expected": 80.978983,
          "toleranceDecimalPlaces": 3,
          "unit": "kg/m",
          "confidence": "high",
          "steps": [
            {
              "label": "Uniformly distributed load from the schedule",
              "value": 20.5,
              "unit": "kg/m"
            },
            {
              "label": "Cables in the segment",
              "value": 14,
              "unit": "kg/m"
            },
            {
              "label": "Tray self-weight",
              "value": 4.5,
              "unit": "kg/m"
            },
            {
              "label": "Attached conduits and cleats",
              "value": 2,
              "unit": "kg/m"
            },
            {
              "label": "Ice or snow allowance",
              "value": 0,
              "unit": "kg/m"
            },
            {
              "label": "Concentrated allowance restated for a moment check",
              "value": 60.47898266666667,
              "unit": "kg/m"
            },
            {
              "label": "Concentrated allowance restated for a deflection check",
              "value": 48.38318613333334,
              "unit": "kg/m"
            },
            {
              "label": "Total load for a moment check, in N/m for the deflection page",
              "value": 794.1325403680667,
              "unit": "N/m"
            },
            {
              "label": "Total load for a deflection check, in N/m for the deflection page",
              "value": 675.5132972944533,
              "unit": "N/m"
            },
            {
              "label": "Mid-span bending moment from the total",
              "value": 893.399107914075,
              "unit": "N·m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Heavy schedule with ice and no worker in the tray",
          "inputs": {
            "cableWeightPerLength": 30,
            "trayWeightPerLength": 6,
            "conduitWeightPerLength": 0,
            "iceSnowPerLength": 4,
            "concentratedAllowance": 0,
            "supportSpan": 3
          },
          "expected": 40,
          "toleranceDecimalPlaces": 3,
          "unit": "kg/m",
          "confidence": "high",
          "steps": [
            {
              "label": "Uniformly distributed load from the schedule",
              "value": 40,
              "unit": "kg/m"
            },
            {
              "label": "Cables in the segment",
              "value": 30,
              "unit": "kg/m"
            },
            {
              "label": "Tray self-weight",
              "value": 6,
              "unit": "kg/m"
            },
            {
              "label": "Attached conduits and cleats",
              "value": 0,
              "unit": "kg/m"
            },
            {
              "label": "Ice or snow allowance",
              "value": 4,
              "unit": "kg/m"
            },
            {
              "label": "Concentrated allowance restated for a moment check",
              "value": 0,
              "unit": "kg/m"
            },
            {
              "label": "Concentrated allowance restated for a deflection check",
              "value": 0,
              "unit": "kg/m"
            },
            {
              "label": "Total load for a moment check, in N/m for the deflection page",
              "value": 392.26599999999996,
              "unit": "N/m"
            },
            {
              "label": "Total load for a deflection check, in N/m for the deflection page",
              "value": 392.26599999999996,
              "unit": "N/m"
            },
            {
              "label": "Mid-span bending moment from the total",
              "value": 441.2992499999999,
              "unit": "N·m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Empty tray carrying only the worker allowance over a 6 m span",
          "inputs": {
            "cableWeightPerLength": 0,
            "trayWeightPerLength": 0,
            "conduitWeightPerLength": 0,
            "iceSnowPerLength": 0,
            "concentratedAllowance": 90.718474,
            "supportSpan": 6
          },
          "expected": 30.239491,
          "toleranceDecimalPlaces": 3,
          "unit": "kg/m",
          "confidence": "high",
          "steps": [
            {
              "label": "Uniformly distributed load from the schedule",
              "value": 0,
              "unit": "kg/m"
            },
            {
              "label": "Cables in the segment",
              "value": 0,
              "unit": "kg/m"
            },
            {
              "label": "Tray self-weight",
              "value": 0,
              "unit": "kg/m"
            },
            {
              "label": "Attached conduits and cleats",
              "value": 0,
              "unit": "kg/m"
            },
            {
              "label": "Ice or snow allowance",
              "value": 0,
              "unit": "kg/m"
            },
            {
              "label": "Concentrated allowance restated for a moment check",
              "value": 30.239491333333334,
              "unit": "kg/m"
            },
            {
              "label": "Concentrated allowance restated for a deflection check",
              "value": 24.19159306666667,
              "unit": "kg/m"
            },
            {
              "label": "Total load for a moment check, in N/m for the deflection page",
              "value": 296.5481076840333,
              "unit": "N/m"
            },
            {
              "label": "Total load for a deflection check, in N/m for the deflection page",
              "value": 237.2384861472267,
              "unit": "N/m"
            },
            {
              "label": "Mid-span bending moment from the total",
              "value": 1334.46648457815,
              "unit": "N·m"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "cable-tray-support-count-calculator",
      "title": "Cable Tray Support Position Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/cable-tray-support-count-calculator/",
      "sources": [
        "NEMA VE 2, Cable Tray Installation Guidelines — installation practice places supports adjacent to fittings and on both sides of an expansion connector, rather than relying on the straight-run spacing through a change of direction",
        "Straight-run count = ceil(run length ÷ maximum permitted span) + 1, the standard end-plus-interval count for evenly spaced supports along a line",
        "RULE OF THUMB, stated as one: the default of two extra supports per fitting is the common practice of hanging a bend, tee or cross from both sides so it cannot twist. It is a practice, not a clause — confirm the number against the tray manufacturer's own installation instructions for the fitting you have."
      ],
      "vectors": [
        {
          "name": "30 m run at 3 m span, 7 fittings, one movement joint",
          "inputs": {
            "runLength": 30,
            "maxSpan": 3,
            "horizontalBends": 4,
            "verticalBends": 2,
            "tees": 1,
            "crosses": 0,
            "expansionConnectors": 1,
            "supportsPerFitting": "2"
          },
          "expected": 27,
          "toleranceDecimalPlaces": 0,
          "unit": "supports",
          "confidence": "high",
          "steps": [
            {
              "label": "Supports along the straight run",
              "value": 11,
              "unit": "supports"
            },
            {
              "label": "Extra supports at bends, tees and crosses",
              "value": 14,
              "unit": "supports"
            },
            {
              "label": "Extra supports at expansion connectors",
              "value": 2,
              "unit": "supports"
            },
            {
              "label": "Spacing achieved between straight-run supports",
              "value": 3,
              "unit": "m"
            },
            {
              "label": "Fittings counted",
              "value": 7,
              "unit": "fittings"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "12 m straight run at 3 m span, no fittings",
          "inputs": {
            "runLength": 12,
            "maxSpan": 3,
            "horizontalBends": 0,
            "verticalBends": 0,
            "tees": 0,
            "crosses": 0,
            "expansionConnectors": 0,
            "supportsPerFitting": "2"
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "supports",
          "confidence": "high",
          "steps": [
            {
              "label": "Supports along the straight run",
              "value": 5,
              "unit": "supports"
            },
            {
              "label": "Extra supports at bends, tees and crosses",
              "value": 0,
              "unit": "supports"
            },
            {
              "label": "Extra supports at expansion connectors",
              "value": 0,
              "unit": "supports"
            },
            {
              "label": "Spacing achieved between straight-run supports",
              "value": 3,
              "unit": "m"
            },
            {
              "label": "Fittings counted",
              "value": 0,
              "unit": "fittings"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "45 m run at 1.5 m span, single support per fitting",
          "inputs": {
            "runLength": 45,
            "maxSpan": 1.5,
            "horizontalBends": 6,
            "verticalBends": 3,
            "tees": 2,
            "crosses": 1,
            "expansionConnectors": 2,
            "supportsPerFitting": "1"
          },
          "expected": 47,
          "toleranceDecimalPlaces": 0,
          "unit": "supports",
          "confidence": "high",
          "steps": [
            {
              "label": "Supports along the straight run",
              "value": 31,
              "unit": "supports"
            },
            {
              "label": "Extra supports at bends, tees and crosses",
              "value": 12,
              "unit": "supports"
            },
            {
              "label": "Extra supports at expansion connectors",
              "value": 4,
              "unit": "supports"
            },
            {
              "label": "Spacing achieved between straight-run supports",
              "value": 1.5,
              "unit": "m"
            },
            {
              "label": "Fittings counted",
              "value": 12,
              "unit": "fittings"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "cable-voltage-drop-calculator",
      "title": "Cable Voltage Drop Calculator (mm², Copper or Aluminium)",
      "url": "https://craftquantities.com/calculators/electrical/cable-voltage-drop-calculator/",
      "sources": [
        "Bayerische Kabelwerke AG (Bayka), Conductor resistance at 20 °C (68 °F) acc. to EN 60228: maximum DC resistance of plain copper and aluminium conductors, class 1 and 2 — 2.5 mm² copper 7.41 Ω/km (2.26 Ω per 1,000 ft), 16 mm² copper 1.15 (0.351), 25 mm² aluminium 1.20 (0.366) — and of flexible (class 5 and 6) and tinned copper, mostly higher: flexible 2.5 mm² copper 7.98 (2.43), tinned and flexible 8.21 (2.50)",
        "Prysmian 6242Y data sheet (BS 6004 flat twin and earth): maximum conductor temperature 70 °C (158 °F); conductor resistance at 20 °C (68 °F) 18.1, 12.1, 7.41, 4.61, 3.08, 1.83 and 1.15 Ω/km for 1 to 16 mm² (5.52, 3.69, 2.26, 1.41, 0.939, 0.558 and 0.351 Ω per 1,000 ft); current ratings referred to BS 7671 Table 4D5",
        "NBS Handbook 100, Copper Wire Tables (National Bureau of Standards): the annealed copper standard, 0.017241 Ω·mm²/m (10.371 Ω·cmil/ft) at 20 °C (68 °F), with a temperature coefficient of 0.00393 per °C (0.00218 per °F) at 20 °C",
        "NBS Handbook 109, Aluminum Wire Tables (National Bureau of Standards with The Aluminum Association), Table 1: EC-H19 aluminium at 61.0% IACS, 0.028264 Ω·mm²/m (17.002 Ω·cmil/ft) at 20 °C (68 °F), temperature coefficient 0.00403 per °C (0.00224 per °F) at 20 °C",
        "Voltage drop from resistance: a single-phase or DC circuit loses I × R on the way out and again on the way back, 2 × R per metre; a balanced three-phase circuit loses √3 × R per metre between lines. Ω/km is numerically mV/A per metre, and 0.3048 times it is mV/A per foot"
      ],
      "vectors": [
        {
          "name": "the opening: 2.5 mm² copper at 70 °C (158 °F), 20 m (65.6 ft) at 20 A single phase drops 7.09 V",
          "inputs": {
            "material": "copper",
            "size": "2.5",
            "conductorTemp": "70",
            "phase": "single",
            "length": 20,
            "current": 20,
            "voltage": "230"
          },
          "expected": 7.092852,
          "toleranceDecimalPlaces": 4,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 3.0838486956521733,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 222.907148,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 2.5,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 17.732129999999998
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 8.866064999999999
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 7.41
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "the same 2.5 mm² run at 75 °C (167 °F), the opening for other markets: 7.21 V",
          "inputs": {
            "material": "copper",
            "size": "2.5",
            "conductorTemp": "75",
            "phase": "single",
            "length": 20,
            "current": 20,
            "voltage": "230"
          },
          "expected": 7.209337,
          "toleranceDecimalPlaces": 4,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 3.1344944347826087,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 222.7906628,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 2.5,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 18.023343
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 9.0116715
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 7.41
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "three phase against single phase: 16 mm² copper at 90 °C (194 °F), 50 m (164 ft), 32 A three phase drops 4.06 V",
          "inputs": {
            "material": "copper",
            "size": "16",
            "conductorTemp": "90",
            "phase": "three",
            "length": 50,
            "current": 32,
            "voltage": "400"
          },
          "expected": 4.06371,
          "toleranceDecimalPlaces": 4,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 1.0159274729762946,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 395.9362901080948,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 16,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 2.5398186824407363
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 1.466365
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 1.15
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "the same run single phase drops 2/√3 times as much: 4.69 V",
          "inputs": {
            "material": "copper",
            "size": "16",
            "conductorTemp": "90",
            "phase": "single",
            "length": 50,
            "current": 32,
            "voltage": "230"
          },
          "expected": 4.692368,
          "toleranceDecimalPlaces": 4,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 2.0401599999999998,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 225.307632,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 16,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 2.93273
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 1.466365
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 1.15
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "aluminium against copper at 25 mm², 70 °C (158 °F), 30 m (98.4 ft), 63 A: aluminium 5.45 V",
          "inputs": {
            "material": "aluminium",
            "size": "25",
            "conductorTemp": "70",
            "phase": "single",
            "length": 30,
            "current": 63,
            "voltage": "230"
          },
          "expected": 5.450004,
          "toleranceDecimalPlaces": 4,
          "unit": "V",
          "confidence": "medium",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 2.369566956521739,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 224.549996,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 25,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 2.8836
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 1.4418
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 1.2
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "copper on the same 25 mm² run: 3.29 V",
          "inputs": {
            "material": "copper",
            "size": "25",
            "conductorTemp": "70",
            "phase": "single",
            "length": 30,
            "current": 63,
            "voltage": "230"
          },
          "expected": 3.288054,
          "toleranceDecimalPlaces": 4,
          "unit": "V",
          "confidence": "medium",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 1.4295886043478259,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 226.71194621,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 25,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 1.7397109999999998
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 0.8698554999999999
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 0.727
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "a typed 48 V DC circuit: 10 mm² copper at 70 °C (158 °F), 10 m (32.8 ft), 40 A drops 1.75 V",
          "inputs": {
            "material": "copper",
            "size": "10",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 40,
            "voltage": "other",
            "customVoltage": 48
          },
          "expected": 1.751676,
          "toleranceDecimalPlaces": 4,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 3.6493249999999997,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 46.248324,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 10,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 4.3791899999999995
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 2.1895949999999997
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 1.83
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "no aluminium conductor below 10 mm²",
          "inputs": {
            "material": "aluminium",
            "size": "6",
            "conductorTemp": "70",
            "phase": "single",
            "length": 20,
            "current": 20,
            "voltage": "230"
          },
          "expected": 0,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "low",
          "steps": [
            {
              "label": "Conductor size in mm²",
              "value": 6,
              "unit": "mm²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a 240 V supply loses the same volts as a 230 V one: 7.09 V",
          "inputs": {
            "material": "copper",
            "size": "2.5",
            "conductorTemp": "70",
            "phase": "single",
            "length": 20,
            "current": 20,
            "voltage": "240"
          },
          "expected": 7.092852,
          "toleranceDecimalPlaces": 4,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 2.9553549999999995,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 232.907148,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 2.5,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 17.732129999999998
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 8.866064999999999
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 7.41
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a 415 V three-phase supply: 16 mm² at 90 °C (194 °F), 50 m (164 ft), 32 A drops 4.06 V",
          "inputs": {
            "material": "copper",
            "size": "16",
            "conductorTemp": "90",
            "phase": "three",
            "length": 50,
            "current": 32,
            "voltage": "415"
          },
          "expected": 4.06371,
          "toleranceDecimalPlaces": 4,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.9792072028687177,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 410.9362901080948,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 16,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 2.5398186824407363
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 1.466365
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 1.15
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1 mm² copper, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 4.33133 V",
          "inputs": {
            "material": "copper",
            "size": "1",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 4.33133,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 1.8831869565217392,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 225.66867,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 1,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 43.3133
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 21.65665
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 18.1
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1.5 mm² copper, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 2.89553 V",
          "inputs": {
            "material": "copper",
            "size": "1.5",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 2.89553,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 1.2589260869565218,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 227.10447,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 1.5,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 28.955299999999998
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 14.477649999999999
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 12.1
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "2.5 mm² copper, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 1.773213 V",
          "inputs": {
            "material": "copper",
            "size": "2.5",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 1.773213,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.7709621739130433,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 228.226787,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 2.5,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 17.732129999999998
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 8.866064999999999
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 7.41
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "4 mm² copper, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 1.103173 V",
          "inputs": {
            "material": "copper",
            "size": "4",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 1.103173,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.47964043478260854,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 228.896827,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 4,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 11.03173
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 5.515865
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 4.61
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "6 mm² copper, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 0.737044 V",
          "inputs": {
            "material": "copper",
            "size": "6",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 0.737044,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.3204539130434782,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 229.262956,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 6,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 7.370439999999999
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 3.6852199999999997
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 3.08
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "10 mm² copper, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 0.437919 V",
          "inputs": {
            "material": "copper",
            "size": "10",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 0.437919,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.19039956521739132,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 229.562081,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 10,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 4.3791899999999995
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 2.1895949999999997
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 1.83
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "16 mm² copper, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 0.275195 V",
          "inputs": {
            "material": "copper",
            "size": "16",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 0.275195,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.11964999999999996,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 229.724805,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 16,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 2.7519499999999995
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 1.3759749999999997
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 1.15
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "25 mm² copper, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 0.1739711 V",
          "inputs": {
            "material": "copper",
            "size": "25",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 0.1739711,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "medium",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.07563960869565217,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 229.8260289,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 25,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 1.7397109999999998
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 0.8698554999999999
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 0.727
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "35 mm² copper, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 0.1253932 V",
          "inputs": {
            "material": "copper",
            "size": "35",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 0.1253932,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "medium",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.05451878260869566,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 229.8746068,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 35,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 1.253932
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 0.626966
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 0.524
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "50 mm² copper, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 0.0926091 V",
          "inputs": {
            "material": "copper",
            "size": "50",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 0.0926091,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "medium",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.040264826086956515,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 229.9073909,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 50,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 0.926091
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 0.4630455
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 0.387
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "70 mm² copper, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 0.0641324 V",
          "inputs": {
            "material": "copper",
            "size": "70",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 0.0641324,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "medium",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.027883652173913046,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 229.9358676,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 70,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 0.641324
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 0.320662
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 0.268
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "95 mm² copper, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 0.0461849 V",
          "inputs": {
            "material": "copper",
            "size": "95",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 0.0461849,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "medium",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.020080391304347828,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 229.9538151,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 95,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 0.46184899999999995
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 0.23092449999999998
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 0.193
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "120 mm² copper, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 0.0366129 V",
          "inputs": {
            "material": "copper",
            "size": "120",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 0.0366129,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "medium",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.015918652173913042,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 229.9633871,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 120,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 0.366129
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 0.1830645
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 0.153
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "150 mm² copper, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 0.0296732 V",
          "inputs": {
            "material": "copper",
            "size": "150",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 0.0296732,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "medium",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.012901391304347826,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 229.9703268,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 150,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 0.296732
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 0.148366
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 0.124
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "185 mm² copper, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 0.02371463 V",
          "inputs": {
            "material": "copper",
            "size": "185",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 0.02371463,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "medium",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.010310708695652173,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 229.97628537,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 185,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 0.23714629999999998
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 0.11857314999999999
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 0.0991
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "240 mm² copper, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 0.01804322 V",
          "inputs": {
            "material": "copper",
            "size": "240",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 0.01804322,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "medium",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.007844878260869563,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 229.98195678,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 240,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 0.18043219999999996
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 0.09021609999999998
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 0.0754
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "300 mm² copper, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 0.01438193 V",
          "inputs": {
            "material": "copper",
            "size": "300",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 0.01438193,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "medium",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.00625301304347826,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 229.98561807,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 300,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 0.14381929999999998
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 0.07190964999999999
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 0.0601
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "10 mm² aluminium, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 0.740124 V",
          "inputs": {
            "material": "aluminium",
            "size": "10",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 0.740124,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.3217930434782609,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 229.259876,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 10,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 7.4012400000000005
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 3.7006200000000002
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 3.08
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "16 mm² aluminium, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 0.458973 V",
          "inputs": {
            "material": "aluminium",
            "size": "16",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 0.458973,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.19955347826086955,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 229.541027,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 16,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 4.589729999999999
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 2.2948649999999997
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 1.91
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "25 mm² aluminium, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 0.28836 V",
          "inputs": {
            "material": "aluminium",
            "size": "25",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 0.28836,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "medium",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.12537391304347825,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 229.71164,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 25,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 2.8836
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 1.4418
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 1.2
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "35 mm² aluminium, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 0.2085804 V",
          "inputs": {
            "material": "aluminium",
            "size": "35",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 0.2085804,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "medium",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.0906871304347826,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 229.7914196,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 35,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 2.085804
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 1.042902
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 0.868
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "50 mm² aluminium, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 0.1540323 V",
          "inputs": {
            "material": "aluminium",
            "size": "50",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 0.1540323,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "medium",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.06697056521739131,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 229.8459677,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 50,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 1.540323
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 0.7701615
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 0.641
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "70 mm² aluminium, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 0.1064529 V",
          "inputs": {
            "material": "aluminium",
            "size": "70",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 0.1064529,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "medium",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.0462838695652174,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 229.8935471,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 70,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 1.064529
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 0.5322645
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 0.443
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "95 mm² aluminium, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 0.076896 V",
          "inputs": {
            "material": "aluminium",
            "size": "95",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 0.076896,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "medium",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.03343304347826087,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 229.923104,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 95,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 0.76896
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 0.38448
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 0.32
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "120 mm² aluminium, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 0.0607959 V",
          "inputs": {
            "material": "aluminium",
            "size": "120",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 0.0607959,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "medium",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.026433,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 229.9392041,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 120,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 0.607959
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 0.3039795
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 0.253
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "150 mm² aluminium, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 0.0495018 V",
          "inputs": {
            "material": "aluminium",
            "size": "150",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 0.0495018,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "medium",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.021522521739130437,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 229.9504982,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 150,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 0.49501799999999996
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 0.24750899999999998
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 0.206
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "185 mm² aluminium, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 0.0394092 V",
          "inputs": {
            "material": "aluminium",
            "size": "185",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 0.0394092,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "medium",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.017134434782608694,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 229.9605908,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 185,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 0.394092
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 0.197046
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 0.164
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "240 mm² aluminium, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 0.0300375 V",
          "inputs": {
            "material": "aluminium",
            "size": "240",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 0.0300375,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "medium",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.013059782608695652,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 229.9699625,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 240,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 0.300375
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 0.1501875
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 0.125
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "300 mm² aluminium, 10 m (32.8 ft) at 10 A and 70 °C (158 °F): 0.02403 V",
          "inputs": {
            "material": "aluminium",
            "size": "300",
            "conductorTemp": "70",
            "phase": "single",
            "length": 10,
            "current": 10,
            "voltage": "230"
          },
          "expected": 0.02403,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "medium",
          "steps": [
            {
              "label": "Voltage drop as a share of the supply",
              "value": 0.010447826086956524,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 229.97597,
              "unit": "V"
            },
            {
              "label": "Conductor size in mm²",
              "value": 300,
              "unit": "mm²"
            },
            {
              "label": "Voltage drop per amp per metre (mV/A/m)",
              "value": 0.2403
            },
            {
              "label": "Conductor resistance at the chosen temperature (Ω/km)",
              "value": 0.12015
            },
            {
              "label": "IEC 60228 resistance at 20 °C (68 °F), Ω/km",
              "value": 0.1
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "carpet-cushion-roll-calculator",
      "title": "Carpet Cushion Roll Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/carpet-cushion-roll-calculator/",
      "sources": [
        "CRI 104, Standard for Installation of Commercial Carpet, and CRI 105, Standard for Installation of Residential Carpet — the installation standards that govern cushion selection, seam placement and its relationship to the carpet above it",
        "Rolls = ceil((area × (1 + cut allowance) ÷ cushion roll width) ÷ cushion roll length). Cushion roll width and length are PRODUCT dimensions and are entered from the data sheet rather than assumed."
      ],
      "vectors": [
        {
          "name": "45 m² on 1.83 m rolls with an 8% allowance",
          "inputs": {
            "floorArea": 45,
            "cushionRollWidth": 1.83,
            "cushionRollLength": 13.7,
            "wastePercent": 8
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Cushion to be run out",
              "value": 26.557377049180328,
              "unit": "m"
            },
            {
              "label": "Area including the cut allowance",
              "value": 48.6,
              "unit": "m²"
            },
            {
              "label": "Coverage from one roll",
              "value": 25.070999999999998,
              "unit": "m²"
            }
          ],
          "includesAllowance": {
            "label": "Cut allowance",
            "percent": 8
          },
          "basis": "ambiguous"
        },
        {
          "name": "62 m² on wider 2.0 m rolls with a 12% allowance",
          "inputs": {
            "floorArea": 62,
            "cushionRollWidth": 2,
            "cushionRollLength": 27.4,
            "wastePercent": 12
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Cushion to be run out",
              "value": 34.720000000000006,
              "unit": "m"
            },
            {
              "label": "Area including the cut allowance",
              "value": 69.44000000000001,
              "unit": "m²"
            },
            {
              "label": "Coverage from one roll",
              "value": 54.8,
              "unit": "m²"
            }
          ],
          "includesAllowance": {
            "label": "Cut allowance",
            "percent": 8
          },
          "basis": "ambiguous"
        },
        {
          "name": "120 m² whole-floor job on 1.83 m rolls",
          "inputs": {
            "floorArea": 120,
            "cushionRollWidth": 1.83,
            "cushionRollLength": 13.7,
            "wastePercent": 8
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Cushion to be run out",
              "value": 70.81967213114756,
              "unit": "m"
            },
            {
              "label": "Area including the cut allowance",
              "value": 129.60000000000002,
              "unit": "m²"
            },
            {
              "label": "Coverage from one roll",
              "value": 25.070999999999998,
              "unit": "m²"
            }
          ],
          "includesAllowance": {
            "label": "Cut allowance",
            "percent": 8
          },
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "carpet-roll-length-calculator",
      "title": "Carpet Roll Length & Waste Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/carpet-roll-length-calculator/",
      "sources": [
        "Roll length needed = (room area × (1 + waste allowance)) ÷ standard roll width, accounting for seaming, pattern matching, and pile direction waste"
      ],
      "vectors": [
        {
          "name": "20m² room, 3.66m roll, 10% waste",
          "inputs": {
            "roomArea": 20,
            "rollWidth": 3.66,
            "wastePercent": 10
          },
          "expected": 6.01,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30m² room, 3.66m roll, 15% waste",
          "inputs": {
            "roomArea": 30,
            "rollWidth": 3.66,
            "wastePercent": 15
          },
          "expected": 9.43,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "carpet-seam-tape-calculator",
      "title": "Carpet Seam Tape and Sealer Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/carpet-seam-tape-calculator/",
      "sources": [
        "CRI 104, Standard for Installation of Commercial Carpet, and CRI 105, Standard for Installation of Residential Carpet — the standards covering seam construction, hot-melt seaming and the sealing of cut edges",
        "BS 5325, Installation of textile floor coverings — Code of practice — the equivalent UK guidance on seaming and edge treatment",
        "Rolls = ceil(seam length × (1 + waste) ÷ tape roll length); sealer tubes = ceil(the same length ÷ the sealer's own stated coverage per tube)."
      ],
      "vectors": [
        {
          "name": "48 m of seam on 30.5 m rolls at 10% waste",
          "inputs": {
            "seamLength": 48,
            "tapeRollLength": 30.5,
            "wastePercent": 10,
            "sealerCoverage": 30
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Latex seam sealer tubes",
              "value": 2,
              "unit": "tubes"
            },
            {
              "label": "Tape to be laid, allowance included",
              "value": 52.800000000000004,
              "unit": "m"
            },
            {
              "label": "Tape left on the last roll",
              "value": 8.199999999999996,
              "unit": "m"
            }
          ],
          "includesAllowance": {
            "label": "Seam overrun and re-cut allowance",
            "percent": 10
          },
          "basis": "ambiguous"
        },
        {
          "name": "75 m of seam on longer 45.7 m rolls at 15% waste",
          "inputs": {
            "seamLength": 75,
            "tapeRollLength": 45.7,
            "wastePercent": 15,
            "sealerCoverage": 30
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Latex seam sealer tubes",
              "value": 3,
              "unit": "tubes"
            },
            {
              "label": "Tape to be laid, allowance included",
              "value": 86.25,
              "unit": "m"
            },
            {
              "label": "Tape left on the last roll",
              "value": 5.150000000000006,
              "unit": "m"
            }
          ],
          "includesAllowance": {
            "label": "Seam overrun and re-cut allowance",
            "percent": 10
          },
          "basis": "ambiguous"
        },
        {
          "name": "120 m of seam across a commercial floor",
          "inputs": {
            "seamLength": 120,
            "tapeRollLength": 30.5,
            "wastePercent": 10,
            "sealerCoverage": 30
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Latex seam sealer tubes",
              "value": 5,
              "unit": "tubes"
            },
            {
              "label": "Tape to be laid, allowance included",
              "value": 132,
              "unit": "m"
            },
            {
              "label": "Tape left on the last roll",
              "value": 20.5,
              "unit": "m"
            }
          ],
          "includesAllowance": {
            "label": "Seam overrun and re-cut allowance",
            "percent": 10
          },
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "castellated-beam-net-shear-calculator",
      "title": "Castellated Beam Web Opening Net-Section Shear Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/castellated-beam-net-shear-calculator/",
      "sources": [
        "Basic net-section shear check: Vn = 0.6×Fy×Aw, where Aw = (beam depth − opening height) × web thickness. This is a starting-point screening check only — full castellated beam design also requires Vierendeel bending and web-post buckling checks (AISC Design Guide 31 / SCI P100), which are geometry-dependent, multi-step procedures with no single general formula and are NOT covered by this calculator."
      ],
      "vectors": [
        {
          "name": "Fy345 MPa, depth500, opening300, tw8",
          "inputs": {
            "yieldStrength": 345000000,
            "beamDepth": 0.5,
            "openingHeight": 0.3,
            "webThickness": 0.008
          },
          "expected": 331.2,
          "toleranceDecimalPlaces": -1,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Net web area at opening",
              "value": 1600,
              "unit": "mm²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Fy250 MPa, depth600, opening400, tw10",
          "inputs": {
            "yieldStrength": 250000000,
            "beamDepth": 0.6,
            "openingHeight": 0.4,
            "webThickness": 0.01
          },
          "expected": 300,
          "toleranceDecimalPlaces": -1,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Net web area at opening",
              "value": 2000,
              "unit": "mm²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "catch-can-distribution-uniformity-calculator",
      "title": "Catch-Can Test Uniformity and Rate Calculator",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/catch-can-distribution-uniformity-calculator/",
      "sources": [
        "ISO 15886-3, Agricultural irrigation equipment — Sprinklers — Part 3: Characterization of distribution and test methods — sets out how sprinkler distribution is characterised under test",
        "ASABE/ICC 802, Landscape Irrigation Sprinkler and Emitter Standard — the reference frame for the published nozzle data a catch-can test is checking against",
        "Low-quarter distribution uniformity = mean catch of the lowest-scoring quarter of the cans ÷ mean catch of all cans; measured rate = mean catch volume ÷ can throat area ÷ test duration",
        "Catch volumes are entered in millilitres because that is the graduation a catch-can audit is read at in every market — the millilitre here belongs to the method rather than to a display preference, in the same way that a fixed test area belongs to the test that defines it"
      ],
      "vectors": [
        {
          "name": "68 mL average, 52 mL low quarter, 100 mm cans, 15 minute run",
          "inputs": {
            "averageCatchVolume": 68,
            "lowQuarterCatchVolume": 52,
            "canThroatDiameter": 0.1,
            "runMinutes": 15,
            "canCount": 24
          },
          "expected": 34.6321,
          "toleranceDecimalPlaces": 3,
          "unit": "mm/h",
          "confidence": "high",
          "steps": [
            {
              "label": "Low-quarter distribution uniformity",
              "value": 76.47058823529412,
              "unit": "%"
            },
            {
              "label": "Average catch depth over the test run",
              "value": 8.658028904199107,
              "unit": "mm"
            },
            {
              "label": "Run-time multiplier implied by the uniformity",
              "value": 1.3076923076923077,
              "unit": "multiplier"
            },
            {
              "label": "Throat area of one can",
              "value": 0.007853981633974483,
              "unit": "m²"
            },
            {
              "label": "Cans forming the low quarter",
              "value": 6,
              "unit": "cans"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "100 mL average in 150 mm cans over a 30 minute run",
          "inputs": {
            "averageCatchVolume": 100,
            "lowQuarterCatchVolume": 70,
            "canThroatDiameter": 0.15,
            "runMinutes": 30,
            "canCount": 36
          },
          "expected": 11.3177,
          "toleranceDecimalPlaces": 3,
          "unit": "mm/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Low-quarter distribution uniformity",
              "value": 70,
              "unit": "%"
            },
            {
              "label": "Average catch depth over the test run",
              "value": 5.6588424210451675,
              "unit": "mm"
            },
            {
              "label": "Run-time multiplier implied by the uniformity",
              "value": 1.4285714285714286,
              "unit": "multiplier"
            },
            {
              "label": "Throat area of one can",
              "value": 0.017671458676442587,
              "unit": "m²"
            },
            {
              "label": "Cans forming the low quarter",
              "value": 9,
              "unit": "cans"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "caulk-sealant-calculator",
      "title": "Caulk & Sealant Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/caulk-sealant-calculator/",
      "sources": [
        "A standard 10.1 oz tube of caulk covers approximately 25 linear ft when applied as a 1/4 in bead"
      ],
      "vectors": [
        {
          "name": "1 door, 80x34 in",
          "inputs": {
            "openingHeight": 2.032,
            "openingWidth": 0.864,
            "openingCount": 1,
            "wastePercent": 10
          },
          "expected": 1,
          "toleranceDecimalPlaces": 0,
          "unit": "tubes",
          "confidence": "high",
          "steps": [
            {
              "label": "Caulk bead length (with waste)",
              "value": 20.902887139107612,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "4 windows, 1.2x0.9m",
          "inputs": {
            "openingHeight": 1.2,
            "openingWidth": 0.9,
            "openingCount": 4,
            "wastePercent": 10
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "tubes",
          "confidence": "high",
          "steps": [
            {
              "label": "Caulk bead length (with waste)",
              "value": 60.629921259842526,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cavity-barrier-crossing-count-calculator",
      "title": "Cavity Barrier Run and Crossing Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/cavity-barrier-crossing-count-calculator/",
      "sources": [
        "A barrier line is quantified twice — once as a length, which is what it is bought as, and in crossings, which is what it costs to install. Barrier length = elevation width × number of lines + the perimeter run around openings; crossings = carrier members intersecting the line × number of lines",
        "Sealing a crossing is a PERIMETER problem, not an area one: the seal is the annular gap around the member, so its volume = the member's perimeter × the gap width × the seal depth",
        "Which carrier arrangement is in use decides the crossing count entirely, and it is a question for the facade system rather than for the fire strategy — continuous rails cross every line, storey-height rails let the barrier run past unbroken, and a barrier behind the rail is crossed only by the bracket arms"
      ],
      "vectors": [
        {
          "name": "24 m elevation, 4 lines, rails at 600 through the barrier, 10% waste",
          "inputs": {
            "elevationWidth": 24,
            "barrierLines": 4,
            "openingPerimeter": 0,
            "carrierCase": "continuous",
            "railCentres": 0.6,
            "bracketsPerRail": 2,
            "crossingPerimeter": 0.32,
            "sealGap": 0.015,
            "sealDepth": 0.025,
            "wasteAllowance": 10
          },
          "expected": 105.6,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Crossings to cut and seal",
              "value": 164,
              "unit": "crossings"
            },
            {
              "label": "Barrier run before waste",
              "value": 96,
              "unit": "m"
            },
            {
              "label": "Rails crossing each line",
              "value": 41,
              "unit": "rails"
            },
            {
              "label": "Sealant at the crossings",
              "value": 19.68,
              "unit": "L"
            },
            {
              "label": "Seal volume at one crossing",
              "value": 119.99999999999999,
              "unit": "cm³"
            }
          ],
          "includesAllowance": {
            "label": "Cutting and lap allowance",
            "percent": 10
          },
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Same facade with storey-height rails — no crossings, and 36 m around openings",
          "inputs": {
            "elevationWidth": 24,
            "barrierLines": 4,
            "openingPerimeter": 36,
            "carrierCase": "storey",
            "railCentres": 0.6,
            "bracketsPerRail": 2,
            "crossingPerimeter": 0.32,
            "sealGap": 0.015,
            "sealDepth": 0.025,
            "wasteAllowance": 10
          },
          "expected": 145.2,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Crossings to cut and seal",
              "value": 0,
              "unit": "crossings"
            },
            {
              "label": "Barrier run before waste",
              "value": 132,
              "unit": "m"
            },
            {
              "label": "Rails crossing each line",
              "value": 41,
              "unit": "rails"
            },
            {
              "label": "Sealant at the crossings",
              "value": 0,
              "unit": "L"
            },
            {
              "label": "Seal volume at one crossing",
              "value": 119.99999999999999,
              "unit": "cm³"
            }
          ],
          "includesAllowance": {
            "label": "Cutting and lap allowance",
            "percent": 10
          },
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Barrier behind the rail, two bracket arms per rail per line",
          "inputs": {
            "elevationWidth": 12,
            "barrierLines": 2,
            "openingPerimeter": 0,
            "carrierCase": "bracket",
            "railCentres": 0.6,
            "bracketsPerRail": 2,
            "crossingPerimeter": 0.16,
            "sealGap": 0.015,
            "sealDepth": 0.025,
            "wasteAllowance": 0
          },
          "expected": 24,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Crossings to cut and seal",
              "value": 84,
              "unit": "crossings"
            },
            {
              "label": "Barrier run before waste",
              "value": 24,
              "unit": "m"
            },
            {
              "label": "Rails crossing each line",
              "value": 21,
              "unit": "rails"
            },
            {
              "label": "Sealant at the crossings",
              "value": 5.039999999999999,
              "unit": "L"
            },
            {
              "label": "Seal volume at one crossing",
              "value": 59.99999999999999,
              "unit": "cm³"
            }
          ],
          "includesAllowance": {
            "label": "Cutting and lap allowance",
            "percent": 0
          },
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cavity-drainage-mat-calculator",
      "title": "Cavity Wall Drainage Mat Area Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/cavity-drainage-mat-calculator/",
      "sources": [
        "Drainage mat coverage matches the wall's cavity area, with a waste allowance for roll overlap and cutting around ties and openings"
      ],
      "vectors": [
        {
          "name": "30m² wall, 10% waste",
          "inputs": {
            "wallArea": 30,
            "wasteFactorPercent": 10
          },
          "expected": 33,
          "toleranceDecimalPlaces": 0,
          "unit": "m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "50m² wall, 15% waste",
          "inputs": {
            "wallArea": 50,
            "wasteFactorPercent": 15
          },
          "expected": 57.5,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cavity-drainage-vent-calculator",
      "title": "Brick Veneer Cavity Drainage Vent Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/cavity-drainage-vent-calculator/",
      "sources": [
        "Vent count = ceil(wall length ÷ vent spacing) + 1, following standard drainage-cavity ventilation spacing practice (commonly 24 in / 0.61 m o.c.) to allow airflow behind the veneer for moisture management"
      ],
      "vectors": [
        {
          "name": "30m wall, 0.61m spacing",
          "inputs": {
            "wallLength": 30,
            "ventSpacing": 0.61
          },
          "expected": 51,
          "toleranceDecimalPlaces": 0,
          "unit": "vents",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "45m wall, 0.61m spacing",
          "inputs": {
            "wallLength": 45,
            "ventSpacing": 0.61
          },
          "expected": 75,
          "toleranceDecimalPlaces": 0,
          "unit": "vents",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cavity-fill-volume-calculator",
      "title": "Cavity Wall & Stud Bay Insulation Fill Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/cavity-fill-volume-calculator/",
      "sources": [
        "BBA Agrément Certificate 11/4857, Product Sheet 2 Issue 4 (12 December 2023), Knauf Insulation Supafil 34 (Retrofit): a site assessment by a trained assessor before installation (A.1); target mean installed density 25 kg/m³ (±5) over the whole wall (9.1.4); bales of about 15.5 kg (11.1); nominal cavity not less than 50 mm, and over 200 mm referred to the certificate holder (9.1.2, 9.1.3); 22 mm holes in a diamond pattern at about 1.35 m centres, bottom row about 800 mm above the DPC, top holes within 350 mm of the top and not more than 1 m apart, extra holes under cills and around features (A.5); ventilation openings and flues sleeved before and checked after (9.1.5, A.7); up to 12 m without a waiver (9.1.14)",
        "BBA Agrément Certificate 88/2033, Product Sheet 1, fourth issue (26 July 2021), Knauf Insulation Supafil 40: target mean installed density 18 kg/m³ (section 1.2) and bales of about 17.6 kg (section 3.1) — a second product from the same maker, which is why the density and the bag mass are the certificate's, not the page's",
        "BBA Agrément Certificate 04/4167, Product Sheet 1, third issue (4 June 2020), Springvale Ecobead Platinum bonded EPS bead: target mean installed density 12 kg/m³ (±2) (section 1.2); 22 mm holes at about 600 mm intervals, holes about 250 mm below openings and between them, rows not more than 2.5 m apart (18.1–18.3); bead delivered in sacks or bulk containers (3.1)",
        "GreenFiber INS515LD application coverage chart (manufacturer's data sheet): 30 lb nominal bag, minimum net weight 28.5 lb; dry dense-pack sidewall at 3.5 pcf minimum installed density; a 2x4 wall at 3.5 in takes 1.02 lb/ft², 29.39 ft² a bag before framing and 32.4 ft² at 16 in centres; framing factor 9.375% at 16 in centres and 6.25% at 24 in",
        "US DOE Building America Solution Center (PNNL): 'Dense-Pack Insulation' — cellulose dense-packed at 3.5 to 4.5 lb/ft³ (56 to 72 kg/m³); 'Blown Insulation for Cavities of Existing Exterior Walls' — a 1 in or 2 in hole in the centre of each stud cavity about 6 in below the ceiling, an additional hole below any blocking, and knob-and-tube wiring not to be surrounded by insulation",
        "Ofgem / ECO Reporting Working Group, Guidance on suitable photographic evidence of retrofitted CWI, Version 1.0 (October 2020): standard drill holes of approximately 18–25 mm in the mortar joints, a pattern determined by the product manufacturer or certification body, concentrated round windows and doors and under waste pipes and vents; lance installations drilled at the corners of elevations, typically 27–40 mm",
        "BS 8208-1:1985, Guide to assessment of suitability of external cavity walls for filling with thermal insulants — Part 1: Existing traditional cavity construction — withdrawn by BSI on 1 July 2009 and still cited in Approved Document D (1992 edition incorporating the 2002 and 2010 amendments) for foam fill; the withdrawn guide behind the survey this page leaves to the installer",
        "NFPA 70, National Electrical Code, Article 394.12 — concealed knob-and-tube wiring is not permitted in hollow wall spaces insulated by loose, rolled or foamed-in-place insulation that envelops the conductors",
        "US EPA Renovation, Repair and Painting Rule, 40 CFR Part 745 Subpart E: the rule applies to renovations performed for compensation in target housing (§745.82), and work in housing built before 1978 that disturbs more than 20 sq ft of painted exterior surface is not minor repair (§745.83)",
        "The Building Regulations 2010 (England), regulation 3(1)(e): the insertion of insulating material into the cavity wall of a building is building work; the Cavity Insulation Guarantee Agency (CIGA) registers the guarantee a UK installer issues"
      ],
      "vectors": [
        {
          "name": "UK opening: 10 x 2.4 m wall, 4 m² of openings, 65 mm cavity, Supafil 34 in 15.5 kg bales",
          "inputs": {
            "wallLength": 10,
            "wallHeight": 2.4,
            "openingsArea": 4,
            "openingsCount": 3,
            "cavityWidth": 0.065,
            "studThickness": 0,
            "holeSpacing": 1.35,
            "rowSpacing": 1.35,
            "extraHolesPerOpening": 2,
            "installedDensity": 25,
            "bagMass": 15.5,
            "wastePercent": 0
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "bags",
          "confidence": "high",
          "steps": [
            {
              "label": "Wall area to fill, openings deducted",
              "value": 20,
              "unit": "m²"
            },
            {
              "label": "Fill area, stud faces deducted",
              "value": 20,
              "unit": "m²"
            },
            {
              "label": "Fill volume",
              "value": 45.90906673793516,
              "unit": "ft³"
            },
            {
              "label": "Fill mass at the installed density, allowance included",
              "value": 32.5,
              "unit": "kg"
            },
            {
              "label": "Holes along each row",
              "value": 8,
              "unit": "holes"
            },
            {
              "label": "Rows of holes up the wall",
              "value": 2,
              "unit": "rows"
            },
            {
              "label": "Extra holes at openings",
              "value": 6,
              "unit": "holes"
            },
            {
              "label": "Injection holes in all",
              "value": 22,
              "unit": "holes"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The same wall in Supafil 40: 18 kg/m³ from 17.6 kg bales",
          "inputs": {
            "wallLength": 10,
            "wallHeight": 2.4,
            "openingsArea": 4,
            "openingsCount": 3,
            "cavityWidth": 0.065,
            "studThickness": 0,
            "holeSpacing": 1.35,
            "rowSpacing": 1.35,
            "extraHolesPerOpening": 2,
            "installedDensity": 18,
            "bagMass": 17.6,
            "wastePercent": 0
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "bags",
          "confidence": "high",
          "steps": [
            {
              "label": "Wall area to fill, openings deducted",
              "value": 20,
              "unit": "m²"
            },
            {
              "label": "Fill area, stud faces deducted",
              "value": 20,
              "unit": "m²"
            },
            {
              "label": "Fill volume",
              "value": 45.90906673793516,
              "unit": "ft³"
            },
            {
              "label": "Fill mass at the installed density, allowance included",
              "value": 23.400000000000002,
              "unit": "kg"
            },
            {
              "label": "Holes along each row",
              "value": 8,
              "unit": "holes"
            },
            {
              "label": "Rows of holes up the wall",
              "value": 2,
              "unit": "rows"
            },
            {
              "label": "Extra holes at openings",
              "value": 6,
              "unit": "holes"
            },
            {
              "label": "Injection holes in all",
              "value": 22,
              "unit": "holes"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "GreenFiber's own case: 100 sq ft of 2x4 wall at 16 in centres, 3.5 pcf, 30 lb bags",
          "inputs": {
            "wallLength": 3.81,
            "wallHeight": 2.4384,
            "openingsArea": 0,
            "openingsCount": 0,
            "cavityWidth": 0.0889,
            "studThickness": 0.0381,
            "holeSpacing": 0.4064,
            "rowSpacing": 2.4384,
            "extraHolesPerOpening": 2,
            "installedDensity": 56.06462,
            "bagMass": 13.607771,
            "wastePercent": 0
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "bags",
          "confidence": "high",
          "steps": [
            {
              "label": "Wall area to fill, openings deducted",
              "value": 9.290304,
              "unit": "m²"
            },
            {
              "label": "Fill area, stud faces deducted",
              "value": 8.419338000000002,
              "unit": "m²"
            },
            {
              "label": "Fill volume",
              "value": 26.43229166666667,
              "unit": "ft³"
            },
            {
              "label": "Fill mass at the installed density, allowance included",
              "value": 41.963199021756694,
              "unit": "kg"
            },
            {
              "label": "Holes along each row",
              "value": 10,
              "unit": "holes"
            },
            {
              "label": "Rows of holes up the wall",
              "value": 1,
              "unit": "rows"
            },
            {
              "label": "Extra holes at openings",
              "value": 0,
              "unit": "holes"
            },
            {
              "label": "Injection holes in all",
              "value": 10,
              "unit": "holes"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        }
      ]
    },
    {
      "slug": "cavity-wall-weep-hole-calculator",
      "title": "Cavity Wall Weep Hole Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/cavity-wall-weep-hole-calculator/",
      "sources": [
        "Standard cavity/veneer wall practice places weep holes at regular spacing along the wall base directly above flashing, typically every 16-33 in on-center depending on the weep hole type, which is the 406 to 838 mm this page accepts"
      ],
      "vectors": [
        {
          "name": "10m wall, 24in spacing",
          "inputs": {
            "wallLength": 10,
            "weepHoleSpacing": 0.6096
          },
          "expected": 18,
          "toleranceDecimalPlaces": 0,
          "unit": "weep holes",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15m wall, 32in spacing",
          "inputs": {
            "wallLength": 15,
            "weepHoleSpacing": 0.8128
          },
          "expected": 20,
          "toleranceDecimalPlaces": 0,
          "unit": "weep holes",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cd-debris-diversion-rate-calculator",
      "title": "C&D Debris Recycling Diversion Rate Calculator",
      "url": "https://craftquantities.com/calculators/sustainability-compliance/cd-debris-diversion-rate-calculator/",
      "sources": [
        "Diversion rate (%) = Recycled/Salvaged Weight ÷ Total Debris Weight × 100 — the standard metric used in construction waste management plans and green building certification programs (e.g. LEED Materials & Resources credits) to report the fraction of project debris kept out of landfill."
      ],
      "vectors": [
        {
          "name": "15,000 kg recycled of 20,000 kg total",
          "inputs": {
            "recycledWeight": 15000,
            "totalWeight": 20000
          },
          "expected": 75,
          "toleranceDecimalPlaces": 0,
          "unit": "%",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "8,000 kg recycled of 25,000 kg total",
          "inputs": {
            "recycledWeight": 8000,
            "totalWeight": 25000
          },
          "expected": 32,
          "toleranceDecimalPlaces": 0,
          "unit": "%",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "ceiling-control-joint-calculator",
      "title": "Drywall Ceiling Control Joint Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/ceiling-control-joint-calculator/",
      "sources": [
        "Control joints needed = ceil(run length ÷ maximum unbroken span) − 1, since a run shorter than the maximum span needs no interior joint and each additional joint adds one more allowable span"
      ],
      "vectors": [
        {
          "name": "18m run, 9m max span",
          "inputs": {
            "runLength": 18,
            "maxSpacing": 9
          },
          "expected": 1,
          "toleranceDecimalPlaces": 0,
          "unit": "control joints",
          "confidence": "medium",
          "steps": [
            {
              "label": "Ceiling panels the joints divide it into",
              "value": 2
            },
            {
              "label": "Panel length between joints",
              "value": 9,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "27m run, 9m max span",
          "inputs": {
            "runLength": 27,
            "maxSpacing": 9
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "control joints",
          "confidence": "medium",
          "steps": [
            {
              "label": "Ceiling panels the joints divide it into",
              "value": 3
            },
            {
              "label": "Panel length between joints",
              "value": 9,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "ceiling-fan-size-calculator",
      "title": "Ceiling Fan Size Calculator",
      "url": "https://craftquantities.com/calculators/electrical/ceiling-fan-size-calculator/",
      "sources": [
        "Commonly published ceiling fan sizing chart: under 75 sq ft = 29-36 in, 75-144 sq ft = 36-42 in, 145-225 sq ft = 44 in, 226-400 sq ft = 50-54 in, over 400 sq ft = 56+ in"
      ],
      "vectors": [
        {
          "name": "10m² room",
          "inputs": {
            "roomArea": 10
          },
          "expected": 39,
          "toleranceDecimalPlaces": 0,
          "unit": "in (36-42 in)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Room area",
              "value": 107.63910416709722,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "25m² room",
          "inputs": {
            "roomArea": 25
          },
          "expected": 52,
          "toleranceDecimalPlaces": 0,
          "unit": "in (50-54 in)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Room area",
              "value": 269.097760417743,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "exactly 75 sq ft — the chart says 'under 75', so this is the next band up",
          "inputs": {
            "roomArea": 6.967728
          },
          "expected": 39,
          "toleranceDecimalPlaces": 0,
          "unit": "in (36-42 in)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Room area",
              "value": 75,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "74 sq ft is still the smallest fan",
          "inputs": {
            "roomArea": 6.87482496
          },
          "expected": 32.5,
          "toleranceDecimalPlaces": 1,
          "unit": "in (29-36 in)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Room area",
              "value": 73.99999999999999,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "exactly 225 sq ft — an inclusive top, and a floating-point trap",
          "inputs": {
            "roomArea": 20.903184
          },
          "expected": 44,
          "toleranceDecimalPlaces": 0,
          "unit": "in (44 in)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Room area",
              "value": 224.99999999999997,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "ceiling-joist-linear-footage-calculator",
      "title": "Ceiling Joist Spanning Lineal Lumber Aggregator",
      "url": "https://craftquantities.com/calculators/materials-quantities/ceiling-joist-linear-footage-calculator/",
      "sources": [
        "Joist count = ceil(building length ÷ spacing) + 1, so a joist lands at each end wall; total linear length = joist count × building width (span)"
      ],
      "vectors": [
        {
          "name": "10m x 6m building, 16in o.c.",
          "inputs": {
            "buildingLength": 10,
            "buildingWidth": 6,
            "joistSpacing": 0.4064
          },
          "expected": 156,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Number of joists",
              "value": 26
            },
            {
              "label": "Whole bays between joists",
              "value": 24
            },
            {
              "label": "Short bay at the last joist",
              "value": 9.700787401574814,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "12m x 8m building, 24in o.c.",
          "inputs": {
            "buildingLength": 12,
            "buildingWidth": 8,
            "joistSpacing": 0.6096
          },
          "expected": 168,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Number of joists",
              "value": 21
            },
            {
              "label": "Whole bays between joists",
              "value": 19
            },
            {
              "label": "Short bay at the last joist",
              "value": 16.44094488188972,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "ceiling-paint-calculator",
      "title": "Ceiling Paint Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/ceiling-paint-calculator/",
      "sources": [
        "Paint needed = area × coats ÷ spread rate — the loss-free identity every coating quantity starts from, with the spread rate taken from the product's own data sheet or tin",
        "Ceiling paints are rated per coat on a smooth, sealed surface: commonly about 300 to 450 sq ft per gallon (7.4 to 11 m² per litre) in North America, and often up to 13 to 17 m² per litre for UK and European matt emulsions; a porous or textured surface takes more"
      ],
      "vectors": [
        {
          "name": "a 15 m² ceiling, 2 coats at 12 m²/L",
          "inputs": {
            "ceilingArea": 15,
            "coats": 2,
            "spreadRate": 12
          },
          "expected": 2.5,
          "toleranceDecimalPlaces": 3,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Ceiling area",
              "value": 15,
              "unit": "m²"
            },
            {
              "label": "Area to coat, all coats",
              "value": 30,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a 30 m² ceiling, 1 coat at 10 m²/L",
          "inputs": {
            "ceilingArea": 30,
            "coats": 1,
            "spreadRate": 10
          },
          "expected": 3,
          "toleranceDecimalPlaces": 3,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Ceiling area",
              "value": 30,
              "unit": "m²"
            },
            {
              "label": "Area to coat, all coats",
              "value": 30,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "ceiling-plasterboard-sheet-calculator",
      "title": "Ceiling Plasterboard (Gypsum Board) Sheet Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/ceiling-plasterboard-sheet-calculator/",
      "sources": [
        "Sheet count = ceil((ceiling area ÷ sheet coverage area) × (1 + waste allowance)) — the same coverage method used for wall drywall, applied to a fixed (non-suspended) ceiling"
      ],
      "vectors": [
        {
          "name": "20m² ceiling, 2.88m² sheet, 10% waste",
          "inputs": {
            "ceilingArea": 20,
            "sheetArea": 2.88,
            "wastePercent": 10
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "35m² ceiling, 2.88m² sheet, 15% waste",
          "inputs": {
            "ceilingArea": 35,
            "sheetArea": 2.88,
            "wastePercent": 15
          },
          "expected": 14,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "ceiling-runner-splice-calculator",
      "title": "Drop-Ceiling Main Runner Splice Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/ceiling-runner-splice-calculator/",
      "sources": [
        "Suspended ceiling main runners are manufactured in a standard length (commonly 12 ft / 3.66 m); splices needed per run = ceil(run length ÷ standard runner length) − 1, since the first runner segment needs no splice"
      ],
      "vectors": [
        {
          "name": "10m run, 3.66m runner, 5 parallel runs",
          "inputs": {
            "runLength": 10,
            "standardRunnerLength": 3.66,
            "numberOfRuns": 5
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "splices",
          "confidence": "high",
          "steps": [
            {
              "label": "Splices per run",
              "value": 2
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "14m run, 3.66m runner, 4 parallel runs",
          "inputs": {
            "runLength": 14,
            "standardRunnerLength": 3.66,
            "numberOfRuns": 4
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "splices",
          "confidence": "high",
          "steps": [
            {
              "label": "Splices per run",
              "value": 3
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "ceiling-tile-calculator",
      "title": "Drop Ceiling Tile Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/ceiling-tile-calculator/",
      "sources": [
        "Standard suspended ceiling tiles are 2x2 ft or 2x4 ft; tile count = ceiling area / tile coverage",
        "Setting the grid out: a centred layout puts (room dimension - whole panels x module) / 2 at each edge, which is always under half a panel; taking one whole panel out of the middle adds half a module to each border, which always lands it between a half and a whole"
      ],
      "vectors": [
        {
          "name": "4x3.5m room, 2x2 tiles",
          "inputs": {
            "roomLength": 4,
            "roomWidth": 3.5,
            "tileSize": "2x2"
          },
          "expected": 40,
          "toleranceDecimalPlaces": 0,
          "unit": "tiles",
          "confidence": "high",
          "steps": [
            {
              "label": "Ceiling area",
              "value": 150.6947458339361,
              "unit": "sq ft"
            },
            {
              "label": "Whole panels along the length",
              "value": 6
            },
            {
              "label": "Border at each end of the length",
              "value": 0.1711999999999998,
              "unit": "m"
            },
            {
              "label": "Whole panels across the width",
              "value": 5
            },
            {
              "label": "Border at each side of the width",
              "value": 0.22599999999999998,
              "unit": "m"
            },
            {
              "label": "Lengthways border with one panel taken out",
              "value": 0.4759999999999998,
              "unit": "m"
            },
            {
              "label": "Widthways border with one panel taken out",
              "value": 0.5307999999999999,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "5x4m room, 2x4 tiles",
          "inputs": {
            "roomLength": 5,
            "roomWidth": 4,
            "tileSize": "2x4"
          },
          "expected": 29,
          "toleranceDecimalPlaces": 0,
          "unit": "tiles",
          "confidence": "high",
          "steps": [
            {
              "label": "Ceiling area",
              "value": 215.27820833419443,
              "unit": "sq ft"
            },
            {
              "label": "Whole panels along the length",
              "value": 8
            },
            {
              "label": "Border at each end of the length",
              "value": 0.06159999999999988,
              "unit": "m"
            },
            {
              "label": "Whole panels across the width",
              "value": 6
            },
            {
              "label": "Border at each side of the width",
              "value": 0.1711999999999998,
              "unit": "m"
            },
            {
              "label": "Lengthways border with one panel taken out",
              "value": 0.3663999999999999,
              "unit": "m"
            },
            {
              "label": "Widthways border with one panel taken out",
              "value": 0.4759999999999998,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "4x3.5m room, 2x2 tiles, no border-cut allowance",
          "inputs": {
            "roomLength": 4,
            "roomWidth": 3.5,
            "tileSize": "2x2",
            "wastePercent": 0
          },
          "expected": 38,
          "toleranceDecimalPlaces": 0,
          "unit": "tiles",
          "confidence": "high",
          "steps": [
            {
              "label": "Ceiling area",
              "value": 150.6947458339361,
              "unit": "sq ft"
            },
            {
              "label": "Whole panels along the length",
              "value": 6
            },
            {
              "label": "Border at each end of the length",
              "value": 0.1711999999999998,
              "unit": "m"
            },
            {
              "label": "Whole panels across the width",
              "value": 5
            },
            {
              "label": "Border at each side of the width",
              "value": 0.22599999999999998,
              "unit": "m"
            },
            {
              "label": "Lengthways border with one panel taken out",
              "value": 0.4759999999999998,
              "unit": "m"
            },
            {
              "label": "Widthways border with one panel taken out",
              "value": 0.5307999999999999,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "5x4m room, 2x4 tiles laid across the width",
          "inputs": {
            "roomLength": 5,
            "roomWidth": 4,
            "tileSize": "2x4",
            "panelDirection": "width"
          },
          "expected": 29,
          "toleranceDecimalPlaces": 0,
          "unit": "tiles",
          "confidence": "high",
          "steps": [
            {
              "label": "Ceiling area",
              "value": 215.27820833419443,
              "unit": "sq ft"
            },
            {
              "label": "Whole panels along the length",
              "value": 8
            },
            {
              "label": "Border at each end of the length",
              "value": 0.06159999999999988,
              "unit": "m"
            },
            {
              "label": "Whole panels across the width",
              "value": 3
            },
            {
              "label": "Border at each side of the width",
              "value": 0.1711999999999998,
              "unit": "m"
            },
            {
              "label": "Lengthways border with one panel taken out",
              "value": 0.3663999999999999,
              "unit": "m"
            },
            {
              "label": "Widthways border with one panel taken out",
              "value": 0.7807999999999998,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "ceiling-wall-angle-linear-footage-calculator",
      "title": "Suspended Ceiling Wall Angle Take-Off",
      "url": "https://craftquantities.com/calculators/materials-quantities/ceiling-wall-angle-linear-footage-calculator/",
      "sources": [
        "ASTM C636/C636M, Standard Practice for Installation of Metal Ceiling Suspension Systems for Acoustical Tile and Lay-In Panels, is the installation standard covering the suspension system and its support at the room perimeter",
        "BS EN 13964, Suspended ceilings — Requirements and test methods, sets the equivalent requirements in European practice, including the perimeter conditions the grid is fixed against",
        "Piece count is plain geometry rather than a published rule: a closed perimeter breaks into as many runs as it has corners, and no run can be made from fewer than one stock length however short it is"
      ],
      "vectors": [
        {
          "name": "8 x 6 m room, four corners, 12 ft stock, 10% waste",
          "inputs": {
            "roomLength": 8,
            "roomWidth": 6,
            "extraPerimeter": 0,
            "internalReturns": 4,
            "externalReturns": 0,
            "stockLength": 3.6576,
            "wasteAllowance": 10
          },
          "expected": 9,
          "toleranceDecimalPlaces": 0,
          "unit": "lengths",
          "confidence": "high",
          "steps": [
            {
              "label": "Wall angle required before waste",
              "value": 28,
              "unit": "m"
            },
            {
              "label": "Wall angle required including waste",
              "value": 30.800000000000004,
              "unit": "m"
            },
            {
              "label": "Runs the perimeter breaks into",
              "value": 4,
              "unit": "runs"
            },
            {
              "label": "Offcut across the whole order",
              "value": 2.118399999999994,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "2.5 x 2 m store room — the corner count governs, not the footage",
          "inputs": {
            "roomLength": 2.5,
            "roomWidth": 2,
            "extraPerimeter": 0,
            "internalReturns": 4,
            "externalReturns": 0,
            "stockLength": 3.6576,
            "wasteAllowance": 10
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "lengths",
          "confidence": "high",
          "steps": [
            {
              "label": "Wall angle required before waste",
              "value": 9,
              "unit": "m"
            },
            {
              "label": "Wall angle required including waste",
              "value": 9.9,
              "unit": "m"
            },
            {
              "label": "Runs the perimeter breaks into",
              "value": 4,
              "unit": "runs"
            },
            {
              "label": "Offcut across the whole order",
              "value": 4.7303999999999995,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "12 x 9 m room with a boxed column and a recess, 3 m stock, 8% waste",
          "inputs": {
            "roomLength": 12,
            "roomWidth": 9,
            "extraPerimeter": 4.8,
            "internalReturns": 6,
            "externalReturns": 2,
            "stockLength": 3,
            "wasteAllowance": 8
          },
          "expected": 17,
          "toleranceDecimalPlaces": 0,
          "unit": "lengths",
          "confidence": "high",
          "steps": [
            {
              "label": "Wall angle required before waste",
              "value": 46.8,
              "unit": "m"
            },
            {
              "label": "Wall angle required including waste",
              "value": 50.544,
              "unit": "m"
            },
            {
              "label": "Runs the perimeter breaks into",
              "value": 8,
              "unit": "runs"
            },
            {
              "label": "Offcut across the whole order",
              "value": 0.45600000000000307,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "celsius-to-fahrenheit-calculator",
      "title": "Celsius to Fahrenheit Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/celsius-to-fahrenheit-calculator/",
      "sources": [
        "Fahrenheit = (Celsius x 9/5) + 32"
      ],
      "vectors": [
        {
          "name": "21 °C converts correctly",
          "inputs": {
            "celsius": 21
          },
          "expected": 69.8,
          "toleranceDecimalPlaces": 6,
          "unit": "°F",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "celsius": 210
          },
          "expected": 410,
          "toleranceDecimalPlaces": 6,
          "unit": "°F",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "centimeters-to-inch-fraction-calculator",
      "title": "Centimetres to Inch Fraction Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/centimeters-to-inch-fraction-calculator/",
      "sources": [
        "International yard and pound agreement (1959): 1 inch = 2.54 cm exactly",
        "The fraction shown is the nearest mark at the chosen denominator; standard tapes are marked to 1/16 in, finer rules and machinist scales to 1/32 in"
      ],
      "vectors": [
        {
          "name": "246 cm is 96.85 in, or 8 ft 0 7/8",
          "inputs": {
            "centimeters": 246,
            "precision": "16"
          },
          "expected": 96.8504,
          "toleranceDecimalPlaces": 3,
          "unit": "in (8 ft 0 7/8 in)",
          "confidence": "high",
          "steps": [
            {
              "label": "Whole feet",
              "value": 8,
              "unit": "ft"
            },
            {
              "label": "Inches in the last foot",
              "value": 0,
              "unit": "in"
            },
            {
              "label": "Error against the exact figure",
              "value": 0.6249999999998579,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "30.48 cm is exactly 12 in",
          "inputs": {
            "centimeters": 30.48,
            "precision": "16"
          },
          "expected": 12,
          "toleranceDecimalPlaces": 6,
          "unit": "in (1 ft 0 in)",
          "confidence": "high",
          "steps": [
            {
              "label": "Whole feet",
              "value": 1,
              "unit": "ft"
            },
            {
              "label": "Inches in the last foot",
              "value": 0,
              "unit": "in"
            },
            {
              "label": "Error against the exact figure",
              "value": 0,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A metre is 39.37 in",
          "inputs": {
            "centimeters": 100,
            "precision": "32"
          },
          "expected": 39.3701,
          "toleranceDecimalPlaces": 3,
          "unit": "in (3 ft 3 3/8 in)",
          "confidence": "high",
          "steps": [
            {
              "label": "Whole feet",
              "value": 3,
              "unit": "ft"
            },
            {
              "label": "Inches in the last foot",
              "value": 3,
              "unit": "in"
            },
            {
              "label": "Error against the exact figure",
              "value": 0.12499999999997158,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Zero is zero",
          "inputs": {
            "centimeters": 0,
            "precision": "8"
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "in (0 in)",
          "confidence": "high",
          "steps": [
            {
              "label": "Whole feet",
              "value": 0,
              "unit": "ft"
            },
            {
              "label": "Inches in the last foot",
              "value": 0,
              "unit": "in"
            },
            {
              "label": "Error against the exact figure",
              "value": 0,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "centimeters-to-inches-calculator",
      "title": "Centimetres to Inches Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/centimeters-to-inches-calculator/",
      "sources": [
        "International yard and pound agreement (1959): 1 inch = 2.54 cm exactly"
      ],
      "vectors": [
        {
          "name": "100 cm converts correctly",
          "inputs": {
            "centimeters": 100
          },
          "expected": 39.370078740157474,
          "toleranceDecimalPlaces": 6,
          "unit": "in",
          "confidence": "high",
          "steps": [
            {
              "label": "Whole feet",
              "value": 3,
              "unit": "ft"
            },
            {
              "label": "Inches remaining",
              "value": 3.3700787401574743,
              "unit": "in"
            },
            {
              "label": "Same length in millimetres",
              "value": 1000,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "centimeters": 1000
          },
          "expected": 393.70078740157476,
          "toleranceDecimalPlaces": 6,
          "unit": "in",
          "confidence": "high",
          "steps": [
            {
              "label": "Whole feet",
              "value": 32,
              "unit": "ft"
            },
            {
              "label": "Inches remaining",
              "value": 9.700787401574757,
              "unit": "in"
            },
            {
              "label": "Same length in millimetres",
              "value": 10000,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "centimeters-to-millimeters-calculator",
      "title": "Centimetres to Millimetres Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/centimeters-to-millimeters-calculator/",
      "sources": [
        "SI prefixes (BIPM SI Brochure): centi- = 10⁻², milli- = 10⁻³, so 1 cm = 10 mm by definition"
      ],
      "vectors": [
        {
          "name": "12.5 cm converts correctly",
          "inputs": {
            "centimeters": 12.5
          },
          "expected": 125,
          "toleranceDecimalPlaces": 6,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Same length in metres",
              "value": 0.125,
              "unit": "m"
            },
            {
              "label": "Same length in inches",
              "value": 4.921259842519685,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "centimeters": 125
          },
          "expected": 1250,
          "toleranceDecimalPlaces": 6,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Same length in metres",
              "value": 1.25,
              "unit": "m"
            },
            {
              "label": "Same length in inches",
              "value": 49.21259842519685,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cfm-to-cubic-meters-per-hour-calculator",
      "title": "CFM to Cubic Metres per Hour Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/cfm-to-cubic-meters-per-hour-calculator/",
      "sources": [
        "1 ft = 0.3048 m exactly, so 1 ft³ = 0.028316846592 m³ exactly. An hour holds 60 minutes, so 1 CFM = 0.028316846592 × 60 = 1.69901079552 m³/h. That is exact and terminating; the 1.699010796 printed in many handbooks is the same number rounded to ten significant figures."
      ],
      "vectors": [
        {
          "name": "1200 CFM converts correctly",
          "inputs": {
            "cfm": 1200
          },
          "expected": 2038.812954624,
          "toleranceDecimalPlaces": 6,
          "unit": "m³/h",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.69901079552,
              "unit": "m³/h per CFM"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cfm": 12000
          },
          "expected": 20388.12954624,
          "toleranceDecimalPlaces": 6,
          "unit": "m³/h",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.69901079552,
              "unit": "m³/h per CFM"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cfm-to-liters-per-second-calculator",
      "title": "CFM to Litres per Second Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/cfm-to-liters-per-second-calculator/",
      "sources": [
        "1 ft = 0.3048 m exactly, so 1 ft³ = 0.3048³ m³ = 28.316846592 L exactly. Spread over the 60 seconds in a minute, 1 CFM = 28.316846592 / 60 = 0.4719474432 L/s. That decimal terminates, so the multiplier used here is the exact value with nothing rounded away."
      ],
      "vectors": [
        {
          "name": "400 CFM converts correctly",
          "inputs": {
            "cfm": 400
          },
          "expected": 188.77897728,
          "toleranceDecimalPlaces": 6,
          "unit": "L/s",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.4719474432,
              "unit": "L/s per CFM"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cfm": 4000
          },
          "expected": 1887.7897728,
          "toleranceDecimalPlaces": 6,
          "unit": "L/s",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.4719474432,
              "unit": "L/s per CFM"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cfm-ventilation-calculator",
      "title": "CFM Ventilation Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/cfm-ventilation-calculator/",
      "sources": [
        "Formula: CFM = (room volume in cubic feet x air changes per hour) / 60",
        "Typical air-changes-per-hour targets vary by room type — kitchens and bathrooms need substantially more than bedrooms due to moisture and odor"
      ],
      "vectors": [
        {
          "name": "Bathroom, 3x2.5x2.4m",
          "inputs": {
            "roomType": "bathroom",
            "roomLength": 3,
            "roomWidth": 2.5,
            "ceilingHeight": 2.4
          },
          "expected": 84.75,
          "toleranceDecimalPlaces": 1,
          "unit": "CFM",
          "confidence": "medium",
          "steps": [
            {
              "label": "Room volume",
              "value": 635.6640009867947,
              "unit": "cu ft"
            },
            {
              "label": "Target air changes/hour",
              "value": 8,
              "unit": "ACH"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Kitchen, 4x3.5x2.4m",
          "inputs": {
            "roomType": "kitchen",
            "roomLength": 4,
            "roomWidth": 3.5,
            "ceilingHeight": 2.4
          },
          "expected": 296.65,
          "toleranceDecimalPlaces": 1,
          "unit": "CFM",
          "confidence": "medium",
          "steps": [
            {
              "label": "Room volume",
              "value": 1186.5728018420168,
              "unit": "cu ft"
            },
            {
              "label": "Target air changes/hour",
              "value": 15,
              "unit": "ACH"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "cfs-stud-deflection-calculator",
      "title": "Cold-Formed Steel (CFS) C-Stud Deflection Checker",
      "url": "https://craftquantities.com/calculators/materials-quantities/cfs-stud-deflection-calculator/",
      "sources": [
        "AISI S100 governs how a CFS stud's effective section properties (I_eff) are derived, but the deflection check itself is standard elastic beam theory: Δ = 5wL⁴/(384EI_eff); manufacturers (SSMA, ClarkDietrich) publish I_eff per stud size/gauge in their span tables for use in this formula"
      ],
      "vectors": [
        {
          "name": "300 N/m, 3m span, E200000 MPa, I_eff=2x10^6mm^4, L/240",
          "inputs": {
            "udl": 300,
            "span": 3,
            "elasticModulus": 200000000000,
            "effectiveMomentOfInertia": 2,
            "deflectionLimitRatio": "240"
          },
          "expected": 0.791,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Allowable limit",
              "value": 12.5,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "400 N/m, 3.5m span, E200000 MPa, I_eff=3x10^6mm^4, L/240",
          "inputs": {
            "udl": 400,
            "span": 3.5,
            "elasticModulus": 200000000000,
            "effectiveMomentOfInertia": 3,
            "deflectionLimitRatio": "240"
          },
          "expected": 1.303,
          "toleranceDecimalPlaces": 1,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Allowable limit",
              "value": 14.583333333333334,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "a 1-5/8 in stud below the old 0.1 floor now reports its real deflection",
          "inputs": {
            "udl": 200,
            "span": 2.4,
            "elasticModulus": 200000000000,
            "effectiveMomentOfInertia": 0.0254,
            "deflectionLimitRatio": "240"
          },
          "expected": 17,
          "toleranceDecimalPlaces": 0,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Allowable limit",
              "value": 10,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cfs-stud-spacing-calculator",
      "title": "Cold-Formed Steel Stud Spacing & Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/cfs-stud-spacing-calculator/",
      "sources": [
        "CFS stud count = ceil(wall length ÷ spacing) + 1 — the standard layout method, counting both end studs plus intermediate studs at 16 in or 24 in o.c. per SSMA/IBC/ASCE, identical in method to wood stud framing"
      ],
      "vectors": [
        {
          "name": "10m wall, 16in o.c.",
          "inputs": {
            "wallLength": 10,
            "studSpacing": 0.4064
          },
          "expected": 26,
          "toleranceDecimalPlaces": 0,
          "unit": "studs",
          "confidence": "high",
          "steps": [
            {
              "label": "Whole bays at the plan's centres",
              "value": 24
            },
            {
              "label": "Closing bay at the end of the run",
              "value": 9.700787401574814,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "12m wall, 24in o.c.",
          "inputs": {
            "wallLength": 12,
            "studSpacing": 0.6096
          },
          "expected": 21,
          "toleranceDecimalPlaces": 0,
          "unit": "studs",
          "confidence": "high",
          "steps": [
            {
              "label": "Whole bays at the plan's centres",
              "value": 19
            },
            {
              "label": "Closing bay at the end of the run",
              "value": 16.44094488188972,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cfs-stud-wall-screw-calculator",
      "title": "CFS Stud Wall Screw Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/cfs-stud-wall-screw-calculator/",
      "sources": [
        "Total screws = stud count × screws per stud (typically 2 at the top track connection + 2 at the bottom track connection = 4 per stud, per standard CFS framing practice)"
      ],
      "vectors": [
        {
          "name": "26 studs, 4 screws/stud",
          "inputs": {
            "studCount": 26,
            "screwsPerStud": 4
          },
          "expected": 104,
          "toleranceDecimalPlaces": 0,
          "unit": "screws",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "21 studs, 6 screws/stud",
          "inputs": {
            "studCount": 21,
            "screwsPerStud": 6
          },
          "expected": 126,
          "toleranceDecimalPlaces": 0,
          "unit": "screws",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "chain-link-fence-calculator",
      "title": "Chain Link Fence Calculator",
      "url": "https://craftquantities.com/calculators/auto-utility/chain-link-fence-calculator/",
      "sources": [
        "Chain-link line posts are typically spaced no more than 10 ft apart; fabric (mesh) is sold in rolls by length"
      ],
      "vectors": [
        {
          "name": "30m fence run",
          "inputs": {
            "fenceLength": 30
          },
          "expected": 9,
          "toleranceDecimalPlaces": 0,
          "unit": "line posts",
          "confidence": "medium",
          "steps": [
            {
              "label": "Fence length",
              "value": 98.42519685039369,
              "unit": "ft"
            },
            {
              "label": "Fabric (mesh) needed",
              "value": 98.42519685039369,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "50m fence run",
          "inputs": {
            "fenceLength": 50
          },
          "expected": 16,
          "toleranceDecimalPlaces": 0,
          "unit": "line posts",
          "confidence": "medium",
          "steps": [
            {
              "label": "Fence length",
              "value": 164.04199475065616,
              "unit": "ft"
            },
            {
              "label": "Fabric (mesh) needed",
              "value": 164.04199475065616,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "chain-link-fence-post-calculator",
      "title": "Chain Link Fence Post Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/chain-link-fence-post-calculator/",
      "sources": [
        "Post count = ceil(fence length ÷ post spacing) + 1, the standard layout method for spacing chain link fence line posts (commonly 3m/10ft o.c.)"
      ],
      "vectors": [
        {
          "name": "100m run, 3m spacing",
          "inputs": {
            "fenceLength": 100,
            "postSpacing": 3
          },
          "expected": 33,
          "toleranceDecimalPlaces": 0,
          "unit": "line posts",
          "confidence": "high",
          "steps": [
            {
              "label": "Bays between the two terminals",
              "value": 34
            },
            {
              "label": "Post centres, as driven",
              "value": 2.9411764705882355,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150m run, 2.5m spacing",
          "inputs": {
            "fenceLength": 150,
            "postSpacing": 2.5
          },
          "expected": 59,
          "toleranceDecimalPlaces": 0,
          "unit": "line posts",
          "confidence": "high",
          "steps": [
            {
              "label": "Bays between the two terminals",
              "value": 60
            },
            {
              "label": "Post centres, as driven",
              "value": 2.5,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "change-order-cost-calculator",
      "title": "Change Order Cost Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/change-order-cost-calculator/",
      "sources": [
        "Total change order cost = additional work cost x (1 + markup percent / 100) + administrative fee"
      ],
      "vectors": [
        {
          "name": "$2000 work, 15% markup, $100 admin fee",
          "inputs": {
            "additionalWorkCost": 2000,
            "markupPercent": 15,
            "adminFee": 100
          },
          "expected": 2400,
          "toleranceDecimalPlaces": 0,
          "unit": "$ (total change order cost)",
          "confidence": "high",
          "steps": [
            {
              "label": "Markup amount",
              "value": 300,
              "unit": "$"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "$5000 work, 20% markup, $150 admin fee",
          "inputs": {
            "additionalWorkCost": 5000,
            "markupPercent": 20,
            "adminFee": 150
          },
          "expected": 6150,
          "toleranceDecimalPlaces": 0,
          "unit": "$ (total change order cost)",
          "confidence": "high",
          "steps": [
            {
              "label": "Markup amount",
              "value": 1000,
              "unit": "$"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "chicken-coop-run-calculator",
      "title": "Chicken Coop Run Fence Calculator",
      "url": "https://craftquantities.com/calculators/auto-utility/chicken-coop-run-calculator/",
      "sources": [
        "Hardware cloth length = run perimeter, with roll height covering above-ground fence height plus a buried skirt to deter digging predators"
      ],
      "vectors": [
        {
          "name": "20m run, 1.8m fence, 0.3m buried",
          "inputs": {
            "runPerimeter": 20,
            "fenceHeight": 1.8,
            "buriedDepth": 0.3
          },
          "expected": 68.898,
          "toleranceDecimalPlaces": 3,
          "unit": "linear ft of hardware cloth",
          "confidence": "medium",
          "steps": [
            {
              "label": "Required roll height",
              "value": 6.889763779527559,
              "unit": "ft"
            },
            {
              "label": "Posts needed",
              "value": 11,
              "unit": "posts"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30m run, 1.8m fence, 0.3m buried",
          "inputs": {
            "runPerimeter": 30,
            "fenceHeight": 1.8,
            "buriedDepth": 0.3
          },
          "expected": 103.35,
          "toleranceDecimalPlaces": 2,
          "unit": "linear ft of hardware cloth",
          "confidence": "medium",
          "steps": [
            {
              "label": "Required roll height",
              "value": 6.889763779527559,
              "unit": "ft"
            },
            {
              "label": "Posts needed",
              "value": 17,
              "unit": "posts"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "chimney-chase-clearance-calculator",
      "title": "Fireplace/Chimney Chase Framing Clearance Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/chimney-chase-clearance-calculator/",
      "sources": [
        "Chase opening width/depth = Chimney/Flue Width or Depth + 2 × Required Clearance-to-Combustibles — clearance-to-combustibles is always specified by the specific appliance or chimney system manufacturer's listing (per NFPA 211 and the applicable mechanical/fuel gas code), and varies significantly by appliance type and chimney system; this calculator applies the clearance value you supply."
      ],
      "vectors": [
        {
          "name": "0.6x0.4m chimney, 0.05m clearance",
          "inputs": {
            "chimneyWidth": 0.6,
            "chimneyDepth": 0.4,
            "requiredClearance": 0.05
          },
          "expected": 0.35,
          "toleranceDecimalPlaces": 2,
          "unit": "m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Chase opening width",
              "value": 0.7,
              "unit": "m"
            },
            {
              "label": "Chase opening depth",
              "value": 0.5,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "0.8x0.5m chimney, 0.075m clearance",
          "inputs": {
            "chimneyWidth": 0.8,
            "chimneyDepth": 0.5,
            "requiredClearance": 0.075
          },
          "expected": 0.6175,
          "toleranceDecimalPlaces": 2,
          "unit": "m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Chase opening width",
              "value": 0.9500000000000001,
              "unit": "m"
            },
            {
              "label": "Chase opening depth",
              "value": 0.65,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "ci-fastener-count-calculator",
      "title": "Continuous Insulation Fastener Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/ci-fastener-count-calculator/",
      "sources": [
        "Total fasteners = board count × fasteners per board, the standard fastening-count method for mechanically-attached continuous insulation"
      ],
      "vectors": [
        {
          "name": "25 boards, 5 fasteners each",
          "inputs": {
            "boardCount": 25,
            "fastenersPerBoard": 5
          },
          "expected": 125,
          "toleranceDecimalPlaces": 0,
          "unit": "fasteners",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "35 boards, 6 fasteners each",
          "inputs": {
            "boardCount": 35,
            "fastenersPerBoard": 6
          },
          "expected": 210,
          "toleranceDecimalPlaces": 0,
          "unit": "fasteners",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "ci-thermal-bridging-calculator",
      "title": "Continuous Insulation Thermal Bridging Calculator (Z-Furring)",
      "url": "https://craftquantities.com/calculators/materials-quantities/ci-thermal-bridging-calculator/",
      "sources": [
        "Parallel-path method: effective R = 1 ÷ (framing area fraction ÷ R-value through the furring/framing + (1 − framing fraction) ÷ R-value of the continuous insulation), accounting for the thermal short-circuit created by metal furring penetrating continuous insulation"
      ],
      "vectors": [
        {
          "name": "10% framing, R10 CI, R3 furring path",
          "inputs": {
            "framingFraction": 10,
            "continuousR": 10,
            "furringR": 3
          },
          "expected": 8.11,
          "toleranceDecimalPlaces": 1,
          "unit": "R-value",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15% framing, R12 CI, R3.5 furring path",
          "inputs": {
            "framingFraction": 15,
            "continuousR": 12,
            "furringR": 3.5
          },
          "expected": 8.8,
          "toleranceDecimalPlaces": 1,
          "unit": "R-value",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "circular-pier-concrete-calculator",
      "title": "Circular Pier / Cylinder Concrete Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/circular-pier-concrete-calculator/",
      "sources": [
        "Cylinder volume = pi x radius² x height, the standard geometric formula for a circular pier or column"
      ],
      "vectors": [
        {
          "name": "0.6m diameter x 3m, 8 piers, 5% waste",
          "inputs": {
            "pierDiameter": 0.6,
            "pierHeight": 3,
            "pierCount": 8,
            "wasteFactorPercent": 5
          },
          "expected": 7.125,
          "toleranceDecimalPlaces": 2,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume per pier",
              "value": 0.8482300164692442,
              "unit": "m³"
            },
            {
              "label": "Base volume (no waste)",
              "value": 6.785840131753954,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "0.45m diameter x 2.5m, 12 piers, 10% waste",
          "inputs": {
            "pierDiameter": 0.45,
            "pierHeight": 2.5,
            "pierCount": 12,
            "wasteFactorPercent": 10
          },
          "expected": 5.248,
          "toleranceDecimalPlaces": 2,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume per pier",
              "value": 0.3976078202199582,
              "unit": "m³"
            },
            {
              "label": "Base volume (no waste)",
              "value": 4.771293842639499,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "circulator-pump-head-loss-calculator",
      "title": "Hydronic Circulator Pump Head Loss Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/circulator-pump-head-loss-calculator/",
      "sources": [
        "Total head loss = friction loss rate per 100 ft/m of pipe × (total equivalent pipe length ÷ 100), the standard method for sizing a circulator pump's required head once the system's friction loss rate is known (from a pipe sizing chart or Hazen-Williams calculation) and combined with the total equivalent length including fittings"
      ],
      "vectors": [
        {
          "name": "4 head units/100, 250 equivalent length",
          "inputs": {
            "frictionLossRate": 4,
            "totalEquivalentLength": 250
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "head units",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "5 head units/100, 320 equivalent length",
          "inputs": {
            "frictionLossRate": 5,
            "totalEquivalentLength": 320
          },
          "expected": 16,
          "toleranceDecimalPlaces": 0,
          "unit": "head units",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "circumference-calculator",
      "title": "Circumference Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/circumference-calculator/",
      "sources": [
        "Circumference = diameter x pi; radius = diameter / 2"
      ],
      "vectors": [
        {
          "name": "1m diameter",
          "inputs": {
            "diameter": 1
          },
          "expected": 10.3037,
          "toleranceDecimalPlaces": 2,
          "unit": "ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Radius",
              "value": 1.6404199475065615,
              "unit": "ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "0.5m diameter",
          "inputs": {
            "diameter": 0.5
          },
          "expected": 5.1519,
          "toleranceDecimalPlaces": 2,
          "unit": "ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Radius",
              "value": 0.8202099737532808,
              "unit": "ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "clay-barrel-tile-calculator",
      "title": "Clay Barrel Roof Tile Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/clay-barrel-tile-calculator/",
      "sources": [
        "Tile count = ceil((roof area ÷ single tile coverage) × (1 + waste allowance)), the standard coverage method applied to clay barrel tile's typical per-unit coverage"
      ],
      "vectors": [
        {
          "name": "100m² roof, 0.1m² coverage, 10% waste",
          "inputs": {
            "roofArea": 100,
            "tileCoverage": 0.1,
            "wastePercent": 10
          },
          "expected": 1100,
          "toleranceDecimalPlaces": 0,
          "unit": "tiles",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150m² roof, 0.1m² coverage, 12% waste",
          "inputs": {
            "roofArea": 150,
            "tileCoverage": 0.1,
            "wastePercent": 12
          },
          "expected": 1680,
          "toleranceDecimalPlaces": 0,
          "unit": "tiles",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "clay-soil-cubic-yards-to-tons-calculator",
      "title": "Clay Soil Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/clay-soil-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 1.5 short tons per cubic yard",
        "Density varies with moisture, grading and composition — the supplier's ticket weight governs"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 15,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.5,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 150,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.5,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "clay-soil-tons-to-cubic-yards-calculator",
      "title": "Clay Soil Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/clay-soil-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 1.5 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 6.666666666666666,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.6666666666666666,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 66.66666666666666,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.6666666666666666,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "cleanroom-hepa-airflow-calculator",
      "title": "Cleanroom HEPA Airflow & Face Velocity Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/cleanroom-hepa-airflow-calculator/",
      "sources": [
        "Required airflow (CFM) = Room Volume (ft³) × Air Changes per Hour ÷ 60; Face Velocity (ft/min) = Airflow ÷ HEPA Filter Face Area. Typical ACH design ranges by ISO 14644-1 cleanliness class come from secondary design guidance (IEST-RP-CC012.3 'Considerations in Cleanroom Design' and established industry practice, NOT from ISO 14644-1 itself, which sets only particle-concentration limits): roughly ISO 8 → 10-30 ACH, ISO 7 → 30-65 ACH, ISO 6 → 80-150 ACH, ISO 5 → 200-480 ACH (ISO 5 is often instead designed as unidirectional/laminar flow at ~40-80 fpm face velocity rather than a pure ACH target)."
      ],
      "vectors": [
        {
          "name": "2000ft³ room, 100 ACH, 40ft² filter face",
          "inputs": {
            "roomVolumeFt3": 56633.6932,
            "airChangesPerHour": 100,
            "filterFaceArea": 3.716122
          },
          "expected": 3333.33,
          "toleranceDecimalPlaces": -1,
          "unit": "CFM",
          "confidence": "medium",
          "steps": [
            {
              "label": "HEPA filter face velocity",
              "value": 83.33332438695207,
              "unit": "ft/min"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "4500ft³ room, 48 ACH, 36ft² filter face",
          "inputs": {
            "roomVolumeFt3": 127425.8097,
            "airChangesPerHour": 48,
            "filterFaceArea": 3.344509
          },
          "expected": 3600,
          "toleranceDecimalPlaces": -1,
          "unit": "CFM",
          "confidence": "medium",
          "steps": [
            {
              "label": "HEPA filter face velocity",
              "value": 100.000013184144,
              "unit": "ft/min"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "climate-zone-insulation-calculator",
      "title": "Insulation R-Value by Climate Zone Calculator (IECC 2021 and NBC 2020)",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/climate-zone-insulation-calculator/",
      "sources": [
        "International Code Council, IECC Residential Committee Action Report on the 2021 public input changes, updated 26 July 2022, proposal REPI-33-21: the 2021 IECC Table R402.1.2 (maximum assembly U-factors and fenestration requirements) and Table R402.1.3 (insulation minimum R-values and fenestration requirements by component) with their footnotes, printed as the base text being revised. The 2021 text is everything not underlined: in the ceiling cells the struck figures (R-49 and R-60; U-0.026 and U-0.024) are the 2021 text, and the underlined ones (R-38 and R-49; U-0.030 and U-0.026) are the proposal's",
        "Cross-checks: Washington County, Maryland, 2021 IECC Residential Energy Efficiency Code compliance form (climate zone 4 except Marine, both tables); US DOE, final determination technical support document for the 2021 IECC (changes from 2018: ceilings R-49 and R-60, zone 4 and 5 walls 20+5ci, slabs R-10 at 2 ft and 4 ft, fenestration 0.30); Maine 16-642 CMR ch. 6 §6 (amending the zone 6 and 7-8 wall entries); Delaware DNREC, 2021 IECC residential changes (R402.2.1: R-38 for R-49 and R-49 for R-60 where uncompressed insulation extends over the top plates at the eaves)",
        "Pacific Northwest National Laboratory (T. L. Gilbride et al.), Guide to Determining Climate Zone by County: Building America and IECC 2021 Updates (September 2022), the 2021 IECC climate zone of every US county",
        "National Research Council of Canada, National Building Code of Canada 2020, Division B: 9.36.1.2.(3) effective thermal resistance (RSI) as the inverse of an assembly's U-value; 9.36.1.3 compliance paths; Tables 9.36.2.6.-A and -B (above-ground opaque assemblies without and with a heat-recovery ventilator), 9.36.2.6.(3) the attic reduction near the eaves; Tables 9.36.2.7.-A and -B (fenestration, doors, skylights); Tables 9.36.2.8.-A and -B (below grade), 9.36.2.8.(3)–(9); Article 1.1.3.1 and Appendix C Table C-2 for degree-days"
      ],
      "vectors": [
        {
          "name": "IECC 2021, zone 5 and Marine 4, ceiling below an attic: R-60",
          "inputs": {
            "zone": "iecc-5",
            "component": "ceiling"
          },
          "expected": 60,
          "toleranceDecimalPlaces": 6,
          "unit": "hr·ft²·°F/BTU",
          "confidence": "medium",
          "steps": [
            {
              "label": "In R-value (hr·ft²·°F/BTU)",
              "value": 60,
              "unit": "hr·ft²·°F/BTU"
            },
            {
              "label": "In RSI (m²K/W)",
              "value": 10.56661102093843,
              "unit": "m²K/W"
            },
            {
              "label": "Whole-assembly U-factor, the other route",
              "value": 0.1362783201867227,
              "unit": "W/m²K"
            },
            {
              "label": "Windows: U-factor at most, in this zone",
              "value": 1.7034790023340336,
              "unit": "W/m²K"
            },
            {
              "label": "Skylights: U-factor at most, in this zone",
              "value": 3.123044837612395,
              "unit": "W/m²K"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "IECC 2021, zone 3, wood-frame wall: R-20 in the cavity (or 13 + 5ci, or 15ci)",
          "inputs": {
            "zone": "iecc-3",
            "component": "frameWall"
          },
          "expected": 20,
          "toleranceDecimalPlaces": 6,
          "unit": "hr·ft²·°F/BTU",
          "confidence": "medium",
          "steps": [
            {
              "label": "In R-value (hr·ft²·°F/BTU)",
              "value": 20,
              "unit": "hr·ft²·°F/BTU"
            },
            {
              "label": "In RSI (m²K/W)",
              "value": 3.522203673646143,
              "unit": "m²K/W"
            },
            {
              "label": "Whole-assembly U-factor, the other route",
              "value": 0.3406958004668067,
              "unit": "W/m²K"
            },
            {
              "label": "Windows: U-factor at most, in this zone",
              "value": 1.7034790023340336,
              "unit": "W/m²K"
            },
            {
              "label": "Skylights: U-factor at most, in this zone",
              "value": 3.123044837612395,
              "unit": "W/m²K"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "IECC 2021, zones 7 and 8, floor: R-38",
          "inputs": {
            "zone": "iecc-78",
            "component": "floor"
          },
          "expected": 38,
          "toleranceDecimalPlaces": 6,
          "unit": "hr·ft²·°F/BTU",
          "confidence": "medium",
          "steps": [
            {
              "label": "In R-value (hr·ft²·°F/BTU)",
              "value": 38,
              "unit": "hr·ft²·°F/BTU"
            },
            {
              "label": "In RSI (m²K/W)",
              "value": 6.692186979927672,
              "unit": "m²K/W"
            },
            {
              "label": "Whole-assembly U-factor, the other route",
              "value": 0.15899137355117648,
              "unit": "W/m²K"
            },
            {
              "label": "Windows: U-factor at most, in this zone",
              "value": 1.7034790023340336,
              "unit": "W/m²K"
            },
            {
              "label": "Skylights: U-factor at most, in this zone",
              "value": 3.123044837612395,
              "unit": "W/m²K"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "NBC 2020, zone 5 without an HRV, ceiling below an attic: RSI 8.67 effective, R-49.23",
          "inputs": {
            "zone": "nbc-5",
            "component": "ceiling"
          },
          "expected": 49.2305,
          "toleranceDecimalPlaces": 3,
          "unit": "hr·ft²·°F/BTU",
          "confidence": "medium",
          "steps": [
            {
              "label": "In R-value (hr·ft²·°F/BTU)",
              "value": 49.23054316745357,
              "unit": "hr·ft²·°F/BTU"
            },
            {
              "label": "In RSI (m²K/W)",
              "value": 8.67,
              "unit": "m²K/W"
            },
            {
              "label": "The same as a whole-assembly U-value",
              "value": 0.11534025374855825,
              "unit": "W/m²K"
            },
            {
              "label": "Windows and doors: U-value at most, in this zone",
              "value": 1.84,
              "unit": "W/m²K"
            },
            {
              "label": "Skylights: U-factor at most, in this zone",
              "value": 2.92,
              "unit": "W/m²K"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "NBC 2020, zone 7A with an HRV, foundation wall: RSI 2.98 effective, R-16.92",
          "inputs": {
            "zone": "nbc-7a-hrv",
            "component": "basementWall"
          },
          "expected": 16.9212,
          "toleranceDecimalPlaces": 3,
          "unit": "hr·ft²·°F/BTU",
          "confidence": "medium",
          "steps": [
            {
              "label": "In R-value (hr·ft²·°F/BTU)",
              "value": 16.92122475651807,
              "unit": "hr·ft²·°F/BTU"
            },
            {
              "label": "In RSI (m²K/W)",
              "value": 2.98,
              "unit": "m²K/W"
            },
            {
              "label": "The same as a whole-assembly U-value",
              "value": 0.33557046979865773,
              "unit": "W/m²K"
            },
            {
              "label": "Windows and doors: U-value at most, in this zone",
              "value": 1.61,
              "unit": "W/m²K"
            },
            {
              "label": "Skylights: U-factor at most, in this zone",
              "value": 2.75,
              "unit": "W/m²K"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "IECC zones 0 and 1, mass wall: R-3 (R-4 with most of the insulation inside)",
          "inputs": {
            "zone": "iecc-1",
            "component": "massWall"
          },
          "expected": 3,
          "toleranceDecimalPlaces": 6,
          "unit": "hr·ft²·°F/BTU",
          "confidence": "medium",
          "steps": [
            {
              "label": "In R-value (hr·ft²·°F/BTU)",
              "value": 3,
              "unit": "hr·ft²·°F/BTU"
            },
            {
              "label": "In RSI (m²K/W)",
              "value": 0.5283305510469215,
              "unit": "m²K/W"
            },
            {
              "label": "Whole-assembly U-factor, the other route",
              "value": 1.1186178781993488,
              "unit": "W/m²K"
            },
            {
              "label": "Windows: U-factor on the U-factor route only (Table R402.1.2)",
              "value": 2.8391316705567227,
              "unit": "W/m²K"
            },
            {
              "label": "Skylights: U-factor at most, in this zone",
              "value": 4.258697505835084,
              "unit": "W/m²K"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "IECC zone 2, cathedral ceiling or flat roof: the ceiling row, R-49",
          "inputs": {
            "zone": "iecc-2",
            "component": "roof"
          },
          "expected": 49,
          "toleranceDecimalPlaces": 6,
          "unit": "hr·ft²·°F/BTU",
          "confidence": "medium",
          "steps": [
            {
              "label": "In R-value (hr·ft²·°F/BTU)",
              "value": 49,
              "unit": "hr·ft²·°F/BTU"
            },
            {
              "label": "In RSI (m²K/W)",
              "value": 8.62939900043305,
              "unit": "m²K/W"
            },
            {
              "label": "Whole-assembly U-factor, the other route",
              "value": 0.14763484686894957,
              "unit": "W/m²K"
            },
            {
              "label": "Windows: U-factor at most, in this zone",
              "value": 2.271305336445378,
              "unit": "W/m²K"
            },
            {
              "label": "Skylights: U-factor at most, in this zone",
              "value": 3.6908711717237397,
              "unit": "W/m²K"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "IECC zone 4 except Marine, crawl space wall: R-10 continuous (or R-13 cavity)",
          "inputs": {
            "zone": "iecc-4",
            "component": "crawlWall"
          },
          "expected": 10,
          "toleranceDecimalPlaces": 6,
          "unit": "hr·ft²·°F/BTU",
          "confidence": "medium",
          "steps": [
            {
              "label": "In R-value (hr·ft²·°F/BTU)",
              "value": 10,
              "unit": "hr·ft²·°F/BTU"
            },
            {
              "label": "In RSI (m²K/W)",
              "value": 1.7611018368230715,
              "unit": "m²K/W"
            },
            {
              "label": "Whole-assembly U-factor, the other route",
              "value": 0.36908711717237397,
              "unit": "W/m²K"
            },
            {
              "label": "Windows: U-factor at most, in this zone",
              "value": 1.7034790023340336,
              "unit": "W/m²K"
            },
            {
              "label": "Skylights: U-factor at most, in this zone",
              "value": 3.123044837612395,
              "unit": "W/m²K"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "IECC zone 6, unheated slab: R-10 continuous, 4 ft down",
          "inputs": {
            "zone": "iecc-6",
            "component": "slab"
          },
          "expected": 10,
          "toleranceDecimalPlaces": 6,
          "unit": "hr·ft²·°F/BTU",
          "confidence": "medium",
          "steps": [
            {
              "label": "In R-value (hr·ft²·°F/BTU)",
              "value": 10,
              "unit": "hr·ft²·°F/BTU"
            },
            {
              "label": "In RSI (m²K/W)",
              "value": 1.7611018368230715,
              "unit": "m²K/W"
            },
            {
              "label": "Depth the slab-edge insulation runs",
              "value": 4,
              "unit": "ft"
            },
            {
              "label": "Windows: U-factor at most, in this zone",
              "value": 1.7034790023340336,
              "unit": "W/m²K"
            },
            {
              "label": "Skylights: U-factor at most, in this zone",
              "value": 3.123044837612395,
              "unit": "W/m²K"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "NBC zone 4, heated floor: RSI 2.32, R-13.17",
          "inputs": {
            "zone": "nbc-4",
            "component": "heatedSlab"
          },
          "expected": 13.1736,
          "toleranceDecimalPlaces": 3,
          "unit": "hr·ft²·°F/BTU",
          "confidence": "medium",
          "steps": [
            {
              "label": "In R-value (hr·ft²·°F/BTU)",
              "value": 13.173570951383192,
              "unit": "hr·ft²·°F/BTU"
            },
            {
              "label": "In RSI (m²K/W)",
              "value": 2.32,
              "unit": "m²K/W"
            },
            {
              "label": "The same as a whole-assembly U-value",
              "value": 0.4310344827586207,
              "unit": "W/m²K"
            },
            {
              "label": "Windows and doors: U-value at most, in this zone",
              "value": 1.84,
              "unit": "W/m²K"
            },
            {
              "label": "Skylights: U-factor at most, in this zone",
              "value": 2.92,
              "unit": "W/m²K"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "NBC zone 4 with an HRV, slab with an integral footing: RSI 1.96, R-11.13",
          "inputs": {
            "zone": "nbc-4-hrv",
            "component": "slabFooting"
          },
          "expected": 11.1294,
          "toleranceDecimalPlaces": 3,
          "unit": "hr·ft²·°F/BTU",
          "confidence": "medium",
          "steps": [
            {
              "label": "In R-value (hr·ft²·°F/BTU)",
              "value": 11.129396148582353,
              "unit": "hr·ft²·°F/BTU"
            },
            {
              "label": "In RSI (m²K/W)",
              "value": 1.96,
              "unit": "m²K/W"
            },
            {
              "label": "The same as a whole-assembly U-value",
              "value": 0.5102040816326531,
              "unit": "W/m²K"
            },
            {
              "label": "Windows and doors: U-value at most, in this zone",
              "value": 1.84,
              "unit": "W/m²K"
            },
            {
              "label": "Skylights: U-factor at most, in this zone",
              "value": 2.92,
              "unit": "W/m²K"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "NBC zone 5 with an HRV, wall: RSI 2.97, R-16.86",
          "inputs": {
            "zone": "nbc-5-hrv",
            "component": "frameWall"
          },
          "expected": 16.8644,
          "toleranceDecimalPlaces": 3,
          "unit": "hr·ft²·°F/BTU",
          "confidence": "medium",
          "steps": [
            {
              "label": "In R-value (hr·ft²·°F/BTU)",
              "value": 16.864442123106933,
              "unit": "hr·ft²·°F/BTU"
            },
            {
              "label": "In RSI (m²K/W)",
              "value": 2.97,
              "unit": "m²K/W"
            },
            {
              "label": "The same as a whole-assembly U-value",
              "value": 0.33670033670033667,
              "unit": "W/m²K"
            },
            {
              "label": "Windows and doors: U-value at most, in this zone",
              "value": 1.84,
              "unit": "W/m²K"
            },
            {
              "label": "Skylights: U-factor at most, in this zone",
              "value": 2.92,
              "unit": "W/m²K"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "NBC zone 6, cathedral ceiling or flat roof: RSI 4.67, R-26.52",
          "inputs": {
            "zone": "nbc-6",
            "component": "roof"
          },
          "expected": 26.5175,
          "toleranceDecimalPlaces": 3,
          "unit": "hr·ft²·°F/BTU",
          "confidence": "medium",
          "steps": [
            {
              "label": "In R-value (hr·ft²·°F/BTU)",
              "value": 26.51748980299979,
              "unit": "hr·ft²·°F/BTU"
            },
            {
              "label": "In RSI (m²K/W)",
              "value": 4.67,
              "unit": "m²K/W"
            },
            {
              "label": "The same as a whole-assembly U-value",
              "value": 0.21413276231263384,
              "unit": "W/m²K"
            },
            {
              "label": "Windows and doors: U-value at most, in this zone",
              "value": 1.61,
              "unit": "W/m²K"
            },
            {
              "label": "Skylights: U-factor at most, in this zone",
              "value": 2.75,
              "unit": "W/m²K"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "NBC zone 6 with an HRV, ceiling below an attic: RSI 8.67, R-49.23",
          "inputs": {
            "zone": "nbc-6-hrv",
            "component": "ceiling"
          },
          "expected": 49.2305,
          "toleranceDecimalPlaces": 3,
          "unit": "hr·ft²·°F/BTU",
          "confidence": "medium",
          "steps": [
            {
              "label": "In R-value (hr·ft²·°F/BTU)",
              "value": 49.23054316745357,
              "unit": "hr·ft²·°F/BTU"
            },
            {
              "label": "In RSI (m²K/W)",
              "value": 8.67,
              "unit": "m²K/W"
            },
            {
              "label": "The same as a whole-assembly U-value",
              "value": 0.11534025374855825,
              "unit": "W/m²K"
            },
            {
              "label": "Windows and doors: U-value at most, in this zone",
              "value": 1.61,
              "unit": "W/m²K"
            },
            {
              "label": "Skylights: U-factor at most, in this zone",
              "value": 2.75,
              "unit": "W/m²K"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "NBC zone 7A, heated crawl space wall (a foundation wall): RSI 3.46, R-19.65",
          "inputs": {
            "zone": "nbc-7a",
            "component": "crawlWall"
          },
          "expected": 19.6468,
          "toleranceDecimalPlaces": 3,
          "unit": "hr·ft²·°F/BTU",
          "confidence": "medium",
          "steps": [
            {
              "label": "In R-value (hr·ft²·°F/BTU)",
              "value": 19.64679116025252,
              "unit": "hr·ft²·°F/BTU"
            },
            {
              "label": "In RSI (m²K/W)",
              "value": 3.46,
              "unit": "m²K/W"
            },
            {
              "label": "The same as a whole-assembly U-value",
              "value": 0.28901734104046245,
              "unit": "W/m²K"
            },
            {
              "label": "Windows and doors: U-value at most, in this zone",
              "value": 1.61,
              "unit": "W/m²K"
            },
            {
              "label": "Skylights: U-factor at most, in this zone",
              "value": 2.75,
              "unit": "W/m²K"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "NBC zone 7B, unheated floor above the frost line: RSI 1.96, R-11.13",
          "inputs": {
            "zone": "nbc-7b",
            "component": "slab"
          },
          "expected": 11.1294,
          "toleranceDecimalPlaces": 3,
          "unit": "hr·ft²·°F/BTU",
          "confidence": "medium",
          "steps": [
            {
              "label": "In R-value (hr·ft²·°F/BTU)",
              "value": 11.129396148582353,
              "unit": "hr·ft²·°F/BTU"
            },
            {
              "label": "In RSI (m²K/W)",
              "value": 1.96,
              "unit": "m²K/W"
            },
            {
              "label": "The same as a whole-assembly U-value",
              "value": 0.5102040816326531,
              "unit": "W/m²K"
            },
            {
              "label": "Windows and doors: U-value at most, in this zone",
              "value": 1.44,
              "unit": "W/m²K"
            },
            {
              "label": "Skylights: U-factor at most, in this zone",
              "value": 2.41,
              "unit": "W/m²K"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "NBC zone 7B with an HRV, mass wall (the one wall row): RSI 3.08, R-17.49",
          "inputs": {
            "zone": "nbc-7b-hrv",
            "component": "massWall"
          },
          "expected": 17.4891,
          "toleranceDecimalPlaces": 3,
          "unit": "hr·ft²·°F/BTU",
          "confidence": "medium",
          "steps": [
            {
              "label": "In R-value (hr·ft²·°F/BTU)",
              "value": 17.489051090629413,
              "unit": "hr·ft²·°F/BTU"
            },
            {
              "label": "In RSI (m²K/W)",
              "value": 3.08,
              "unit": "m²K/W"
            },
            {
              "label": "The same as a whole-assembly U-value",
              "value": 0.3246753246753247,
              "unit": "W/m²K"
            },
            {
              "label": "Windows and doors: U-value at most, in this zone",
              "value": 1.44,
              "unit": "W/m²K"
            },
            {
              "label": "Skylights: U-factor at most, in this zone",
              "value": 2.41,
              "unit": "W/m²K"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "NBC zone 8, slab with an integral footing: RSI 4.59, R-26.06",
          "inputs": {
            "zone": "nbc-8",
            "component": "slabFooting"
          },
          "expected": 26.0632,
          "toleranceDecimalPlaces": 3,
          "unit": "hr·ft²·°F/BTU",
          "confidence": "medium",
          "steps": [
            {
              "label": "In R-value (hr·ft²·°F/BTU)",
              "value": 26.063228735710712,
              "unit": "hr·ft²·°F/BTU"
            },
            {
              "label": "In RSI (m²K/W)",
              "value": 4.59,
              "unit": "m²K/W"
            },
            {
              "label": "The same as a whole-assembly U-value",
              "value": 0.2178649237472767,
              "unit": "W/m²K"
            },
            {
              "label": "Windows and doors: U-value at most, in this zone",
              "value": 1.44,
              "unit": "W/m²K"
            },
            {
              "label": "Skylights: U-factor at most, in this zone",
              "value": 2.41,
              "unit": "W/m²K"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "NBC zone 8 with an HRV, floor over an unheated space: RSI 5.02, R-28.50",
          "inputs": {
            "zone": "nbc-8-hrv",
            "component": "floor"
          },
          "expected": 28.5049,
          "toleranceDecimalPlaces": 3,
          "unit": "hr·ft²·°F/BTU",
          "confidence": "medium",
          "steps": [
            {
              "label": "In R-value (hr·ft²·°F/BTU)",
              "value": 28.504881972389494,
              "unit": "hr·ft²·°F/BTU"
            },
            {
              "label": "In RSI (m²K/W)",
              "value": 5.02,
              "unit": "m²K/W"
            },
            {
              "label": "The same as a whole-assembly U-value",
              "value": 0.19920318725099603,
              "unit": "W/m²K"
            },
            {
              "label": "Windows and doors: U-value at most, in this zone",
              "value": 1.44,
              "unit": "W/m²K"
            },
            {
              "label": "Skylights: U-factor at most, in this zone",
              "value": 2.41,
              "unit": "W/m²K"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        }
      ]
    },
    {
      "slug": "closet-shelving-calculator",
      "title": "Closet Shelving Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/closet-shelving-calculator/",
      "sources": [
        "Single-shelf closets need one shelf run the width of the closet; double-hang closets need two shelf runs, doubling the material",
        "Shelving board is stocked at 6, 8, 10 and 12 ft where timber is sold by the foot, and at 1.8, 2.4, 3 and 3.6 m where it is sold by the metre, then cut to the closet width either way"
      ],
      "vectors": [
        {
          "name": "1.83m closet, single, 6ft sticks",
          "inputs": {
            "closetWidth": 1.83,
            "shelfType": "single",
            "stickLengthFt": "6"
          },
          "expected": 6.6,
          "toleranceDecimalPlaces": 0.5,
          "unit": "linear ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Shelf runs",
              "value": 1,
              "unit": "runs"
            },
            {
              "label": "Sticks needed",
              "value": 2,
              "unit": "x 6 ft sticks"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "2.44m closet, double, 8ft sticks",
          "inputs": {
            "closetWidth": 2.44,
            "shelfType": "double",
            "stickLengthFt": "8"
          },
          "expected": 17.61,
          "toleranceDecimalPlaces": 0.5,
          "unit": "linear ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Shelf runs",
              "value": 2,
              "unit": "runs"
            },
            {
              "label": "Sticks needed",
              "value": 3,
              "unit": "x 8 ft sticks"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "clt-floor-panel-calculator",
      "title": "CLT Floor Panel Grid Layer Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/clt-floor-panel-calculator/",
      "sources": [
        "Panel count = ceil(total floor area ÷ (panel width × panel length)), based on standard manufactured CLT panel dimensions"
      ],
      "vectors": [
        {
          "name": "300m² floor, 3x12m panels",
          "inputs": {
            "floorArea": 300,
            "panelWidth": 3,
            "panelLength": 12
          },
          "expected": 9,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "high",
          "steps": [
            {
              "label": "Single panel area",
              "value": 36,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "500m² floor, 2.4x10m panels",
          "inputs": {
            "floorArea": 500,
            "panelWidth": 2.4,
            "panelLength": 10
          },
          "expected": 21,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "high",
          "steps": [
            {
              "label": "Single panel area",
              "value": 24,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cmu-anchor-embedment-calculator",
      "title": "CMU Anchor Embedment Scaling Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/cmu-anchor-embedment-calculator/",
      "sources": [
        "Masonry anchor capacity is governed by manufacturer ICC-ES evaluation report testing rather than a general calculable formula; a common simplified approximation scales the rated capacity linearly with embedment depth relative to the manufacturer's tested reference embedment",
        "The same approximation does not run the other way: scaling above the tested embedment extrapolates outside the evaluated range, where masonry capacity flattens rather than continuing to rise, so this page holds the result at the rated capacity instead"
      ],
      "vectors": [
        {
          "name": "deeper than the tested embedment returns the rated capacity, not more",
          "inputs": {
            "ratedCapacity": 5000,
            "referenceEmbedment": 0.075,
            "actualEmbedment": 0.1,
            "wallCondition": "grouted"
          },
          "expected": 5,
          "toleranceDecimalPlaces": 2,
          "unit": "kN",
          "confidence": "low",
          "steps": [
            {
              "label": "Rated capacity entered",
              "value": 5,
              "unit": "kN"
            },
            {
              "label": "Embedment ratio applied",
              "value": 1
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "shallower than the tested embedment still scales down",
          "inputs": {
            "ratedCapacity": 8000,
            "referenceEmbedment": 0.1,
            "actualEmbedment": 0.065,
            "wallCondition": "grouted"
          },
          "expected": 5.2,
          "toleranceDecimalPlaces": 1,
          "unit": "kN",
          "confidence": "low",
          "steps": [
            {
              "label": "Rated capacity entered",
              "value": 8,
              "unit": "kN"
            },
            {
              "label": "Embedment ratio applied",
              "value": 0.65
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "at exactly the tested embedment the rated capacity comes through untouched",
          "inputs": {
            "ratedCapacity": 5000,
            "referenceEmbedment": 0.075,
            "actualEmbedment": 0.075,
            "wallCondition": "grouted"
          },
          "expected": 5,
          "toleranceDecimalPlaces": 2,
          "unit": "kN",
          "confidence": "low",
          "steps": [
            {
              "label": "Rated capacity entered",
              "value": 5,
              "unit": "kN"
            },
            {
              "label": "Embedment ratio applied",
              "value": 1
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "cmu-block-grout-calculator",
      "title": "Concrete CMU Block Counter & Grout Infill Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/cmu-block-grout-calculator/",
      "sources": [
        "Block coverage rate is derived geometrically from nominal face dimensions (actual block size + mortar joint width), the same dynamic method used by the Brick Calculator, rather than a single fixed rate",
        "Grout volume = block count before waste x void volume per block (a whole block, not one cell) x grouted cell fraction as a decimal, i.e. the percentage you enter divided by 100, for reinforced CMU construction. Block count before waste is the breakdown's wall area multiplied by its coverage rate; wall height carries no separate term because it is already inside the wall area. Bond-beam units (wall length / nominal block length, rounded up, x bond-beam courses) are taken out of that count and grouted solid at the same void volume, whatever the fraction.",
        "Face-shell mortar bedding: mortar on the two face shells only, in the bed joints and the head joints (NCMA TEK 4-2A, Estimating Concrete Masonry Materials, 2004, whose rules of thumb assume it). Face shell taken as 32 mm (1¼ in), ASTM C90's minimum for units 8 in (203 mm) nominal and wider. The same TEK's Table 2 rules, which include nominal waste, are given in bags and in sand rather than as a mortar volume: one 80 lb (36.3 kg) bag of preblended mortar for about 16 conventional units, or 4½ ft³ (0.13 m³) of sand for about 46 units of Type S site-mixed mortar. The 0.66 ft³ (19 L) bag yield in the same TEK belongs to its preblended GROUT tables (Tables 4 and 5), used here only for the bond-beam limitation."
      ],
      "vectors": [
        {
          "name": "6x2.4m wall, standard 8x16 block, fully grouted",
          "inputs": {
            "wallLength": 6,
            "wallHeight": 2.4,
            "blockFaceLength": 0.396875,
            "blockFaceHeight": 0.193675,
            "jointWidth": 0.009525,
            "wasteFactorPercent": 10,
            "voidVolumePerBlock": 8.5,
            "groutedCellFraction": 100,
            "bondBeamCourses": 0
          },
          "expected": 192,
          "toleranceDecimalPlaces": -1,
          "unit": "blocks",
          "confidence": "medium",
          "steps": [
            {
              "label": "Wall area",
              "value": 155.00031000061998,
              "unit": "sq ft"
            },
            {
              "label": "Coverage rate (from your dimensions)",
              "value": 1.1249999999999998,
              "unit": "blocks/sq ft"
            },
            {
              "label": "Grout volume needed",
              "value": 1482.1904643809282,
              "unit": "L"
            },
            {
              "label": "Mortar volume (face-shell bedding, joints only, no waste)",
              "value": 63.289160156249984,
              "unit": "L"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "10x3m wall, standard 8x16 block, 50% grouted",
          "inputs": {
            "wallLength": 10,
            "wallHeight": 3,
            "blockFaceLength": 0.396875,
            "blockFaceHeight": 0.193675,
            "jointWidth": 0.009525,
            "wasteFactorPercent": 5,
            "voidVolumePerBlock": 8.5,
            "groutedCellFraction": 50,
            "bondBeamCourses": 0
          },
          "expected": 382,
          "toleranceDecimalPlaces": -1,
          "unit": "blocks",
          "confidence": "medium",
          "steps": [
            {
              "label": "Wall area",
              "value": 322.91731250129163,
              "unit": "sq ft"
            },
            {
              "label": "Coverage rate (from your dimensions)",
              "value": 1.1249999999999998,
              "unit": "blocks/sq ft"
            },
            {
              "label": "Grout volume needed",
              "value": 1543.9484003968005,
              "unit": "L"
            },
            {
              "label": "Mortar volume (face-shell bedding, joints only, no waste)",
              "value": 131.85241699218747,
              "unit": "L"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "6x2.4m wall, 5% waste, 1 bond-beam course: the block count does not change",
          "inputs": {
            "wallLength": 6,
            "wallHeight": 2.4,
            "blockFaceLength": 0.396875,
            "blockFaceHeight": 0.193675,
            "jointWidth": 0.009525,
            "wasteFactorPercent": 5,
            "voidVolumePerBlock": 8.5,
            "groutedCellFraction": 50,
            "bondBeamCourses": 1
          },
          "expected": 184,
          "toleranceDecimalPlaces": 0,
          "unit": "blocks",
          "confidence": "medium",
          "steps": [
            {
              "label": "Wall area",
              "value": 155.00031000061998,
              "unit": "sq ft"
            },
            {
              "label": "Coverage rate (from your dimensions)",
              "value": 1.1249999999999998,
              "unit": "blocks/sq ft"
            },
            {
              "label": "Bond-beam units (within the count, grouted solid)",
              "value": 15,
              "unit": "blocks"
            },
            {
              "label": "Grout volume needed",
              "value": 804.8452321904641,
              "unit": "L"
            },
            {
              "label": "Mortar volume (face-shell bedding, joints only, no waste)",
              "value": 63.289160156249984,
              "unit": "L"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cmu-bond-beam-block-count-calculator",
      "title": "CMU Bond Beam Block Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/cmu-bond-beam-block-count-calculator/",
      "sources": [
        "Bond beam block count = ceiling(wall length / nominal block length) x number of bond beam courses, using the same nominal block length as standard CMU (commonly 16 in / 400mm)"
      ],
      "vectors": [
        {
          "name": "20m wall, 0.4m block, 2 courses",
          "inputs": {
            "wallLength": 20,
            "blockNominalLength": 0.4,
            "bondBeamCourses": 2
          },
          "expected": 100,
          "toleranceDecimalPlaces": 0,
          "unit": "bond beam blocks",
          "confidence": "high",
          "steps": [
            {
              "label": "Blocks per course",
              "value": 50
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15m wall, 0.4m block, 3 courses",
          "inputs": {
            "wallLength": 15,
            "blockNominalLength": 0.4,
            "bondBeamCourses": 3
          },
          "expected": 114,
          "toleranceDecimalPlaces": 0,
          "unit": "bond beam blocks",
          "confidence": "high",
          "steps": [
            {
              "label": "Blocks per course",
              "value": 38
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cmu-cell-grout-volume-calculator",
      "title": "CMU Cell Grout Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/cmu-cell-grout-volume-calculator/",
      "sources": [
        "Grout volume = number of grouted cells x cell cross-sectional area x wall height, for vertically continuous grouted cores"
      ],
      "vectors": [
        {
          "name": "20 cells, 30in² each, 2.4m wall",
          "inputs": {
            "groutedCellCount": 20,
            "cellCrossSectionArea": 0.0193548,
            "wallHeight": 2.4
          },
          "expected": 32.81,
          "toleranceDecimalPlaces": 1,
          "unit": "cu ft",
          "confidence": "medium",
          "steps": [
            {
              "label": "Grout per cell (full height)",
              "value": 46.45152,
              "unit": "L"
            },
            {
              "label": "Cubic yards",
              "value": 1.2151258870418975,
              "unit": "yd³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "35 cells, 28in² each, 3m wall",
          "inputs": {
            "groutedCellCount": 35,
            "cellCrossSectionArea": 0.01806448,
            "wallHeight": 3
          },
          "expected": 66.98,
          "toleranceDecimalPlaces": 1,
          "unit": "cu ft",
          "confidence": "medium",
          "steps": [
            {
              "label": "Grout per cell (full height)",
              "value": 54.19344000000001,
              "unit": "L"
            },
            {
              "label": "Cubic yards",
              "value": 2.4808820193772076,
              "unit": "yd³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cmu-equivalent-thickness-calculator",
      "title": "CMU Equivalent Thickness Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/cmu-equivalent-thickness-calculator/",
      "sources": [
        "Equivalent thickness (te) = the block's net volume divided by its face area, commonly approximated as actual thickness x (percent solid / 100) — a standard geometric metric used as an input to fire-resistance rating and other performance tables for hollow masonry units"
      ],
      "vectors": [
        {
          "name": "200mm block, 55% solid",
          "inputs": {
            "actualThickness": 0.2,
            "percentSolid": 55
          },
          "expected": 110,
          "toleranceDecimalPlaces": 0,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in inches",
              "value": 4.330708661417324,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150mm block, 60% solid",
          "inputs": {
            "actualThickness": 0.15,
            "percentSolid": 60
          },
          "expected": 90,
          "toleranceDecimalPlaces": 0,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in inches",
              "value": 3.5433070866141736,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cmu-wall-self-weight-calculator",
      "title": "CMU Wall Self-Weight Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/cmu-wall-self-weight-calculator/",
      "sources": [
        "Wall self-weight = wall area x unit weight per unit area, using the specific block product's published weight per square meter/foot (which already accounts for the block's hollow core geometry and any grout)"
      ],
      "vectors": [
        {
          "name": "30m² wall, 130 kg/m² (hollow)",
          "inputs": {
            "wallArea": 30,
            "unitWeightPerM2": 130
          },
          "expected": 3900,
          "toleranceDecimalPlaces": 0,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in kN",
              "value": 38.259,
              "unit": "kN"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "50m² wall, 260 kg/m² (fully grouted)",
          "inputs": {
            "wallArea": 50,
            "unitWeightPerM2": 260
          },
          "expected": 13000,
          "toleranceDecimalPlaces": 0,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in kN",
              "value": 127.53,
              "unit": "kN"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "collar-tie-uplift-tension-calculator",
      "title": "Collar Tie Wind Uplift Tension Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/collar-tie-uplift-tension-calculator/",
      "sources": [
        "Simplified tributary-area method: tie tension = uplift pressure × tributary roof area ÷ number of ties sharing that tributary area"
      ],
      "vectors": [
        {
          "name": "1.5kPa, 8m² tributary, 1 tie",
          "inputs": {
            "upliftPressure": 1500,
            "tributaryArea": 8,
            "numberOfTies": 1
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "kN",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2.0kPa, 6m² tributary, 2 ties",
          "inputs": {
            "upliftPressure": 2000,
            "tributaryArea": 6,
            "numberOfTies": 2
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "kN",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "column-formwork-pressure-calculator",
      "title": "ACI 347 Column Formwork Pressure Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/column-formwork-pressure-calculator/",
      "sources": [
        "ACI 347R-14(21) Guide to Formwork for Concrete, Section 2.2.2, Eq. 2.2 (for forms where no plan dimension exceeds 6.5 ft/2m, i.e. columns): Pmax = Cw×Cc×[150 + 9000R/T] psf, with a floor of 600×Cw psf and a ceiling of full hydrostatic pressure (w×h) — this equation has no stated upper rate-of-placement limit in the Guide (unlike the wall equation's 15 ft/hr cap), reflecting that column forms are typically filled quickly enough that the full-hydrostatic ceiling governs naturally at high rates. Cw and Cc coefficients are identical to and defined the same way as this site's companion wall formwork pressure calculator. This formula ONLY applies when slump ≤7in and normal internal vibration to ≤4ft depth is used — SCC and high-slump/retarded mixes must use this site's full-hydrostatic SCC formwork pressure calculator instead."
      ],
      "vectors": [
        {
          "name": "150pcf, 10ft/hr, 70°F, Cc=1.0, 9.144m (30ft) column",
          "inputs": {
            "freshDensity": 2402.7695061,
            "pourRate": 10,
            "concreteTemperature": 21.1111111,
            "cementCoefficient": "1.0",
            "columnHeight": 9.144
          },
          "expected": 1435.71,
          "toleranceDecimalPlaces": -1,
          "unit": "psf",
          "confidence": "medium",
          "steps": [
            {
              "label": "Unit weight coefficient Cw",
              "value": 1,
              "unit": "(dimensionless)"
            },
            {
              "label": "Full hydrostatic ceiling",
              "value": 4499.999999999999,
              "unit": "psf"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150pcf, 15ft/hr, 60°F, Cc=1.2, 9.144m (30ft) column",
          "inputs": {
            "freshDensity": 2402.7695061,
            "pourRate": 15,
            "concreteTemperature": 15.5555556,
            "cementCoefficient": "1.2",
            "columnHeight": 9.144
          },
          "expected": 2880,
          "toleranceDecimalPlaces": -1,
          "unit": "psf",
          "confidence": "medium",
          "steps": [
            {
              "label": "Unit weight coefficient Cw",
              "value": 1,
              "unit": "(dimensionless)"
            },
            {
              "label": "Full hydrostatic ceiling",
              "value": 4499.999999999999,
              "unit": "psf"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "combustion-air-free-area-calculator",
      "title": "Appliance Combustion Air Free Area Calculator (Indoor Air Method)",
      "url": "https://craftquantities.com/calculators/materials-quantities/combustion-air-free-area-calculator/",
      "sources": [
        "Indoor air method per NFPA 54 (National Fuel Gas Code) / International Fuel Gas Code: each combustion air opening requires a minimum free area of 1 square inch per 1,000 BTU/hr of total appliance input but NOT LESS THAN 100 square inches (645 cm²) per opening, with two openings required (one within 12 in of the ceiling, one within 12 in of the floor) when using this method for a confined space."
      ],
      "vectors": [
        {
          "name": "40,000 BTU/hr water heater is floored at 100 in², not 40",
          "inputs": {
            "applianceInput": 11722.8428068888
          },
          "expected": 100,
          "toleranceDecimalPlaces": 0,
          "unit": "in²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Free area before the 100 in² floor is applied",
              "value": 40,
              "unit": "in²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "100,000 BTU/hr (29.3 kW) appliance",
          "inputs": {
            "applianceInput": 29307.107017222
          },
          "expected": 100,
          "toleranceDecimalPlaces": 0,
          "unit": "in²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Free area before the 100 in² floor is applied",
              "value": 100,
              "unit": "in²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150,000 BTU/hr (43.96 kW) appliance",
          "inputs": {
            "applianceInput": 43960.660525833
          },
          "expected": 150,
          "toleranceDecimalPlaces": 0,
          "unit": "in²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Free area before the 100 in² floor is applied",
              "value": 150,
              "unit": "in²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "common-rafter-length-calculator",
      "title": "Common Gable Rafter Length Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/common-rafter-length-calculator/",
      "sources": [
        "Standard carpentry rafter-length formula: rafter length = run × √(1 + (rise/12)²), where run is the horizontal distance from wall plate to ridge"
      ],
      "vectors": [
        {
          "name": "8m building, 6/12 pitch, 0.4m overhang",
          "inputs": {
            "buildingWidth": 8,
            "roofPitch": 6,
            "overhang": 0.4
          },
          "expected": 4.919,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Rafter length to ridge (no overhang)",
              "value": 4.47213595499958,
              "unit": "m"
            },
            {
              "label": "Overhang tail length",
              "value": 0.447213595499958,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "10m building, 8/12 pitch, 0.5m overhang",
          "inputs": {
            "buildingWidth": 10,
            "roofPitch": 8,
            "overhang": 0.5
          },
          "expected": 6.61,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Rafter length to ridge (no overhang)",
              "value": 6.009252125773315,
              "unit": "m"
            },
            {
              "label": "Overhang tail length",
              "value": 0.6009252125773316,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "compost-blend-calculator",
      "title": "Compost Blend Calculator",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/compost-blend-calculator/",
      "sources": [
        "A 25-50 mm compost layer incorporated into the top 150-200 mm is standard soil-improvement practice — university extension horticulture guidance",
        "Target organic matter for productive vegetable soil is commonly 5-10% by volume"
      ],
      "vectors": [
        {
          "name": "20 m² at 50 mm",
          "inputs": {
            "area": 20,
            "layerDepth": 0.05,
            "incorporationDepth": 0.15
          },
          "expected": 1,
          "toleranceDecimalPlaces": 2,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Litres",
              "value": 1000,
              "unit": "L"
            },
            {
              "label": "50 L bags",
              "value": 20,
              "unit": "bags"
            },
            {
              "label": "Cubic yards",
              "value": 1.3079506193143922,
              "unit": "yd³"
            },
            {
              "label": "Resulting organic content by volume",
              "value": 25,
              "unit": "%"
            },
            {
              "label": "Approximate weight",
              "value": 550,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A thinner 25 mm dressing",
          "inputs": {
            "area": 20,
            "layerDepth": 0.025,
            "incorporationDepth": 0.15
          },
          "expected": 0.5,
          "toleranceDecimalPlaces": 2,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Litres",
              "value": 500,
              "unit": "L"
            },
            {
              "label": "50 L bags",
              "value": 10,
              "unit": "bags"
            },
            {
              "label": "Cubic yards",
              "value": 0.6539753096571961,
              "unit": "yd³"
            },
            {
              "label": "Resulting organic content by volume",
              "value": 14.285714285714288,
              "unit": "%"
            },
            {
              "label": "Approximate weight",
              "value": 275,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A larger plot scales linearly",
          "inputs": {
            "area": 100,
            "layerDepth": 0.05,
            "incorporationDepth": 0.15
          },
          "expected": 5,
          "toleranceDecimalPlaces": 1,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Litres",
              "value": 5000,
              "unit": "L"
            },
            {
              "label": "50 L bags",
              "value": 100,
              "unit": "bags"
            },
            {
              "label": "Cubic yards",
              "value": 6.539753096571961,
              "unit": "yd³"
            },
            {
              "label": "Resulting organic content by volume",
              "value": 25,
              "unit": "%"
            },
            {
              "label": "Approximate weight",
              "value": 2750,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Zero area is zero compost",
          "inputs": {
            "area": 0,
            "layerDepth": 0.05,
            "incorporationDepth": 0.15
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Litres",
              "value": 0,
              "unit": "L"
            },
            {
              "label": "50 L bags",
              "value": 0,
              "unit": "bags"
            },
            {
              "label": "Cubic yards",
              "value": 0,
              "unit": "yd³"
            },
            {
              "label": "Resulting organic content by volume",
              "value": 25,
              "unit": "%"
            },
            {
              "label": "Approximate weight",
              "value": 0,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "compost-cubic-yards-to-tons-calculator",
      "title": "Compost Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/compost-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 0.6 short tons per cubic yard",
        "Density varies with moisture, composition and how the material was broken or processed"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 6,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.6,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 60,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.6,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "compost-tons-to-cubic-yards-calculator",
      "title": "Compost Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/compost-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 0.6 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 16.666666666666668,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.6666666666666667,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 166.66666666666669,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.6666666666666667,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "concrete-bag-calculator",
      "title": "Concrete Bag Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/concrete-bag-calculator/",
      "sources": [
        "Standard published yields for pre-mixed concrete: a 40 lb bag yields about 0.30 cubic ft, a 60 lb bag about 0.45 cubic ft, and an 80 lb bag about 0.60 cubic ft — a flat 0.0075 cubic ft per pound of dry mix, which puts the 20, 25 and 30 kg bags stocked in metric markets at about 9.4, 11.7 and 14.0 litres",
        "Post footing volume = pi x radius² x height, per post"
      ],
      "vectors": [
        {
          "name": "4 posts, 0.3m diameter, 0.6m deep, 60lb bags",
          "inputs": {
            "postDiameter": 0.3,
            "postHeight": 0.6,
            "postCount": 4,
            "bagSize": "60"
          },
          "expected": 14,
          "toleranceDecimalPlaces": 0,
          "unit": "x 60 lb bags",
          "confidence": "high",
          "steps": [
            {
              "label": "Total concrete volume",
              "value": 5.990992066954827,
              "unit": "ft³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "6 posts, 0.25m diameter, 0.9m deep, 80lb bags",
          "inputs": {
            "postDiameter": 0.25,
            "postHeight": 0.9,
            "postCount": 6,
            "bagSize": "80"
          },
          "expected": 16,
          "toleranceDecimalPlaces": 0,
          "unit": "x 80 lb bags",
          "confidence": "high",
          "steps": [
            {
              "label": "Total concrete volume",
              "value": 9.360925104616918,
              "unit": "ft³"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "concrete-bags-to-cubic-yards-calculator",
      "title": "Concrete Bags to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/concrete-bags-to-cubic-yards-calculator/",
      "sources": [
        "Typical yield for an 80 lb bag of standard concrete mix: approximately 0.6 cubic feet of set concrete",
        "1 cubic yard = 27 cubic feet, so roughly 45 x 80 lb bags per cubic yard"
      ],
      "vectors": [
        {
          "name": "45 bags converts correctly",
          "inputs": {
            "bags": 45
          },
          "expected": 1,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.022222222222222223,
              "unit": "cu yd per bags"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "bags": 450
          },
          "expected": 10,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.022222222222222223,
              "unit": "cu yd per bags"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "concrete-calculator",
      "title": "Concrete Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/concrete-calculator/",
      "sources": [
        "Standard formula: cubic yards = length (ft) x width (ft) x thickness (ft) / 27",
        "An 80 lb bag of pre-mixed concrete yields approximately 0.6 cubic feet once mixed"
      ],
      "vectors": [
        {
          "name": "3x3m slab, 0.1m thick, 10% waste",
          "inputs": {
            "slabLength": 3,
            "slabWidth": 3,
            "slabThickness": 0.1,
            "wasteFactorPercent": 10
          },
          "expected": 1.29,
          "toleranceDecimalPlaces": 1,
          "unit": "cubic yards",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume (no waste)",
              "value": 0.9,
              "unit": "m³"
            },
            {
              "label": "Volume with waste factor",
              "value": 0.9900000000000001,
              "unit": "m³"
            },
            {
              "label": "Cubic feet",
              "value": 34.96152005427371,
              "unit": "ft³"
            },
            {
              "label": "80 lb bags needed",
              "value": 59,
              "unit": "bags"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "6x4m slab, 0.15m thick, 5% waste",
          "inputs": {
            "slabLength": 6,
            "slabWidth": 4,
            "slabThickness": 0.15,
            "wasteFactorPercent": 5
          },
          "expected": 4.94,
          "toleranceDecimalPlaces": 1,
          "unit": "cubic yards",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume (no waste)",
              "value": 3.5999999999999996,
              "unit": "m³"
            },
            {
              "label": "Volume with waste factor",
              "value": 3.78,
              "unit": "m³"
            },
            {
              "label": "Cubic feet",
              "value": 133.48944020722686,
              "unit": "ft³"
            },
            {
              "label": "80 lb bags needed",
              "value": 223,
              "unit": "bags"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "concrete-control-joint-spacing-calculator",
      "title": "Concrete Control Joint Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/concrete-control-joint-spacing-calculator/",
      "sources": [
        "Widely cited rule of thumb: maximum control joint spacing in feet = slab thickness in inches x 2 to 3 (this calculator uses the commonly recommended middle value of 2.5)"
      ],
      "vectors": [
        {
          "name": "0.1m (4in) slab",
          "inputs": {
            "slabThickness": 0.1
          },
          "expected": 9.84,
          "toleranceDecimalPlaces": 2,
          "unit": "ft (maximum spacing)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Slab thickness",
              "value": 3.9370078740157486,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "0.15m (6in) slab",
          "inputs": {
            "slabThickness": 0.15
          },
          "expected": 14.76,
          "toleranceDecimalPlaces": 2,
          "unit": "ft (maximum spacing)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Slab thickness",
              "value": 5.905511811023622,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "concrete-curing-blanket-calculator",
      "title": "Concrete Curing Blanket Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/concrete-curing-blanket-calculator/",
      "sources": [
        "A standard insulated concrete curing blanket roll (6 ft x 25 ft) covers approximately 150 sq ft"
      ],
      "vectors": [
        {
          "name": "20m² slab",
          "inputs": {
            "slabArea": 20
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "blankets",
          "confidence": "medium",
          "steps": [
            {
              "label": "Area to cover (with overlap)",
              "value": 247.56993958432358,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "40m² slab",
          "inputs": {
            "slabArea": 40
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "blankets",
          "confidence": "medium",
          "steps": [
            {
              "label": "Area to cover (with overlap)",
              "value": 495.13987916864716,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "concrete-elastic-modulus-calculator",
      "title": "Concrete Elastic Modulus Calculator (ACI 318)",
      "url": "https://craftquantities.com/calculators/materials-quantities/concrete-elastic-modulus-calculator/",
      "sources": [
        "ACI 318 Section 19.2.2: Ec = 33 x wc^1.5 x sqrt(f'c), where Ec and f'c are in psi and wc (unit weight) is in pcf, valid for wc between 90 and 160 pcf"
      ],
      "vectors": [
        {
          "name": "150 pcf, 4000 psi",
          "inputs": {
            "unitWeight": 2402.7695061,
            "compressiveStrengthPsi": 27579029.172672
          },
          "expected": 3835,
          "toleranceDecimalPlaces": -1,
          "unit": "ksi",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in MPa",
              "value": 26436.25774953608,
              "unit": "MPa"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "145 pcf, 3000 psi",
          "inputs": {
            "unitWeight": 2322.6771892,
            "compressiveStrengthPsi": 20684271.879504
          },
          "expected": 3156,
          "toleranceDecimalPlaces": -1,
          "unit": "ksi",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in MPa",
              "value": 21759.34028507162,
              "unit": "MPa"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "concrete-evaporation-calculator",
      "title": "Concrete Evaporation Rate Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/concrete-evaporation-calculator/",
      "sources": [
        "ACI 305R / Uno metric evaporation equation: E = 5 x ([Tc+18]^2.5 - r x [Ta+18]^2.5) x (V+4) x 10^-6, with E in kg/m2/h, temperatures in degrees C and wind speed in km/h",
        "Widely cited critical threshold: evaporation rate at or above approximately 0.2 lb/sq ft/hr (1.0 kg/m²/hr) significantly raises the risk of plastic shrinkage cracking"
      ],
      "vectors": [
        {
          "name": "ACI 305R nomograph reference point (21.1C both, 50% RH, 16 km/h)",
          "inputs": {
            "concreteTempC": 21.1,
            "airTempC": 21.1,
            "relativeHumidityPercent": 50,
            "windSpeedKmh": 16
          },
          "expected": 0.478,
          "toleranceDecimalPlaces": 2,
          "unit": "kg/m²/hr",
          "confidence": "high",
          "steps": [
            {
              "label": "Critical threshold",
              "value": 1,
              "unit": "kg/m²/hr"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Cool, humid, calm conditions (no net evaporation)",
          "inputs": {
            "concreteTempC": 15,
            "airTempC": 18,
            "relativeHumidityPercent": 90,
            "windSpeedKmh": 0
          },
          "expected": 0,
          "toleranceDecimalPlaces": 0,
          "unit": "kg/m²/hr",
          "confidence": "high",
          "steps": [
            {
              "label": "Critical threshold",
              "value": 1,
              "unit": "kg/m²/hr"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Warm, moderate humidity, breezy (below the critical threshold)",
          "inputs": {
            "concreteTempC": 25,
            "airTempC": 20,
            "relativeHumidityPercent": 50,
            "windSpeedKmh": 10
          },
          "expected": 0.537,
          "toleranceDecimalPlaces": 2,
          "unit": "kg/m²/hr",
          "confidence": "high",
          "steps": [
            {
              "label": "Critical threshold",
              "value": 1,
              "unit": "kg/m²/hr"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Hot, dry, windy (genuinely critical)",
          "inputs": {
            "concreteTempC": 32,
            "airTempC": 35,
            "relativeHumidityPercent": 25,
            "windSpeedKmh": 25
          },
          "expected": 1.822,
          "toleranceDecimalPlaces": 1,
          "unit": "kg/m²/hr",
          "confidence": "low",
          "steps": [
            {
              "label": "Critical threshold",
              "value": 1,
              "unit": "kg/m²/hr"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "concrete-formwork-calculator",
      "title": "Concrete Formwork Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/concrete-formwork-calculator/",
      "sources": [
        "Formwork surface area = perimeter x form height (2 x [length + width] x thickness); board count = perimeter / stock board length, with a waste allowance for stakes and cuts. Form timber is commonly stocked in 8 ft boards in North America, and in the 2.4 m lengths metric timber merchants run, structural timber there stepping by 300 mm"
      ],
      "vectors": [
        {
          "name": "4x3m slab, 0.1m form height",
          "inputs": {
            "slabLength": 4,
            "slabWidth": 3,
            "formworkHeight": 0.1
          },
          "expected": 7,
          "toleranceDecimalPlaces": 0,
          "unit": "x 8 ft boards",
          "confidence": "medium",
          "steps": [
            {
              "label": "Formwork surface area",
              "value": 15.06947458339361,
              "unit": "sq ft"
            },
            {
              "label": "Perimeter (with waste)",
              "value": 50.524934383202094,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "6x4m slab, 0.15m form height",
          "inputs": {
            "slabLength": 6,
            "slabWidth": 4,
            "formworkHeight": 0.15
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "x 8 ft boards",
          "confidence": "medium",
          "steps": [
            {
              "label": "Formwork surface area",
              "value": 32.29173125012917,
              "unit": "sq ft"
            },
            {
              "label": "Perimeter (with waste)",
              "value": 72.17847769028872,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "4x3m slab with no cutting allowance",
          "inputs": {
            "slabLength": 4,
            "slabWidth": 3,
            "formworkHeight": 0.1,
            "wastePercent": 0
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "x 8 ft boards",
          "confidence": "medium",
          "steps": [
            {
              "label": "Formwork surface area",
              "value": 15.06947458339361,
              "unit": "sq ft"
            },
            {
              "label": "Perimeter (with waste)",
              "value": 45.93175853018372,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "concrete-maturity-method-calculator",
      "title": "Concrete Maturity Method Calculator (Nurse-Saul)",
      "url": "https://craftquantities.com/calculators/materials-quantities/concrete-maturity-method-calculator/",
      "sources": [
        "ASTM C1074 Nurse-Saul maturity function: M(t) = Σ(T − T0) × Δt, where T is the concrete temperature, T0 is the datum temperature and Δt is the elapsed time interval. C1074 recommends T0 = 0°C (32°F) for Type I cement without admixtures cured between 0 and 40°C, and gives Annex A1 for determining it experimentally for any other mixture",
        "ASTM C1074: the increment (T − T0) is taken as zero for any interval in which the concrete is at or below the datum temperature"
      ],
      "vectors": [
        {
          "name": "20°C average, 168 hours (7 days), ASTM 0°C datum",
          "inputs": {
            "averageTemp": 20,
            "elapsedTime": 168,
            "datumTemp": 0
          },
          "expected": 3360,
          "toleranceDecimalPlaces": 0,
          "unit": "°C-hours",
          "confidence": "medium",
          "steps": [
            {
              "label": "Elapsed time",
              "value": 7,
              "unit": "days"
            },
            {
              "label": "Datum temperature used (°C)",
              "value": 0,
              "unit": "°C"
            },
            {
              "label": "Temperature above datum (Δ°C)",
              "value": 20,
              "unit": "Δ°C"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "15°C average, 336 hours (14 days), ASTM 0°C datum",
          "inputs": {
            "averageTemp": 15,
            "elapsedTime": 336,
            "datumTemp": 0
          },
          "expected": 5040,
          "toleranceDecimalPlaces": 0,
          "unit": "°C-hours",
          "confidence": "medium",
          "steps": [
            {
              "label": "Elapsed time",
              "value": 14,
              "unit": "days"
            },
            {
              "label": "Datum temperature used (°C)",
              "value": 0,
              "unit": "°C"
            },
            {
              "label": "Temperature above datum (Δ°C)",
              "value": 15,
              "unit": "Δ°C"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Saul's original −10°C datum is still available, and reports 50% more",
          "inputs": {
            "averageTemp": 20,
            "elapsedTime": 168,
            "datumTemp": -10
          },
          "expected": 5040,
          "toleranceDecimalPlaces": 0,
          "unit": "°C-hours",
          "confidence": "medium",
          "steps": [
            {
              "label": "Elapsed time",
              "value": 7,
              "unit": "days"
            },
            {
              "label": "Datum temperature used (°C)",
              "value": -10,
              "unit": "°C"
            },
            {
              "label": "Temperature above datum (Δ°C)",
              "value": 30,
              "unit": "Δ°C"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "below the datum, maturity is zero rather than negative",
          "inputs": {
            "averageTemp": -5,
            "elapsedTime": 168,
            "datumTemp": 0
          },
          "expected": 0,
          "toleranceDecimalPlaces": 0,
          "unit": "°C-hours",
          "confidence": "low",
          "steps": [
            {
              "label": "Elapsed time",
              "value": 7,
              "unit": "days"
            },
            {
              "label": "Datum temperature used (°C)",
              "value": 0,
              "unit": "°C"
            },
            {
              "label": "Temperature above datum (Δ°C)",
              "value": 0,
              "unit": "Δ°C"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "concrete-mix-design-calculator",
      "title": "Concrete Mix Design Calculator — ACI 211.1 Absolute Volume Method",
      "url": "https://craftquantities.com/calculators/materials-quantities/concrete-mix-design-calculator/",
      "sources": [
        "ACI 211.1, Standard Practice for Selecting Proportions for Normal, Heavyweight, and Mass Concrete — the absolute-volume method, in which every ingredient's solid volume is its mass divided by its specific gravity and the fine aggregate fills the remainder of the unit volume",
        "The water content, air content, water-cement ratio and coarse aggregate volume that feed this arithmetic are read from ACI 211.1's own tables against your slump, maximum aggregate size, strength and exposure. Those tables are not reproduced here — take them from the standard",
        "Specific gravities are inputs, not constants: 3.15 is typical for portland cement but supplementary cementitious materials differ sharply (fly ash near 2.3, slag near 2.9), and aggregate specific gravity is a measured property of the source under ASTM C127 and C128",
        "All aggregate quantities are on a SATURATED SURFACE-DRY basis, as ACI 211.1 designs them. Correcting to the moisture of a real stockpile is a separate step and has its own page"
      ],
      "vectors": [
        {
          "name": "a 350 kg/m³ mix at w/c 0.5 with 2% air",
          "inputs": {
            "batchVolume": 1000,
            "cementMass": 350,
            "waterMass": 175,
            "coarseAggregateMass": 1050,
            "airPercent": 2,
            "cementSpecificGravity": 3.15,
            "coarseSpecificGravity": 2.68,
            "fineSpecificGravity": 2.63
          },
          "expected": 1751.6,
          "toleranceDecimalPlaces": 0,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cement, absolute volume",
              "value": 3.9238518579431765,
              "unit": "ft³"
            },
            {
              "label": "Water, absolute volume",
              "value": 6.180066676260503,
              "unit": "ft³"
            },
            {
              "label": "Coarse aggregate, absolute volume",
              "value": 13.83597017073247,
              "unit": "ft³"
            },
            {
              "label": "Air",
              "value": 0.7062933344297718,
              "unit": "ft³"
            },
            {
              "label": "Left for fine aggregate",
              "value": 10.668484682122669,
              "unit": "ft³"
            },
            {
              "label": "Total batch mass",
              "value": 5223.891508617272,
              "unit": "lb"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "entrained air for freeze-thaw takes volume the sand does not get",
          "inputs": {
            "batchVolume": 1000,
            "cementMass": 350,
            "waterMass": 175,
            "coarseAggregateMass": 1050,
            "airPercent": 6,
            "cementSpecificGravity": 3.15,
            "coarseSpecificGravity": 2.68,
            "fineSpecificGravity": 2.63
          },
          "expected": 1519.7,
          "toleranceDecimalPlaces": 0,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cement, absolute volume",
              "value": 3.9238518579431765,
              "unit": "ft³"
            },
            {
              "label": "Water, absolute volume",
              "value": 6.180066676260503,
              "unit": "ft³"
            },
            {
              "label": "Coarse aggregate, absolute volume",
              "value": 13.83597017073247,
              "unit": "ft³"
            },
            {
              "label": "Air",
              "value": 2.1188800032893154,
              "unit": "ft³"
            },
            {
              "label": "Left for fine aggregate",
              "value": 9.255898013263126,
              "unit": "ft³"
            },
            {
              "label": "Total batch mass",
              "value": 4991.96520879878,
              "unit": "lb"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "a design that does not fit returns no sand rather than a negative one",
          "inputs": {
            "batchVolume": 1000,
            "cementMass": 400,
            "waterMass": 200,
            "coarseAggregateMass": 1900,
            "airPercent": 2,
            "cementSpecificGravity": 3.15,
            "coarseSpecificGravity": 2.68,
            "fineSpecificGravity": 2.63
          },
          "expected": 0,
          "toleranceDecimalPlaces": 1,
          "unit": "lb",
          "confidence": "low",
          "steps": [
            {
              "label": "Cement, absolute volume",
              "value": 4.484402123363631,
              "unit": "ft³"
            },
            {
              "label": "Water, absolute volume",
              "value": 7.062933344297718,
              "unit": "ft³"
            },
            {
              "label": "Coarse aggregate, absolute volume",
              "value": 25.036517451801608,
              "unit": "ft³"
            },
            {
              "label": "Air",
              "value": 0.7062933344297718,
              "unit": "ft³"
            },
            {
              "label": "Left for fine aggregate",
              "value": -1.9754795324041432,
              "unit": "ft³"
            },
            {
              "label": "Total batch mass",
              "value": 5511.5565546219395,
              "unit": "lb"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "concrete-mix-ratio-calculator",
      "title": "Concrete Mix Ratio Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/concrete-mix-ratio-calculator/",
      "sources": [
        "Each component's loose volume = batch volume x (its ratio parts / total ratio parts), with no allowance applied for the volume a batch loses on mixing; a 94 lb bag of portland cement is commonly estimated at about 1 cubic ft loose volume, which is a bulk density of about 1,506 kg/m³ — putting the 25 kg bag stocked in metric markets at about 16.6 litres"
      ],
      "vectors": [
        {
          "name": "27 ft³ total, 1:2:3 ratio",
          "inputs": {
            "mixVolume": 764.554857984,
            "cementParts": 1,
            "sandParts": 2,
            "gravelParts": 3
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "x 94 lb cement bags",
          "confidence": "medium",
          "steps": [
            {
              "label": "Sand needed",
              "value": 9,
              "unit": "ft³"
            },
            {
              "label": "Gravel needed",
              "value": 13.5,
              "unit": "ft³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "54 ft³ total, 1:3:4 ratio",
          "inputs": {
            "mixVolume": 1529.109715968,
            "cementParts": 1,
            "sandParts": 3,
            "gravelParts": 4
          },
          "expected": 7,
          "toleranceDecimalPlaces": 0,
          "unit": "x 94 lb cement bags",
          "confidence": "medium",
          "steps": [
            {
              "label": "Sand needed",
              "value": 20.25,
              "unit": "ft³"
            },
            {
              "label": "Gravel needed",
              "value": 27,
              "unit": "ft³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "concrete-mix-temperature-calculator",
      "title": "Concrete Mix Temperature and Ice Substitution Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/concrete-mix-temperature-calculator/",
      "sources": [
        "ACI 305R Guide to Hot Weather Concreting mixing-temperature equation: T = [0.22(Ta·Ma + Tc·Mc) + Tw·Mw + Twa·Mwa] / [0.22(Ma + Mc) + Mw + Mwa], where 0.22 is the ratio of the specific heat of cement and aggregate to that of water, Mwa is the free moisture riding on the aggregate and Twa its temperature",
        "Ice substitution, from the same equation: subtract 79.6 x Mi from the numerator and add Mi to the denominator, working in °C and kilograms. 79.6 is the latent heat of fusion of ice divided by the specific heat of water, with the ice taken as being at 0 °C",
        "ACI 305.1 Specification for Hot Weather Concreting — the specification that sets a maximum as-delivered temperature and the protection measures that go with it",
        "ACI 306.1 Specification for Cold Weather Concreting — the minimum as-placed temperatures that govern the other end of the target range, and the reason heated water is a substitution as legitimate as ice"
      ],
      "vectors": [
        {
          "name": "Hot stockpile, no ice",
          "inputs": {
            "cementMass": 320,
            "cementTemp": 40,
            "aggregateMass": 1850,
            "aggregateTemp": 28,
            "freeMoisturePercent": 3,
            "mixWaterMass": 150,
            "mixWaterTemp": 20,
            "icePercent": 0,
            "targetTemp": 30
          },
          "expected": 27.48,
          "toleranceDecimalPlaces": 2,
          "unit": "°C",
          "confidence": "medium",
          "steps": [
            {
              "label": "Same batch with no ice substituted",
              "value": 27.47986528042173,
              "unit": "°C"
            },
            {
              "label": "Difference from the target",
              "value": -2.5201347195782695,
              "unit": "Δ°C"
            },
            {
              "label": "Ice charged",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Liquid water charged",
              "value": 150,
              "unit": "kg"
            },
            {
              "label": "Free moisture riding on the aggregate",
              "value": 55.5,
              "unit": "kg"
            },
            {
              "label": "Ice that would reach the target on its own",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Water temperature that would reach the target",
              "value": 31.473333333333333,
              "unit": "°C"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Same batch with 30% of the water as ice",
          "inputs": {
            "cementMass": 320,
            "cementTemp": 40,
            "aggregateMass": 1850,
            "aggregateTemp": 28,
            "freeMoisturePercent": 3,
            "mixWaterMass": 150,
            "mixWaterTemp": 20,
            "icePercent": 30,
            "targetTemp": 30
          },
          "expected": 20.917,
          "toleranceDecimalPlaces": 2,
          "unit": "°C",
          "confidence": "medium",
          "steps": [
            {
              "label": "Same batch with no ice substituted",
              "value": 27.47986528042173,
              "unit": "°C"
            },
            {
              "label": "Difference from the target",
              "value": -9.083321130472982,
              "unit": "Δ°C"
            },
            {
              "label": "Ice charged",
              "value": 45,
              "unit": "kg"
            },
            {
              "label": "Liquid water charged",
              "value": 105,
              "unit": "kg"
            },
            {
              "label": "Free moisture riding on the aggregate",
              "value": 55.5,
              "unit": "kg"
            },
            {
              "label": "Ice that would reach the target on its own",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Water temperature that would reach the target",
              "value": 79.07619047619048,
              "unit": "°C"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "concrete-mpa-to-psi-calculator",
      "title": "Concrete MPa to PSI Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/concrete-mpa-to-psi-calculator/",
      "sources": [
        "1 MPa = 1,000,000 Pa = 145.0377 psi"
      ],
      "vectors": [
        {
          "name": "30 MPa converts correctly",
          "inputs": {
            "mpa": 30
          },
          "expected": 4351.13213391,
          "toleranceDecimalPlaces": 6,
          "unit": "psi",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 145.037737797,
              "unit": "psi per MPa"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "mpa": 300
          },
          "expected": 43511.3213391,
          "toleranceDecimalPlaces": 6,
          "unit": "psi",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 145.037737797,
              "unit": "psi per MPa"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "concrete-psi-to-mpa-calculator",
      "title": "Concrete PSI to MPa Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/concrete-psi-to-mpa-calculator/",
      "sources": [
        "1 psi = 6,894.757293 Pa exactly, so 1 MPa = 145.038 psi",
        "Concrete compressive strength is conventionally the 28-day value; US testing uses cylinders, much of Europe uses cubes"
      ],
      "vectors": [
        {
          "name": "4000 psi converts correctly",
          "inputs": {
            "psi": 4000
          },
          "expected": 27.57902916,
          "toleranceDecimalPlaces": 6,
          "unit": "MPa",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.00689475729,
              "unit": "MPa per psi"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "psi": 40000
          },
          "expected": 275.7902916,
          "toleranceDecimalPlaces": 6,
          "unit": "MPa",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.00689475729,
              "unit": "MPa per psi"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "concrete-pump-friction-loss-calculator",
      "title": "Concrete Pump Line Friction Loss Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/concrete-pump-friction-loss-calculator/",
      "sources": [
        "ACI 304.2R pumping guidance: each foot of vertical lift requires roughly 3-4 times the pumping pressure of a foot of horizontal line, so vertical lift is converted to an equivalent horizontal distance at that ratio before estimating total pressure loss"
      ],
      "vectors": [
        {
          "name": "50m horizontal, 10m vertical, ratio 4, 30 psi/100ft",
          "inputs": {
            "horizontalRunLength": 50,
            "verticalLiftHeight": 10,
            "verticalEquivalencyRatio": 4,
            "frictionLossPerHundredFt": 30
          },
          "expected": 88.58,
          "toleranceDecimalPlaces": 1,
          "unit": "psi",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent horizontal pumping distance",
              "value": 295.2755905511811,
              "unit": "ft"
            },
            {
              "label": "Static head of the concrete column",
              "value": 34.17541557305337,
              "unit": "psi"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30m horizontal, 20m vertical, ratio 4, 25 psi/100ft",
          "inputs": {
            "horizontalRunLength": 30,
            "verticalLiftHeight": 20,
            "verticalEquivalencyRatio": 4,
            "frictionLossPerHundredFt": 25
          },
          "expected": 90.23,
          "toleranceDecimalPlaces": 0,
          "unit": "psi",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent horizontal pumping distance",
              "value": 360.8923884514436,
              "unit": "ft"
            },
            {
              "label": "Static head of the concrete column",
              "value": 68.35083114610674,
              "unit": "psi"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "concrete-resurfacer-calculator",
      "title": "Concrete Resurfacer and Patch Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/concrete-resurfacer-calculator/",
      "sources": [
        "ARDEX UK, ARDEX K 301 product data sheet (April 2025): a resurfacing mortar for exterior concrete such as driveways, garage floors, paths and patios; applied from 2mm to 20mm thick in a single application, the thickness of combined layers not to exceed 20mm; coverage approximately 1.6kg powder/m²/mm, i.e. approximately 3.0m² at 5mm thickness per 25kg bag",
        "QUIKRETE, Re-Cap Concrete Resurfacer (No. 1131) data sheet (revised January 2023): applied from a feather edge of 1/16 in to 1/2 in (1.6 mm to 13 mm), built up in layers each not exceeding 1/4 in (6.3 mm); one 40 lb bag covers approximately 16 ft2 (1.5 m2) at 1/4 in (6.3 mm), or approximately 65 ft2 (6.0 m2) at 1/16 in (1.6 mm)",
        "ARDEX UK, ARDEX A 46 product data sheet (June 2018): a rapid concrete repair mortar applied from 2mm to 30mm, and for localised small repairs up to 50mm thick, with coarse aggregate added for localised thicknesses over 20mm; an 11kg bag produces approximately 8 litres of mortar, approximately 4m² at 2mm",
        "QUIKRETE, Vinyl Concrete Patcher (No. 1133) data sheet (revised February 2022): troweled to a feather edge of 1/16 inch (1.6 mm); a 40 lb bag covers multiple applications for a total of 34 ft2 (3.1 m2) at 1/8 inch thickness; not intended for use as a coating or over large areas, which must be less than 2 ft2 (0.19 m2)"
      ],
      "vectors": [
        {
          "name": "UK opening: 20 m² of driveway in ARDEX K 301 at 5 mm, 3.0 m² a bag at 5 mm",
          "inputs": {
            "repairArea": 20,
            "repairDepth": 0.005,
            "bagCoverageArea": 3,
            "bagCoverageThickness": 0.005,
            "leastDepth": 0.002,
            "greatestDepth": 0.02,
            "wastePercent": 0
          },
          "expected": 7,
          "toleranceDecimalPlaces": 0,
          "unit": "bags",
          "confidence": "high",
          "steps": [
            {
              "label": "Material to place",
              "value": 3.531466672148859,
              "unit": "ft³"
            },
            {
              "label": "Mortar from one bag",
              "value": 0.5297200008223288,
              "unit": "ft³"
            },
            {
              "label": "Area one bag covers at the depth entered",
              "value": 3,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A 20 x 24 ft driveway in QUIKRETE Re-Cap at 1/8 in, 16 sq ft a bag at 1/4 in",
          "inputs": {
            "repairArea": 44.593459200000005,
            "repairDepth": 0.003175,
            "bagCoverageArea": 1.48644864,
            "bagCoverageThickness": 0.00635,
            "leastDepth": 0.0015875,
            "greatestDepth": 0.0127,
            "wastePercent": 0
          },
          "expected": 15,
          "toleranceDecimalPlaces": 0,
          "unit": "bags",
          "confidence": "high",
          "steps": [
            {
              "label": "Material to place",
              "value": 5,
              "unit": "ft³"
            },
            {
              "label": "Mortar from one bag",
              "value": 0.3333333333333333,
              "unit": "ft³"
            },
            {
              "label": "Area one bag covers at the depth entered",
              "value": 2.97289728,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "ARDEX A 46 patches, 1.5 m² averaging 12 mm, 4 m² a bag at 2 mm",
          "inputs": {
            "repairArea": 1.5,
            "repairDepth": 0.012,
            "bagCoverageArea": 4,
            "bagCoverageThickness": 0.002,
            "leastDepth": 0.002,
            "greatestDepth": 0.03,
            "wastePercent": 0
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "bags",
          "confidence": "high",
          "steps": [
            {
              "label": "Material to place",
              "value": 0.6356640009867948,
              "unit": "ft³"
            },
            {
              "label": "Mortar from one bag",
              "value": 0.2825173337719087,
              "unit": "ft³"
            },
            {
              "label": "Area one bag covers at the depth entered",
              "value": 0.6666666666666666,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "concrete-rubble-cubic-yards-to-tons-calculator",
      "title": "Concrete Rubble Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/concrete-rubble-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 1.5 short tons per cubic yard",
        "Density varies with moisture, composition and how the material was broken or processed"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 15,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.5,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 150,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.5,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "concrete-rubble-tons-to-cubic-yards-calculator",
      "title": "Concrete Rubble Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/concrete-rubble-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 1.5 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 6.666666666666666,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.6666666666666666,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 66.66666666666666,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.6666666666666666,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "concrete-slump-flow-calculator",
      "title": "Concrete Slump Flow Test Calculator (ASTM C1611)",
      "url": "https://craftquantities.com/calculators/materials-quantities/concrete-slump-flow-calculator/",
      "sources": [
        "ASTM C1611 slump flow test procedure and EFNARC/ACI SF1-SF2-SF3 flowability classes (SF1: 550-650mm, SF2: 651-750mm, SF3: 751-850mm) and VS1/VS2 viscosity classes based on the T50 spread time (VS1 ≤ 2s, VS2 > 2s)"
      ],
      "vectors": [
        {
          "name": "680/670mm spread, 3s T50",
          "inputs": {
            "diameter1": 0.68,
            "diameter2": 0.67,
            "t50Seconds": 3
          },
          "expected": 675,
          "toleranceDecimalPlaces": 0,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Diameter spread between the two readings",
              "value": 10,
              "unit": "mm"
            },
            {
              "label": "T50 spread time",
              "value": 3,
              "unit": "s"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "600/590mm spread, 1.5s T50",
          "inputs": {
            "diameter1": 0.6,
            "diameter2": 0.59,
            "t50Seconds": 1.5
          },
          "expected": 595,
          "toleranceDecimalPlaces": 0,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Diameter spread between the two readings",
              "value": 10,
              "unit": "mm"
            },
            {
              "label": "T50 spread time",
              "value": 1.5,
              "unit": "s"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "concrete-steps-volume-calculator",
      "title": "Concrete Steps Volume Calculator (Solid and Waist-Slab Flights)",
      "url": "https://craftquantities.com/calculators/materials-quantities/concrete-steps-volume-calculator/",
      "sources": [
        "Solid steps on the ground as a sum of prisms: step i, counted from the bottom, stands i risers high and one going deep, so n steps hold width × riser × going × n(n + 1)/2, plus a landing deeper than one going at the top step's height",
        "A cast flight on a waist slab: each step adds a triangle of riser × going ÷ 2, and the waist adds its thickness times the sloping length √(riser² + going²) per step, all times the width"
      ],
      "vectors": [
        {
          "name": "Four solid steps, 180 by 280 mm, 1.2 m wide, no waste",
          "inputs": {
            "form": "solid",
            "stepCount": 4,
            "riser": 0.18,
            "going": 0.28,
            "width": 1.2,
            "landingDepth": 0,
            "waistThickness": 0.15,
            "wastePercent": 0
          },
          "expected": 0.6048,
          "toleranceDecimalPlaces": 4,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "The steps down to the ground",
              "value": 0.6048,
              "unit": "m³"
            },
            {
              "label": "Concrete before waste",
              "value": 0.6048,
              "unit": "m³"
            },
            {
              "label": "Total rise",
              "value": 0.72,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The same with a 900 mm landing beyond the top going and 5% waste",
          "inputs": {
            "form": "solid",
            "stepCount": 4,
            "riser": 0.18,
            "going": 0.28,
            "width": 1.2,
            "landingDepth": 0.9,
            "waistThickness": 0.15,
            "wastePercent": 5
          },
          "expected": 1.45152,
          "toleranceDecimalPlaces": 4,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "The steps down to the ground",
              "value": 0.6048,
              "unit": "m³"
            },
            {
              "label": "The landing beyond one going",
              "value": 0.7776000000000001,
              "unit": "m³"
            },
            {
              "label": "Concrete before waste",
              "value": 1.3824,
              "unit": "m³"
            },
            {
              "label": "Total rise",
              "value": 0.72,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Ten steps on a 150 mm waist, 170 by 250 mm, 1.0 m wide",
          "inputs": {
            "form": "waist",
            "stepCount": 10,
            "riser": 0.17,
            "going": 0.25,
            "width": 1,
            "landingDepth": 0,
            "waistThickness": 0.15,
            "wastePercent": 0
          },
          "expected": 0.66599,
          "toleranceDecimalPlaces": 4,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Steps on top of the slab",
              "value": 0.21250000000000002,
              "unit": "m³"
            },
            {
              "label": "Waist slab",
              "value": 0.4534864937349292,
              "unit": "m³"
            },
            {
              "label": "Concrete before waste",
              "value": 0.6659864937349292,
              "unit": "m³"
            },
            {
              "label": "Total rise",
              "value": 1.7000000000000002,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "concrete-unit-weight-calculator",
      "title": "Concrete Unit Weight (Density) Calculator (ASTM C138)",
      "url": "https://craftquantities.com/calculators/materials-quantities/concrete-unit-weight-calculator/",
      "sources": [
        "ASTM C138 unit weight test: unit weight = (mass of measure filled with concrete - mass of empty measure) / volume of the measure"
      ],
      "vectors": [
        {
          "name": "25kg full, 8kg empty, 7L measure",
          "inputs": {
            "massFull": 25,
            "massEmpty": 8,
            "measureVolumeLiters": 7
          },
          "expected": 2428.57,
          "toleranceDecimalPlaces": -1,
          "unit": "kg/m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Net concrete mass",
              "value": 17,
              "unit": "kg"
            },
            {
              "label": "Equivalent in pcf",
              "value": 151.61076139883107,
              "unit": "pcf"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30kg full, 9kg empty, 7L measure",
          "inputs": {
            "massFull": 30,
            "massEmpty": 9,
            "measureVolumeLiters": 7
          },
          "expected": 3000,
          "toleranceDecimalPlaces": 0,
          "unit": "kg/m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Net concrete mass",
              "value": 21,
              "unit": "kg"
            },
            {
              "label": "Equivalent in pcf",
              "value": 187.2838817279678,
              "unit": "pcf"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "concrete-vibrator-insertion-spacing-calculator",
      "title": "Concrete Poker Vibrator Insertion Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/concrete-vibrator-insertion-spacing-calculator/",
      "sources": [
        "ACI 309R, Guide for Consolidation of Concrete — consolidation technique is vertical insertion under the head's own weight, a short hold, slow withdrawal, and insertion points spaced so that their radii of action overlap",
        "Spacing = 2 × radius of action × (1 − overlap fraction); insertion points per unit area = 1 ÷ spacing², for a square insertion grid",
        "The radius of action is a property of the head and the mix rather than a constant — it is published by the vibrator manufacturer for the head diameter and frequency, and it shortens in a stiff or heavily reinforced mix"
      ],
      "vectors": [
        {
          "name": "250 mm radius of action with a quarter overlap",
          "inputs": {
            "radiusOfAction": 0.25,
            "overlapPercent": 25,
            "layerDepth": 0.4,
            "penetrationIntoPreviousLayer": 0.15
          },
          "expected": 375,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Insertions needed per unit of lift area",
              "value": 7.111111111111111,
              "unit": "points/m²"
            },
            {
              "label": "Overlap achieved between adjacent circles of action",
              "value": 125,
              "unit": "mm"
            },
            {
              "label": "Minimum vibrating length to reach the layer below",
              "value": 550,
              "unit": "mm"
            },
            {
              "label": "Ground consolidated by one insertion",
              "value": 0.140625,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "300 mm radius of action with a heavy 40% overlap in congested steel",
          "inputs": {
            "radiusOfAction": 0.3,
            "overlapPercent": 40,
            "layerDepth": 0.5,
            "penetrationIntoPreviousLayer": 0.15
          },
          "expected": 360,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Insertions needed per unit of lift area",
              "value": 7.71604938271605,
              "unit": "points/m²"
            },
            {
              "label": "Overlap achieved between adjacent circles of action",
              "value": 240,
              "unit": "mm"
            },
            {
              "label": "Minimum vibrating length to reach the layer below",
              "value": 650,
              "unit": "mm"
            },
            {
              "label": "Ground consolidated by one insertion",
              "value": 0.1296,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "concrete-washout-solidifier-calculator",
      "title": "Concrete Washout Basin Solidifier Dosage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/concrete-washout-solidifier-calculator/",
      "sources": [
        "Product needed = (Washout Liquid Volume ÷ 100 gal) × Manufacturer's Dosage Rate (product amount per 100 gallons). Concrete washout solidifier dosage rates are product-specific and must come from the manufacturer's label/data sheet — this calculator applies whatever rate you supply. Construction stormwater general permits (NPDES) require concrete washout water to be contained on-site and not discharged, which is the regulatory driver for treating/solidifying washout water before disposal."
      ],
      "vectors": [
        {
          "name": "1892.706 L (500 gal), 25 lb/100gal",
          "inputs": {
            "washoutVolume": 1892.706,
            "dosageRate": 25
          },
          "expected": 125,
          "toleranceDecimalPlaces": 1,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Washout volume",
              "value": 500.00002853058163,
              "unit": "gal"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "3785.412 L (1000 gal), 30 lb/100gal",
          "inputs": {
            "washoutVolume": 3785.412,
            "dosageRate": 30
          },
          "expected": 300,
          "toleranceDecimalPlaces": 1,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Washout volume",
              "value": 1000.0000570611633,
              "unit": "gal"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "concrete-yield-calculator",
      "title": "Concrete Relative Yield Calculator (ASTM C138)",
      "url": "https://craftquantities.com/calculators/materials-quantities/concrete-yield-calculator/",
      "sources": [
        "ASTM C138 relative yield: actual yield = total batch mass / measured unit weight; relative yield = actual yield / design volume (should be close to 1.0)"
      ],
      "vectors": [
        {
          "name": "2400kg batch, 2350 kg/m³ measured, 1m³ design",
          "inputs": {
            "totalBatchMassKg": 2400,
            "measuredUnitWeightKgM3": 2350,
            "designVolumeM3": 1000
          },
          "expected": 1.0213,
          "toleranceDecimalPlaces": 2,
          "unit": "(ratio, target 1.0)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Actual yield",
              "value": 1.0212765957446808,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2350kg batch, 2400 kg/m³ measured, 1m³ design",
          "inputs": {
            "totalBatchMassKg": 2350,
            "measuredUnitWeightKgM3": 2400,
            "designVolumeM3": 1000
          },
          "expected": 0.9792,
          "toleranceDecimalPlaces": 2,
          "unit": "(ratio, target 1.0)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Actual yield",
              "value": 0.9791666666666666,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "conductor-ampacity-derating-calculator",
      "title": "Feeder Conductor Ampacity Derating Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/conductor-ampacity-derating-calculator/",
      "sources": [
        "Derated ampacity = base conductor ampacity × ambient temperature correction factor × conductor bundling/count adjustment factor, per NEC 310.15(B) temperature correction tables and NEC Table 310.15(C)(1) adjustment factors for more than 3 current-carrying conductors in a raceway"
      ],
      "vectors": [
        {
          "name": "130A base, 0.88 temp factor, 0.8 count factor",
          "inputs": {
            "baseAmpacity": 130,
            "tempCorrectionFactor": 0.88,
            "conductorCountFactor": 0.8
          },
          "expected": 91.52,
          "toleranceDecimalPlaces": 1,
          "unit": "A",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "175A base, 0.91 temp factor, 0.7 count factor",
          "inputs": {
            "baseAmpacity": 175,
            "tempCorrectionFactor": 0.91,
            "conductorCountFactor": 0.7
          },
          "expected": 111.48,
          "toleranceDecimalPlaces": 1,
          "unit": "A",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "conduit-bend-length-calculator",
      "title": "EMT Conduit Bend Length Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/conduit-bend-length-calculator/",
      "sources": [
        "Total conduit length = straight run length + (number of 90° bends × arc length per bend), where arc length per bend = (π/2) × bend radius, the standard quarter-circle arc length formula applied to conduit bending"
      ],
      "vectors": [
        {
          "name": "20m straight run, 3 bends, 0.15m radius",
          "inputs": {
            "straightRunLength": 20,
            "bendCount": 3,
            "bendRadius": 0.15
          },
          "expected": 20.71,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Arc length per bend",
              "value": 0.23561944901923448,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30m straight run, 4 bends, 0.2m radius",
          "inputs": {
            "straightRunLength": 30,
            "bendCount": 4,
            "bendRadius": 0.2
          },
          "expected": 31.26,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Arc length per bend",
              "value": 0.3141592653589793,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "conduit-fill-calculator",
      "title": "Conduit Fill Calculator",
      "url": "https://craftquantities.com/calculators/electrical/conduit-fill-calculator/",
      "sources": [
        "NEC Chapter 9, Table 1: conduit fill is limited to 40% of internal area for 3 or more conductors",
        "Approximate THHN conductor areas and EMT conduit internal areas, per NEC Chapter 9 tables",
        "NEC Chapter 9, Notes to Tables, Note 7: where all conductors are the same size, a result ending in a decimal of 0.8 or larger is taken to the next whole number"
      ],
      "vectors": [
        {
          "name": "12 AWG in 3/4 in EMT",
          "inputs": {
            "wireGauge": "12",
            "conduitSize": "0.75"
          },
          "expected": 16,
          "toleranceDecimalPlaces": 0,
          "unit": "conductors (maximum)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Available fill area (40% of conduit)",
              "value": 0.21320000000000003,
              "unit": "in²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "8 AWG in 1 in EMT",
          "inputs": {
            "wireGauge": "8",
            "conduitSize": "1"
          },
          "expected": 9,
          "toleranceDecimalPlaces": 0,
          "unit": "conductors (maximum)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Available fill area (40% of conduit)",
              "value": 0.3456,
              "unit": "in²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "14 AWG in 3/4 in EMT — Note 7 rounds this one up",
          "inputs": {
            "wireGauge": "14",
            "conduitSize": "0.75"
          },
          "expected": 22,
          "toleranceDecimalPlaces": 0,
          "unit": "conductors (maximum)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Available fill area (40% of conduit)",
              "value": 0.21320000000000003,
              "unit": "in²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "8 AWG in 3/4 in EMT — the smallest case Note 7 changes",
          "inputs": {
            "wireGauge": "8",
            "conduitSize": "0.75"
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "conductors (maximum)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Available fill area (40% of conduit)",
              "value": 0.21320000000000003,
              "unit": "in²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "12 AWG in 3/4 in EMT — Note 7 must NOT fire here",
          "inputs": {
            "wireGauge": "12",
            "conduitSize": "0.75"
          },
          "expected": 16,
          "toleranceDecimalPlaces": 0,
          "unit": "conductors (maximum)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Available fill area (40% of conduit)",
              "value": 0.21320000000000003,
              "unit": "in²"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "cone-frustum-development-calculator",
      "title": "Cone and Frustum Flat Pattern Development Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/cone-frustum-development-calculator/",
      "sources": [
        "Slant height of the frustum = √(h² + ((D − d)/2)²), where h is the vertical height between the two ends",
        "Pattern included angle = 180 × (D − d) / L degrees; outer radius = D × L / (D − d); inner radius = outer radius − L",
        "The pattern develops on the neutral surface — the mean diameter at mid-thickness — because that is the fibre that neither stretches nor compresses as the sheet is rolled"
      ],
      "vectors": [
        {
          "name": "600 to 300 across, 400 high, thin sheet over the outside",
          "inputs": {
            "largeDiameter": 0.6,
            "smallDiameter": 0.3,
            "verticalHeight": 0.4,
            "materialThickness": 0.0012,
            "dimensionsAt": "outside"
          },
          "expected": 126.4044,
          "toleranceDecimalPlaces": 2,
          "unit": "°",
          "confidence": "high",
          "steps": [
            {
              "label": "Outer radius",
              "value": 33.570534400893294,
              "unit": "in"
            },
            {
              "label": "Inner radius",
              "value": 16.75162939042571,
              "unit": "in"
            },
            {
              "label": "Slant height",
              "value": 16.81890501046758,
              "unit": "in"
            },
            {
              "label": "Arc length, large end",
              "value": 74.06242838462867,
              "unit": "in"
            },
            {
              "label": "Blank width needed",
              "value": 67.14106880178659,
              "unit": "in"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "a full cone — the small end closed to a point",
          "inputs": {
            "largeDiameter": 0.6,
            "smallDiameter": 0,
            "verticalHeight": 0.4,
            "materialThickness": 0,
            "dimensionsAt": "mean"
          },
          "expected": 216,
          "toleranceDecimalPlaces": 2,
          "unit": "°",
          "confidence": "high",
          "steps": [
            {
              "label": "Outer radius",
              "value": 19.68503937007874,
              "unit": "in"
            },
            {
              "label": "Inner radius",
              "value": 0,
              "unit": "in"
            },
            {
              "label": "Slant height",
              "value": 19.68503937007874,
              "unit": "in"
            },
            {
              "label": "Arc length, large end",
              "value": 74.21085008479827,
              "unit": "in"
            },
            {
              "label": "Blank width needed",
              "value": 39.37007874015748,
              "unit": "in"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "equal ends develop as a rectangle, with no included angle",
          "inputs": {
            "largeDiameter": 0.5,
            "smallDiameter": 0.5,
            "verticalHeight": 0.3,
            "materialThickness": 0,
            "dimensionsAt": "mean"
          },
          "expected": 0,
          "toleranceDecimalPlaces": 2,
          "unit": "°",
          "confidence": "low",
          "steps": [
            {
              "label": "Develops as a rectangle, length",
              "value": 61.84237507066522,
              "unit": "in"
            },
            {
              "label": "Rectangle height",
              "value": 11.811023622047244,
              "unit": "in"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "the surface the diameters came from moves the radii, not the angle",
          "inputs": {
            "largeDiameter": 0.6,
            "smallDiameter": 0.3,
            "verticalHeight": 0.4,
            "materialThickness": 0.006,
            "dimensionsAt": "inside"
          },
          "expected": 126.4044,
          "toleranceDecimalPlaces": 2,
          "unit": "°",
          "confidence": "high",
          "steps": [
            {
              "label": "Outer radius",
              "value": 33.974188121144515,
              "unit": "in"
            },
            {
              "label": "Inner radius",
              "value": 17.155283110676933,
              "unit": "in"
            },
            {
              "label": "Slant height",
              "value": 16.81890501046758,
              "unit": "in"
            },
            {
              "label": "Arc length, large end",
              "value": 74.95295858564624,
              "unit": "in"
            },
            {
              "label": "Blank width needed",
              "value": 67.94837624228903,
              "unit": "in"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "cone-frustum-volume-calculator",
      "title": "Cone Frustum Volume Calculator — Hoppers and Tapered Piers",
      "url": "https://craftquantities.com/calculators/materials-quantities/cone-frustum-volume-calculator/",
      "sources": [
        "The volume of a frustum of a right circular cone is (π h / 3)(R² + R·r + r²), exact for any two radii and vertical height. Setting r = R returns a cylinder and setting r = 0 returns a cone, which is the check that the expression is the general case rather than an approximation",
        "It is the prismoidal rule in disguise: R² + R·r + r² is (A₁ + √(A₁A₂) + A₂)/π, so the mid-section is the GEOMETRIC mean of the two ends rather than the arithmetic mean. The same expression appears in earthworks volumes between cross-sections, for the same reason",
        "The height wanted is the VERTICAL height between the two parallel faces, not the slant height along the sloping side. Slant height is longer and using it inflates every result"
      ],
      "vectors": [
        {
          "name": "a hopper tapering 2 m to 0.4 m over 1.5 m",
          "inputs": {
            "bottomDiameter": 2,
            "topDiameter": 0.4,
            "verticalHeight": 1.5
          },
          "expected": 68.79,
          "toleranceDecimalPlaces": 0,
          "unit": "ft³",
          "confidence": "high",
          "steps": [
            {
              "label": "As a liquid capacity",
              "value": 514.5510069627003,
              "unit": "gal"
            },
            {
              "label": "Mean-diameter shortcut, for comparison",
              "value": 59.90992066954827,
              "unit": "ft³"
            },
            {
              "label": "What that shortcut misses",
              "value": 8.875543802896036,
              "unit": "ft³"
            },
            {
              "label": "Shortcut error",
              "value": 12.903225806451607,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "equal diameters return a plain cylinder",
          "inputs": {
            "bottomDiameter": 2,
            "topDiameter": 2,
            "verticalHeight": 2
          },
          "expected": 221.89,
          "toleranceDecimalPlaces": 0,
          "unit": "ft³",
          "confidence": "high",
          "steps": [
            {
              "label": "As a liquid capacity",
              "value": 1659.8419579441945,
              "unit": "gal"
            },
            {
              "label": "Mean-diameter shortcut, for comparison",
              "value": 221.888595072401,
              "unit": "ft³"
            },
            {
              "label": "What that shortcut misses",
              "value": 0,
              "unit": "ft³"
            },
            {
              "label": "Shortcut error",
              "value": 0,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "a zero top diameter returns a full cone, one third of its cylinder",
          "inputs": {
            "bottomDiameter": 2,
            "topDiameter": 0,
            "verticalHeight": 3
          },
          "expected": 110.94,
          "toleranceDecimalPlaces": 0,
          "unit": "ft³",
          "confidence": "high",
          "steps": [
            {
              "label": "As a liquid capacity",
              "value": 829.9209789720973,
              "unit": "gal"
            },
            {
              "label": "Mean-diameter shortcut, for comparison",
              "value": 83.20822315215037,
              "unit": "ft³"
            },
            {
              "label": "What that shortcut misses",
              "value": 27.736074384050124,
              "unit": "ft³"
            },
            {
              "label": "Shortcut error",
              "value": 25,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "consolidation-settlement-calculator",
      "title": "Primary Consolidation Settlement Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/consolidation-settlement-calculator/",
      "sources": [
        "Terzaghi 1D primary consolidation settlement: Sc = (Cc x H / (1 + e0)) x log10((σ'0 + Δσ) / σ'0), where Cc is the compression index, H is the clay layer thickness, e0 is the initial void ratio, σ'0 is the initial effective stress, and Δσ is the added stress"
      ],
      "vectors": [
        {
          "name": "Cc=0.3, H=5m, e0=0.8, σ'0=100kPa, Δσ=50kPa",
          "inputs": {
            "compressionIndex": 0.3,
            "layerThickness": 5,
            "initialVoidRatio": 0.8,
            "initialEffectiveStress": 100000,
            "addedStress": 50000
          },
          "expected": 146.7,
          "toleranceDecimalPlaces": -1,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in meters",
              "value": 0.14674271587973436,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Cc=0.25, H=4m, e0=0.7, σ'0=80kPa, Δσ=40kPa",
          "inputs": {
            "compressionIndex": 0.25,
            "layerThickness": 4,
            "initialVoidRatio": 0.7,
            "initialEffectiveStress": 80000,
            "addedStress": 40000
          },
          "expected": 103.6,
          "toleranceDecimalPlaces": -1,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in meters",
              "value": 0.10358309356216544,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "construction-noise-at-receptor-calculator",
      "title": "Construction Plant Noise at a Neighbour Calculator (BS 5228-1 / FHWA RCNM)",
      "url": "https://craftquantities.com/calculators/sustainability-compliance/construction-noise-at-receptor-calculator/",
      "sources": [
        "BS 5228-1:2009+A1:2014, Annex F: from an activity LAeq measured at 10 m, the level at distance R over hard ground is LAeq,10m − 20 log10(R ÷ 10), with an on-time correction of 10 log10 of the fraction of the period the plant operates, and levels from several items combined on energy",
        "ISO 9613-2: geometric divergence from a point source is 20 log10(d) + 11 dB, so a source on hard ground radiating into a hemisphere gives LWA − 20 log10(R) − 8 at R metres",
        "BS 5228-1, Annex F: a barrier that just interrupts the line of sight between the plant and the receptor reduces the level by about 5 dB, and one that screens the plant completely by about 10 dB",
        "FHWA Roadway Construction Noise Model (RCNM), FHWA-HEP-05-054: Leq = Lmax at 50 ft − 20 log10(D ÷ 50) + 10 log10(usage factor ÷ 100) − shielding, with the items combined on energy"
      ],
      "vectors": [
        {
          "name": "One item at 80 dB(A) at 10 m, running all the time, reads 80 at 10 m",
          "inputs": {
            "basis": "l10",
            "plantLevel1": 80,
            "plantDistance1": 10,
            "plantOnTime1": 100,
            "plantLevel2": 78,
            "plantDistance2": 45,
            "plantOnTime2": 0,
            "plantLevel3": 84,
            "plantDistance3": 60,
            "plantOnTime3": 0,
            "screening": "none"
          },
          "expected": 80,
          "toleranceDecimalPlaces": 2,
          "unit": "dB(A)",
          "confidence": "high",
          "steps": [
            {
              "label": "Plant item 1 at the receptor",
              "value": 80,
              "unit": "dB(A)"
            },
            {
              "label": "Plant item 1's share of the total",
              "value": 100,
              "unit": "%"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The same item at 40 m — two doublings of distance, 12 dB less",
          "inputs": {
            "basis": "l10",
            "plantLevel1": 80,
            "plantDistance1": 40,
            "plantOnTime1": 100,
            "plantLevel2": 78,
            "plantDistance2": 45,
            "plantOnTime2": 0,
            "plantLevel3": 84,
            "plantDistance3": 60,
            "plantOnTime3": 0,
            "screening": "none"
          },
          "expected": 67.9588,
          "toleranceDecimalPlaces": 2,
          "unit": "dB(A)",
          "confidence": "high",
          "steps": [
            {
              "label": "Plant item 1 at the receptor",
              "value": 67.95880017344075,
              "unit": "dB(A)"
            },
            {
              "label": "Plant item 1's share of the total",
              "value": 100,
              "unit": "%"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A sound power level of 105 dB(A) at 20 m over hard ground gives 71.0",
          "inputs": {
            "basis": "lw",
            "plantLevel1": 105,
            "plantDistance1": 20,
            "plantOnTime1": 100,
            "plantLevel2": 78,
            "plantDistance2": 45,
            "plantOnTime2": 0,
            "plantLevel3": 84,
            "plantDistance3": 60,
            "plantOnTime3": 0,
            "screening": "none"
          },
          "expected": 70.9794,
          "toleranceDecimalPlaces": 2,
          "unit": "dB(A)",
          "confidence": "high",
          "steps": [
            {
              "label": "Plant item 1 at the receptor",
              "value": 70.97940008672037,
              "unit": "dB(A)"
            },
            {
              "label": "Plant item 1's share of the total",
              "value": 100,
              "unit": "%"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Two identical items at 70 dB(A) make 73.0, not 140",
          "inputs": {
            "basis": "l10",
            "plantLevel1": 70,
            "plantDistance1": 10,
            "plantOnTime1": 100,
            "plantLevel2": 70,
            "plantDistance2": 10,
            "plantOnTime2": 100,
            "plantLevel3": 84,
            "plantDistance3": 60,
            "plantOnTime3": 0,
            "screening": "none"
          },
          "expected": 73.0103,
          "toleranceDecimalPlaces": 2,
          "unit": "dB(A)",
          "confidence": "high",
          "steps": [
            {
              "label": "Plant item 1 at the receptor",
              "value": 70,
              "unit": "dB(A)"
            },
            {
              "label": "Plant item 2 at the receptor",
              "value": 70,
              "unit": "dB(A)"
            },
            {
              "label": "Plant item 1's share of the total",
              "value": 49.99999999999999,
              "unit": "%"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "RCNM: 85 dBA Lmax at 50 ft, heard at 100 ft with a 40% usage factor, is an Leq of 75",
          "inputs": {
            "basis": "l50",
            "plantLevel1": 85,
            "plantDistance1": 30.48,
            "plantOnTime1": 40,
            "plantLevel2": 78,
            "plantDistance2": 45,
            "plantOnTime2": 0,
            "plantLevel3": 84,
            "plantDistance3": 60,
            "plantOnTime3": 0,
            "screening": "none"
          },
          "expected": 75,
          "toleranceDecimalPlaces": 2,
          "unit": "dB(A)",
          "confidence": "high",
          "steps": [
            {
              "label": "Plant item 1 at the receptor",
              "value": 75,
              "unit": "dB(A)"
            },
            {
              "label": "Plant item 1's share of the total",
              "value": 100,
              "unit": "%"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "The defaults behind a hoarding that just breaks the line of sight — every item 5 dB lower",
          "inputs": {
            "basis": "l10",
            "plantLevel1": 80,
            "plantDistance1": 30,
            "plantOnTime1": 75,
            "plantLevel2": 78,
            "plantDistance2": 45,
            "plantOnTime2": 50,
            "plantLevel3": 84,
            "plantDistance3": 60,
            "plantOnTime3": 25,
            "screening": "partial"
          },
          "expected": 65.657895,
          "toleranceDecimalPlaces": 2,
          "unit": "dB(A)",
          "confidence": "high",
          "steps": [
            {
              "label": "Plant item 1 at the receptor",
              "value": 64.20818753952375,
              "unit": "dB(A)"
            },
            {
              "label": "Plant item 2 at the receptor",
              "value": 56.92544976785331,
              "unit": "dB(A)"
            },
            {
              "label": "Plant item 3 at the receptor",
              "value": 57.4163750790475,
              "unit": "dB(A)"
            },
            {
              "label": "Plant item 1's share of the total",
              "value": 71.6191708330554,
              "unit": "%"
            },
            {
              "label": "Screening correction applied to every item",
              "value": -5,
              "unit": "dB"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "A barrier that hides the plant completely takes 10 dB off: 80 at 10 m becomes 70",
          "inputs": {
            "basis": "l10",
            "plantLevel1": 80,
            "plantDistance1": 10,
            "plantOnTime1": 100,
            "plantLevel2": 78,
            "plantDistance2": 45,
            "plantOnTime2": 0,
            "plantLevel3": 84,
            "plantDistance3": 60,
            "plantOnTime3": 0,
            "screening": "full"
          },
          "expected": 70,
          "toleranceDecimalPlaces": 2,
          "unit": "dB(A)",
          "confidence": "high",
          "steps": [
            {
              "label": "Plant item 1 at the receptor",
              "value": 70,
              "unit": "dB(A)"
            },
            {
              "label": "Plant item 1's share of the total",
              "value": 100,
              "unit": "%"
            },
            {
              "label": "Screening correction applied to every item",
              "value": -10,
              "unit": "dB"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "container-fill-efficiency-calculator",
      "title": "Debris Container Fill Efficiency Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/container-fill-efficiency-calculator/",
      "sources": [
        "Achievable volume = the lesser of (rated cube × fill efficiency) and (payload ceiling ÷ loose density). Both branches are arithmetic on figures you supply; no container or debris data is assumed here.",
        "Bridging indicator = nominal lump size ÷ container depth, reported as a ratio. The bulk-solids RULE OF THUMB that lumps above roughly a third of the opening dimension start to bridge is quoted as a rule of thumb and nothing more."
      ],
      "vectors": [
        {
          "name": "23 m³ box, 75% efficiency, cube binds",
          "inputs": {
            "ratedCube": 23000,
            "fillEfficiency": 75,
            "looseDensity": 450,
            "weightCeiling": 9000,
            "nominalLumpSize": 0.3,
            "containerDepth": 1.4
          },
          "expected": 17.25,
          "toleranceDecimalPlaces": 3,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume the fill efficiency allows",
              "value": 17.25,
              "unit": "m³"
            },
            {
              "label": "Volume the payload ceiling allows",
              "value": 20,
              "unit": "m³"
            },
            {
              "label": "Load mass at the achievable volume",
              "value": 7.7625,
              "unit": "tonnes"
            },
            {
              "label": "Rated capacity left unused",
              "value": 5.75,
              "unit": "m³"
            },
            {
              "label": "Lump size as a fraction of container depth",
              "value": 0.2142857142857143,
              "unit": "ratio"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Dense concrete rubble — payload ceiling binds first",
          "inputs": {
            "ratedCube": 23000,
            "fillEfficiency": 90,
            "looseDensity": 1500,
            "weightCeiling": 9000,
            "nominalLumpSize": 0.3,
            "containerDepth": 1.4
          },
          "expected": 6,
          "toleranceDecimalPlaces": 3,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume the fill efficiency allows",
              "value": 20.7,
              "unit": "m³"
            },
            {
              "label": "Volume the payload ceiling allows",
              "value": 6,
              "unit": "m³"
            },
            {
              "label": "Load mass at the achievable volume",
              "value": 9,
              "unit": "tonnes"
            },
            {
              "label": "Rated capacity left unused",
              "value": 17,
              "unit": "m³"
            },
            {
              "label": "Lump size as a fraction of container depth",
              "value": 0.2142857142857143,
              "unit": "ratio"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "15 m³ box of light mixed waste at 60%",
          "inputs": {
            "ratedCube": 15000,
            "fillEfficiency": 60,
            "looseDensity": 300,
            "weightCeiling": 9000,
            "nominalLumpSize": 0.3,
            "containerDepth": 1.4
          },
          "expected": 9,
          "toleranceDecimalPlaces": 3,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume the fill efficiency allows",
              "value": 9,
              "unit": "m³"
            },
            {
              "label": "Volume the payload ceiling allows",
              "value": 30,
              "unit": "m³"
            },
            {
              "label": "Load mass at the achievable volume",
              "value": 2.7,
              "unit": "tonnes"
            },
            {
              "label": "Rated capacity left unused",
              "value": 6,
              "unit": "m³"
            },
            {
              "label": "Lump size as a fraction of container depth",
              "value": 0.2142857142857143,
              "unit": "ratio"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "continuous-footing-grade-beam-calculator",
      "title": "Continuous Footing / Grade Beam Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/continuous-footing-grade-beam-calculator/",
      "sources": [
        "Concrete volume = length x width x depth, the standard geometric formula for a continuous rectangular-section footing or grade beam"
      ],
      "vectors": [
        {
          "name": "20m x 0.6m x 0.4m, 5% waste",
          "inputs": {
            "footingLength": 20,
            "footingWidth": 0.6,
            "footingDepth": 0.4,
            "wasteFactorPercent": 5
          },
          "expected": 5.04,
          "toleranceDecimalPlaces": 2,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Base volume (no waste)",
              "value": 4.800000000000001,
              "unit": "m³"
            },
            {
              "label": "Equivalent in cubic yards",
              "value": 6.592071969090419,
              "unit": "yd³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "35m x 0.5m x 0.3m, 10% waste",
          "inputs": {
            "footingLength": 35,
            "footingWidth": 0.5,
            "footingDepth": 0.3,
            "wasteFactorPercent": 10
          },
          "expected": 5.775,
          "toleranceDecimalPlaces": 3,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Base volume (no waste)",
              "value": 5.25,
              "unit": "m³"
            },
            {
              "label": "Equivalent in cubic yards",
              "value": 7.553415797916104,
              "unit": "yd³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "contractor-markup-calculator",
      "title": "Contractor Markup Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/contractor-markup-calculator/",
      "sources": [
        "Total price = (material cost + labor cost) x (1 + markup percent / 100)"
      ],
      "vectors": [
        {
          "name": "$5000 material, $3000 labor, 20% markup",
          "inputs": {
            "materialCost": 5000,
            "laborCost": 3000,
            "markupPercent": 20
          },
          "expected": 9600,
          "toleranceDecimalPlaces": 0,
          "unit": "$ (total price to charge)",
          "confidence": "high",
          "steps": [
            {
              "label": "Cost subtotal",
              "value": 8000,
              "unit": "$"
            },
            {
              "label": "Markup amount",
              "value": 1600,
              "unit": "$"
            },
            {
              "label": "Gross margin on the price",
              "value": 16.666666666666664,
              "unit": "%"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "$2000 material, $1000 labor, 15% markup",
          "inputs": {
            "materialCost": 2000,
            "laborCost": 1000,
            "markupPercent": 15
          },
          "expected": 3450,
          "toleranceDecimalPlaces": 0,
          "unit": "$ (total price to charge)",
          "confidence": "high",
          "steps": [
            {
              "label": "Cost subtotal",
              "value": 3000,
              "unit": "$"
            },
            {
              "label": "Markup amount",
              "value": 450,
              "unit": "$"
            },
            {
              "label": "Gross margin on the price",
              "value": 13.043478260869565,
              "unit": "%"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "coping-cap-calculator",
      "title": "Parapet Coping Cap Linear Footage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/coping-cap-calculator/",
      "sources": [
        "Total coping cap = parapet length × (1 + waste allowance), the standard method for estimating continuous metal or masonry coping cap material"
      ],
      "vectors": [
        {
          "name": "60m parapet, 5% waste",
          "inputs": {
            "parapetLength": 60,
            "wastePercent": 5
          },
          "expected": 63,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "85m parapet, 8% waste",
          "inputs": {
            "parapetLength": 85,
            "wastePercent": 8
          },
          "expected": 91.8,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "copper-aluminum-wire-equivalent-calculator",
      "title": "Copper to Aluminum Wire Size Calculator (Aluminium Equivalent, AWG and mm²)",
      "url": "https://craftquantities.com/calculators/electrical/copper-aluminum-wire-equivalent-calculator/",
      "sources": [
        "IAEI Magazine, \"Voltage Drop Formulas\" (March/April 2017): K constants at 75 °C (167 °F) read off NEC Chapter 9 Table 8 — 12.9 for uncoated copper (1,000 kcmil at 0.0129 Ω per 1,000 ft, 0.0423 Ω/km) and 21.2 for aluminum (0.0212 Ω per 1,000 ft, 0.0696 Ω/km) — with every size in the table close to them",
        "Bayerische Kabelwerke AG (Bayka), Conductor resistance at 20 °C (68 °F) acc. to EN 60228: plain copper and aluminium, class 1 and 2 — 16 mm² copper 1.15 Ω/km (0.351 Ω per 1,000 ft) against 25 mm² aluminium 1.20 (0.366) and 35 mm² aluminium 0.868 (0.265)",
        "NBS Handbook 109, Aluminum Wire Tables: EC-H19 aluminum at 61.0% IACS, 17.002 Ω·cmil/ft (0.028264 Ω·mm²/m) at 20 °C (68 °F), against the International Annealed Copper Standard's 10.371 (0.017241) — a ratio of 1.639",
        "Minnesota Department of Labor and Industry, Electrical Inspection Checklist for One-Family Dwellings based on the 2023 NEC (revised 2023-05-06): dwelling service conductors under NEC 310.12 — 4 AWG copper or 2 AWG aluminum at 100 A, 1 AWG or 2/0 at 150 A, 2/0 or 4/0 at 200 A, 400 or 600 kcmil at 400 A; and dissimilar metals not intermixed unless the device is listed for it (NEC 110.14)"
      ],
      "vectors": [
        {
          "name": "the opening: 2/0 copper needs 250 kcmil aluminum for equal resistance",
          "inputs": {
            "copperSize": "2/0"
          },
          "expected": 250,
          "toleranceDecimalPlaces": 6,
          "unit": "kcmil",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor area (kcmil)",
              "value": 133.1
            },
            {
              "label": "Aluminum area for equal resistance (kcmil)",
              "value": 218.737984496124
            },
            {
              "label": "The same area in mm²",
              "value": 110.83617270689852,
              "unit": "mm²"
            },
            {
              "label": "This aluminum size's resistance against the copper's (%)",
              "value": 87.4951937984496
            },
            {
              "label": "The size below it, 4/0 AWG: area (kcmil)",
              "value": 211.6
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 103.37333860875427
            },
            {
              "label": "Aluminum's resistance per circular mil against copper's, 21.2 ÷ 12.9",
              "value": 1.643410852713178
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "12 AWG copper needs 8 AWG aluminum: 10 AWG is 3% over",
          "inputs": {
            "copperSize": "12"
          },
          "expected": 16.51,
          "toleranceDecimalPlaces": 6,
          "unit": "kcmil (8 AWG)",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor area (kcmil)",
              "value": 6.53
            },
            {
              "label": "Aluminum area for equal resistance (kcmil)",
              "value": 10.731472868217054
            },
            {
              "label": "The same area in mm²",
              "value": 5.437717564057456,
              "unit": "mm²"
            },
            {
              "label": "This aluminum size's resistance against the copper's (%)",
              "value": 64.99983566454908
            },
            {
              "label": "The size below it, 10 AWG: area (kcmil)",
              "value": 10.38
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 103.38605846066527
            },
            {
              "label": "Aluminum's resistance per circular mil against copper's, 21.2 ÷ 12.9",
              "value": 1.643410852713178
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "6 AWG copper needs 3 AWG aluminum",
          "inputs": {
            "copperSize": "6"
          },
          "expected": 52.62,
          "toleranceDecimalPlaces": 6,
          "unit": "kcmil (3 AWG)",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor area (kcmil)",
              "value": 26.24
            },
            {
              "label": "Aluminum area for equal resistance (kcmil)",
              "value": 43.12310077519379
            },
            {
              "label": "The same area in mm²",
              "value": 21.850797684665796,
              "unit": "mm²"
            },
            {
              "label": "This aluminum size's resistance against the copper's (%)",
              "value": 81.95192089546521
            },
            {
              "label": "The size below it, 4 AWG: area (kcmil)",
              "value": 41.74
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 103.31360990702873
            },
            {
              "label": "Aluminum's resistance per circular mil against copper's, 21.2 ÷ 12.9",
              "value": 1.643410852713178
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "400 kcmil copper needs 750 kcmil aluminum on resistance",
          "inputs": {
            "copperSize": "400"
          },
          "expected": 750,
          "toleranceDecimalPlaces": 6,
          "unit": "kcmil",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor area (kcmil)",
              "value": 400
            },
            {
              "label": "Aluminum area for equal resistance (kcmil)",
              "value": 657.3643410852712
            },
            {
              "label": "The same area in mm²",
              "value": 333.0914281199054,
              "unit": "mm²"
            },
            {
              "label": "This aluminum size's resistance against the copper's (%)",
              "value": 87.64857881136949
            },
            {
              "label": "The size below it, 600 kcmil: area (kcmil)",
              "value": 600
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 109.56072351421187
            },
            {
              "label": "Aluminum's resistance per circular mil against copper's, 21.2 ÷ 12.9",
              "value": 1.643410852713178
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1,000 kcmil copper has no single aluminum equal in the list",
          "inputs": {
            "copperSize": "1000"
          },
          "expected": 0,
          "toleranceDecimalPlaces": 6,
          "unit": "kcmil",
          "confidence": "low",
          "steps": [
            {
              "label": "Copper conductor area (kcmil)",
              "value": 1000
            },
            {
              "label": "Aluminum area for equal resistance (kcmil)",
              "value": 1643.4108527131782
            },
            {
              "label": "The same area in mm²",
              "value": 832.7285702997635,
              "unit": "mm²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a UK reader's opening: 16 mm² copper needs 35 mm² aluminium",
          "inputs": {
            "copperSize": "16mm2"
          },
          "expected": 35,
          "toleranceDecimalPlaces": 6,
          "unit": "mm²",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor resistance at 20 °C (68 °F), Ω/km",
              "value": 1.15
            },
            {
              "label": "This aluminium size's resistance at 20 °C (68 °F), Ω/km",
              "value": 0.868
            },
            {
              "label": "This aluminium size's resistance against the copper's (%)",
              "value": 75.47826086956523
            },
            {
              "label": "The size below it (mm²)",
              "value": 25,
              "unit": "mm²"
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 104.34782608695652
            },
            {
              "label": "Aluminium area against copper area",
              "value": 2.1875
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "6 mm² copper and 10 mm² aluminium are equal at 3.08 Ω/km (0.939 Ω per 1,000 ft)",
          "inputs": {
            "copperSize": "6mm2"
          },
          "expected": 10,
          "toleranceDecimalPlaces": 6,
          "unit": "mm²",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor resistance at 20 °C (68 °F), Ω/km",
              "value": 3.08
            },
            {
              "label": "This aluminium size's resistance at 20 °C (68 °F), Ω/km",
              "value": 3.08
            },
            {
              "label": "This aluminium size's resistance against the copper's (%)",
              "value": 100
            },
            {
              "label": "Aluminium area against copper area",
              "value": 1.6666666666666667
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "150 mm² copper needs 300 mm² aluminium: 240 mm² is 0.8% over",
          "inputs": {
            "copperSize": "150mm2"
          },
          "expected": 300,
          "toleranceDecimalPlaces": 6,
          "unit": "mm²",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor resistance at 20 °C (68 °F), Ω/km",
              "value": 0.124
            },
            {
              "label": "This aluminium size's resistance at 20 °C (68 °F), Ω/km",
              "value": 0.1
            },
            {
              "label": "This aluminium size's resistance against the copper's (%)",
              "value": 80.64516129032259
            },
            {
              "label": "The size below it (mm²)",
              "value": 240,
              "unit": "mm²"
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 100.80645161290323
            },
            {
              "label": "Aluminium area against copper area",
              "value": 2
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "14 copper: 10.38 kcmil of aluminum",
          "inputs": {
            "copperSize": "14"
          },
          "expected": 10.38,
          "toleranceDecimalPlaces": 6,
          "unit": "kcmil (10 AWG)",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor area (kcmil)",
              "value": 4.11
            },
            {
              "label": "Aluminum area for equal resistance (kcmil)",
              "value": 6.754418604651162
            },
            {
              "label": "The same area in mm²",
              "value": 3.422514423932028,
              "unit": "mm²"
            },
            {
              "label": "This aluminum size's resistance against the copper's (%)",
              "value": 65.07147017968364
            },
            {
              "label": "The size below it, 12 AWG: area (kcmil)",
              "value": 6.53
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 103.43673207735318
            },
            {
              "label": "Aluminum's resistance per circular mil against copper's, 21.2 ÷ 12.9",
              "value": 1.643410852713178
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "10 copper: 26.24 kcmil of aluminum",
          "inputs": {
            "copperSize": "10"
          },
          "expected": 26.24,
          "toleranceDecimalPlaces": 6,
          "unit": "kcmil (6 AWG)",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor area (kcmil)",
              "value": 10.38
            },
            {
              "label": "Aluminum area for equal resistance (kcmil)",
              "value": 17.05860465116279
            },
            {
              "label": "The same area in mm²",
              "value": 8.643722559711547,
              "unit": "mm²"
            },
            {
              "label": "This aluminum size's resistance against the copper's (%)",
              "value": 65.00992626205331
            },
            {
              "label": "The size below it, 8 AWG: area (kcmil)",
              "value": 16.51
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 103.32286281746089
            },
            {
              "label": "Aluminum's resistance per circular mil against copper's, 21.2 ÷ 12.9",
              "value": 1.643410852713178
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "8 copper: 41.74 kcmil of aluminum",
          "inputs": {
            "copperSize": "8"
          },
          "expected": 41.74,
          "toleranceDecimalPlaces": 6,
          "unit": "kcmil (4 AWG)",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor area (kcmil)",
              "value": 16.51
            },
            {
              "label": "Aluminum area for equal resistance (kcmil)",
              "value": 27.13271317829457
            },
            {
              "label": "The same area in mm²",
              "value": 13.748348695649096,
              "unit": "mm²"
            },
            {
              "label": "This aluminum size's resistance against the copper's (%)",
              "value": 65.00410440415565
            },
            {
              "label": "The size below it, 6 AWG: area (kcmil)",
              "value": 26.24
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 103.40210814898845
            },
            {
              "label": "Aluminum's resistance per circular mil against copper's, 21.2 ÷ 12.9",
              "value": 1.643410852713178
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "4 copper: 83.69 kcmil of aluminum",
          "inputs": {
            "copperSize": "4"
          },
          "expected": 83.69,
          "toleranceDecimalPlaces": 6,
          "unit": "kcmil (1 AWG)",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor area (kcmil)",
              "value": 41.74
            },
            {
              "label": "Aluminum area for equal resistance (kcmil)",
              "value": 68.59596899224806
            },
            {
              "label": "The same area in mm²",
              "value": 34.75809052431213,
              "unit": "mm²"
            },
            {
              "label": "This aluminum size's resistance against the copper's (%)",
              "value": 81.96435534980053
            },
            {
              "label": "The size below it, 2 AWG: area (kcmil)",
              "value": 66.36
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 103.36945297204349
            },
            {
              "label": "Aluminum's resistance per circular mil against copper's, 21.2 ÷ 12.9",
              "value": 1.643410852713178
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "3 copper: 105.6 kcmil of aluminum",
          "inputs": {
            "copperSize": "3"
          },
          "expected": 105.6,
          "toleranceDecimalPlaces": 6,
          "unit": "kcmil (1/0 AWG)",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor area (kcmil)",
              "value": 52.62
            },
            {
              "label": "Aluminum area for equal resistance (kcmil)",
              "value": 86.47627906976743
            },
            {
              "label": "The same area in mm²",
              "value": 43.81817736917356,
              "unit": "mm²"
            },
            {
              "label": "This aluminum size's resistance against the copper's (%)",
              "value": 81.89041578576462
            },
            {
              "label": "The size below it, 1 AWG: area (kcmil)",
              "value": 83.69
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 103.32928554160286
            },
            {
              "label": "Aluminum's resistance per circular mil against copper's, 21.2 ÷ 12.9",
              "value": 1.643410852713178
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "2 copper: 133.1 kcmil of aluminum",
          "inputs": {
            "copperSize": "2"
          },
          "expected": 133.1,
          "toleranceDecimalPlaces": 6,
          "unit": "kcmil (2/0 AWG)",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor area (kcmil)",
              "value": 66.36
            },
            {
              "label": "Aluminum area for equal resistance (kcmil)",
              "value": 109.0567441860465
            },
            {
              "label": "The same area in mm²",
              "value": 55.25986792509231,
              "unit": "mm²"
            },
            {
              "label": "This aluminum size's resistance against the copper's (%)",
              "value": 81.93594604511382
            },
            {
              "label": "The size below it, 1/0 AWG: area (kcmil)",
              "value": 105.6
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 103.27343199436223
            },
            {
              "label": "Aluminum's resistance per circular mil against copper's, 21.2 ÷ 12.9",
              "value": 1.643410852713178
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1 copper: 167.8 kcmil of aluminum",
          "inputs": {
            "copperSize": "1"
          },
          "expected": 167.8,
          "toleranceDecimalPlaces": 6,
          "unit": "kcmil (3/0 AWG)",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor area (kcmil)",
              "value": 83.69
            },
            {
              "label": "Aluminum area for equal resistance (kcmil)",
              "value": 137.53705426356586
            },
            {
              "label": "The same area in mm²",
              "value": 69.6910540483872,
              "unit": "mm²"
            },
            {
              "label": "This aluminum size's resistance against the copper's (%)",
              "value": 81.9648714323992
            },
            {
              "label": "The size below it, 2/0 AWG: area (kcmil)",
              "value": 133.1
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 103.33362454062049
            },
            {
              "label": "Aluminum's resistance per circular mil against copper's, 21.2 ÷ 12.9",
              "value": 1.643410852713178
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1/0 copper: 211.6 kcmil of aluminum",
          "inputs": {
            "copperSize": "1/0"
          },
          "expected": 211.6,
          "toleranceDecimalPlaces": 6,
          "unit": "kcmil (4/0 AWG)",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor area (kcmil)",
              "value": 105.6
            },
            {
              "label": "Aluminum area for equal resistance (kcmil)",
              "value": 173.5441860465116
            },
            {
              "label": "The same area in mm²",
              "value": 87.93613702365504,
              "unit": "mm²"
            },
            {
              "label": "This aluminum size's resistance against the copper's (%)",
              "value": 82.01521079702817
            },
            {
              "label": "The size below it, 3/0 AWG: area (kcmil)",
              "value": 167.8
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 103.42323363916066
            },
            {
              "label": "Aluminum's resistance per circular mil against copper's, 21.2 ÷ 12.9",
              "value": 1.643410852713178
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "3/0 copper: 300 kcmil of aluminum",
          "inputs": {
            "copperSize": "3/0"
          },
          "expected": 300,
          "toleranceDecimalPlaces": 6,
          "unit": "kcmil",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor area (kcmil)",
              "value": 167.8
            },
            {
              "label": "Aluminum area for equal resistance (kcmil)",
              "value": 275.76434108527127
            },
            {
              "label": "The same area in mm²",
              "value": 139.7318540963003,
              "unit": "mm²"
            },
            {
              "label": "This aluminum size's resistance against the copper's (%)",
              "value": 91.92144702842376
            },
            {
              "label": "The size below it, 250 kcmil: area (kcmil)",
              "value": 250
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 110.3057364341085
            },
            {
              "label": "Aluminum's resistance per circular mil against copper's, 21.2 ÷ 12.9",
              "value": 1.643410852713178
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "4/0 copper: 350 kcmil of aluminum",
          "inputs": {
            "copperSize": "4/0"
          },
          "expected": 350,
          "toleranceDecimalPlaces": 6,
          "unit": "kcmil",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor area (kcmil)",
              "value": 211.6
            },
            {
              "label": "Aluminum area for equal resistance (kcmil)",
              "value": 347.74573643410844
            },
            {
              "label": "The same area in mm²",
              "value": 176.20536547542994,
              "unit": "mm²"
            },
            {
              "label": "This aluminum size's resistance against the copper's (%)",
              "value": 99.35592469545956
            },
            {
              "label": "The size below it, 300 kcmil: area (kcmil)",
              "value": 300
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 115.91524547803616
            },
            {
              "label": "Aluminum's resistance per circular mil against copper's, 21.2 ÷ 12.9",
              "value": 1.643410852713178
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "250 copper: 500 kcmil of aluminum",
          "inputs": {
            "copperSize": "250"
          },
          "expected": 500,
          "toleranceDecimalPlaces": 6,
          "unit": "kcmil",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor area (kcmil)",
              "value": 250
            },
            {
              "label": "Aluminum area for equal resistance (kcmil)",
              "value": 410.85271317829455
            },
            {
              "label": "The same area in mm²",
              "value": 208.18214257494088,
              "unit": "mm²"
            },
            {
              "label": "This aluminum size's resistance against the copper's (%)",
              "value": 82.1705426356589
            },
            {
              "label": "The size below it, 400 kcmil: area (kcmil)",
              "value": 400
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 102.71317829457362
            },
            {
              "label": "Aluminum's resistance per circular mil against copper's, 21.2 ÷ 12.9",
              "value": 1.643410852713178
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "300 copper: 500 kcmil of aluminum",
          "inputs": {
            "copperSize": "300"
          },
          "expected": 500,
          "toleranceDecimalPlaces": 6,
          "unit": "kcmil",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor area (kcmil)",
              "value": 300
            },
            {
              "label": "Aluminum area for equal resistance (kcmil)",
              "value": 493.0232558139534
            },
            {
              "label": "The same area in mm²",
              "value": 249.81857108992907,
              "unit": "mm²"
            },
            {
              "label": "This aluminum size's resistance against the copper's (%)",
              "value": 98.60465116279067
            },
            {
              "label": "The size below it, 400 kcmil: area (kcmil)",
              "value": 400
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 123.25581395348834
            },
            {
              "label": "Aluminum's resistance per circular mil against copper's, 21.2 ÷ 12.9",
              "value": 1.643410852713178
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "350 copper: 600 kcmil of aluminum",
          "inputs": {
            "copperSize": "350"
          },
          "expected": 600,
          "toleranceDecimalPlaces": 6,
          "unit": "kcmil",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor area (kcmil)",
              "value": 350
            },
            {
              "label": "Aluminum area for equal resistance (kcmil)",
              "value": 575.1937984496124
            },
            {
              "label": "The same area in mm²",
              "value": 291.45499960491725,
              "unit": "mm²"
            },
            {
              "label": "This aluminum size's resistance against the copper's (%)",
              "value": 95.86563307493539
            },
            {
              "label": "The size below it, 500 kcmil: area (kcmil)",
              "value": 500
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 115.03875968992247
            },
            {
              "label": "Aluminum's resistance per circular mil against copper's, 21.2 ÷ 12.9",
              "value": 1.643410852713178
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "500 copper: 1000 kcmil of aluminum",
          "inputs": {
            "copperSize": "500"
          },
          "expected": 1000,
          "toleranceDecimalPlaces": 6,
          "unit": "kcmil",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor area (kcmil)",
              "value": 500
            },
            {
              "label": "Aluminum area for equal resistance (kcmil)",
              "value": 821.7054263565891
            },
            {
              "label": "The same area in mm²",
              "value": 416.36428514988177,
              "unit": "mm²"
            },
            {
              "label": "This aluminum size's resistance against the copper's (%)",
              "value": 82.1705426356589
            },
            {
              "label": "The size below it, 750 kcmil: area (kcmil)",
              "value": 750
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 109.56072351421187
            },
            {
              "label": "Aluminum's resistance per circular mil against copper's, 21.2 ÷ 12.9",
              "value": 1.643410852713178
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "600 copper: 1000 kcmil of aluminum",
          "inputs": {
            "copperSize": "600"
          },
          "expected": 1000,
          "toleranceDecimalPlaces": 6,
          "unit": "kcmil",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor area (kcmil)",
              "value": 600
            },
            {
              "label": "Aluminum area for equal resistance (kcmil)",
              "value": 986.0465116279069
            },
            {
              "label": "The same area in mm²",
              "value": 499.63714217985813,
              "unit": "mm²"
            },
            {
              "label": "This aluminum size's resistance against the copper's (%)",
              "value": 98.60465116279067
            },
            {
              "label": "The size below it, 750 kcmil: area (kcmil)",
              "value": 750
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 131.47286821705424
            },
            {
              "label": "Aluminum's resistance per circular mil against copper's, 21.2 ÷ 12.9",
              "value": 1.643410852713178
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "750 copper: no single aluminum equal",
          "inputs": {
            "copperSize": "750"
          },
          "expected": 0,
          "toleranceDecimalPlaces": 6,
          "unit": "kcmil",
          "confidence": "low",
          "steps": [
            {
              "label": "Copper conductor area (kcmil)",
              "value": 750
            },
            {
              "label": "Aluminum area for equal resistance (kcmil)",
              "value": 1232.5581395348836
            },
            {
              "label": "The same area in mm²",
              "value": 624.5464277248227,
              "unit": "mm²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1.5 mm² copper: 10 mm² of aluminium",
          "inputs": {
            "copperSize": "1.5mm2"
          },
          "expected": 10,
          "toleranceDecimalPlaces": 6,
          "unit": "mm²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Copper conductor resistance at 20 °C (68 °F), Ω/km",
              "value": 12.1
            },
            {
              "label": "This aluminium size's resistance at 20 °C (68 °F), Ω/km",
              "value": 3.08
            },
            {
              "label": "This aluminium size's resistance against the copper's (%)",
              "value": 25.454545454545457
            },
            {
              "label": "Aluminium area against copper area",
              "value": 6.666666666666667
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "2.5 mm² copper: 10 mm² of aluminium",
          "inputs": {
            "copperSize": "2.5mm2"
          },
          "expected": 10,
          "toleranceDecimalPlaces": 6,
          "unit": "mm²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Copper conductor resistance at 20 °C (68 °F), Ω/km",
              "value": 7.41
            },
            {
              "label": "This aluminium size's resistance at 20 °C (68 °F), Ω/km",
              "value": 3.08
            },
            {
              "label": "This aluminium size's resistance against the copper's (%)",
              "value": 41.56545209176788
            },
            {
              "label": "Aluminium area against copper area",
              "value": 4
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "4 mm² copper: 10 mm² of aluminium",
          "inputs": {
            "copperSize": "4mm2"
          },
          "expected": 10,
          "toleranceDecimalPlaces": 6,
          "unit": "mm²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Copper conductor resistance at 20 °C (68 °F), Ω/km",
              "value": 4.61
            },
            {
              "label": "This aluminium size's resistance at 20 °C (68 °F), Ω/km",
              "value": 3.08
            },
            {
              "label": "This aluminium size's resistance against the copper's (%)",
              "value": 66.81127982646422
            },
            {
              "label": "Aluminium area against copper area",
              "value": 2.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "10 mm² copper: 25 mm² of aluminium",
          "inputs": {
            "copperSize": "10mm2"
          },
          "expected": 25,
          "toleranceDecimalPlaces": 6,
          "unit": "mm²",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor resistance at 20 °C (68 °F), Ω/km",
              "value": 1.83
            },
            {
              "label": "This aluminium size's resistance at 20 °C (68 °F), Ω/km",
              "value": 1.2
            },
            {
              "label": "This aluminium size's resistance against the copper's (%)",
              "value": 65.57377049180327
            },
            {
              "label": "The size below it (mm²)",
              "value": 16,
              "unit": "mm²"
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 104.37158469945354
            },
            {
              "label": "Aluminium area against copper area",
              "value": 2.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "25 mm² copper: 50 mm² of aluminium",
          "inputs": {
            "copperSize": "25mm2"
          },
          "expected": 50,
          "toleranceDecimalPlaces": 6,
          "unit": "mm²",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor resistance at 20 °C (68 °F), Ω/km",
              "value": 0.727
            },
            {
              "label": "This aluminium size's resistance at 20 °C (68 °F), Ω/km",
              "value": 0.641
            },
            {
              "label": "This aluminium size's resistance against the copper's (%)",
              "value": 88.17056396148556
            },
            {
              "label": "The size below it (mm²)",
              "value": 35,
              "unit": "mm²"
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 119.39477303988997
            },
            {
              "label": "Aluminium area against copper area",
              "value": 2
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "35 mm² copper: 70 mm² of aluminium",
          "inputs": {
            "copperSize": "35mm2"
          },
          "expected": 70,
          "toleranceDecimalPlaces": 6,
          "unit": "mm²",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor resistance at 20 °C (68 °F), Ω/km",
              "value": 0.524
            },
            {
              "label": "This aluminium size's resistance at 20 °C (68 °F), Ω/km",
              "value": 0.443
            },
            {
              "label": "This aluminium size's resistance against the copper's (%)",
              "value": 84.54198473282443
            },
            {
              "label": "The size below it (mm²)",
              "value": 50,
              "unit": "mm²"
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 122.32824427480915
            },
            {
              "label": "Aluminium area against copper area",
              "value": 2
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "50 mm² copper: 95 mm² of aluminium",
          "inputs": {
            "copperSize": "50mm2"
          },
          "expected": 95,
          "toleranceDecimalPlaces": 6,
          "unit": "mm²",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor resistance at 20 °C (68 °F), Ω/km",
              "value": 0.387
            },
            {
              "label": "This aluminium size's resistance at 20 °C (68 °F), Ω/km",
              "value": 0.32
            },
            {
              "label": "This aluminium size's resistance against the copper's (%)",
              "value": 82.68733850129199
            },
            {
              "label": "The size below it (mm²)",
              "value": 70,
              "unit": "mm²"
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 114.47028423772609
            },
            {
              "label": "Aluminium area against copper area",
              "value": 1.9
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "70 mm² copper: 120 mm² of aluminium",
          "inputs": {
            "copperSize": "70mm2"
          },
          "expected": 120,
          "toleranceDecimalPlaces": 6,
          "unit": "mm²",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor resistance at 20 °C (68 °F), Ω/km",
              "value": 0.268
            },
            {
              "label": "This aluminium size's resistance at 20 °C (68 °F), Ω/km",
              "value": 0.253
            },
            {
              "label": "This aluminium size's resistance against the copper's (%)",
              "value": 94.40298507462687
            },
            {
              "label": "The size below it (mm²)",
              "value": 95,
              "unit": "mm²"
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 119.40298507462686
            },
            {
              "label": "Aluminium area against copper area",
              "value": 1.7142857142857142
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "95 mm² copper: 185 mm² of aluminium",
          "inputs": {
            "copperSize": "95mm2"
          },
          "expected": 185,
          "toleranceDecimalPlaces": 6,
          "unit": "mm²",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor resistance at 20 °C (68 °F), Ω/km",
              "value": 0.193
            },
            {
              "label": "This aluminium size's resistance at 20 °C (68 °F), Ω/km",
              "value": 0.164
            },
            {
              "label": "This aluminium size's resistance against the copper's (%)",
              "value": 84.97409326424871
            },
            {
              "label": "The size below it (mm²)",
              "value": 150,
              "unit": "mm²"
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 106.73575129533678
            },
            {
              "label": "Aluminium area against copper area",
              "value": 1.9473684210526316
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "120 mm² copper: 240 mm² of aluminium",
          "inputs": {
            "copperSize": "120mm2"
          },
          "expected": 240,
          "toleranceDecimalPlaces": 6,
          "unit": "mm²",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor resistance at 20 °C (68 °F), Ω/km",
              "value": 0.153
            },
            {
              "label": "This aluminium size's resistance at 20 °C (68 °F), Ω/km",
              "value": 0.125
            },
            {
              "label": "This aluminium size's resistance against the copper's (%)",
              "value": 81.69934640522875
            },
            {
              "label": "The size below it (mm²)",
              "value": 185,
              "unit": "mm²"
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 107.18954248366013
            },
            {
              "label": "Aluminium area against copper area",
              "value": 2
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "185 mm² copper: 400 mm² of aluminium",
          "inputs": {
            "copperSize": "185mm2"
          },
          "expected": 400,
          "toleranceDecimalPlaces": 6,
          "unit": "mm²",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor resistance at 20 °C (68 °F), Ω/km",
              "value": 0.0991
            },
            {
              "label": "This aluminium size's resistance at 20 °C (68 °F), Ω/km",
              "value": 0.0778
            },
            {
              "label": "This aluminium size's resistance against the copper's (%)",
              "value": 78.50655903128153
            },
            {
              "label": "The size below it (mm²)",
              "value": 300,
              "unit": "mm²"
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 100.90817356205855
            },
            {
              "label": "Aluminium area against copper area",
              "value": 2.1621621621621623
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "240 mm² copper: 500 mm² of aluminium",
          "inputs": {
            "copperSize": "240mm2"
          },
          "expected": 500,
          "toleranceDecimalPlaces": 6,
          "unit": "mm²",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor resistance at 20 °C (68 °F), Ω/km",
              "value": 0.0754
            },
            {
              "label": "This aluminium size's resistance at 20 °C (68 °F), Ω/km",
              "value": 0.0605
            },
            {
              "label": "This aluminium size's resistance against the copper's (%)",
              "value": 80.23872679045093
            },
            {
              "label": "The size below it (mm²)",
              "value": 400,
              "unit": "mm²"
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 103.18302387267903
            },
            {
              "label": "Aluminium area against copper area",
              "value": 2.0833333333333335
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "300 mm² copper: 630 mm² of aluminium",
          "inputs": {
            "copperSize": "300mm2"
          },
          "expected": 630,
          "toleranceDecimalPlaces": 6,
          "unit": "mm²",
          "confidence": "high",
          "steps": [
            {
              "label": "Copper conductor resistance at 20 °C (68 °F), Ω/km",
              "value": 0.0601
            },
            {
              "label": "This aluminium size's resistance at 20 °C (68 °F), Ω/km",
              "value": 0.0469
            },
            {
              "label": "This aluminium size's resistance against the copper's (%)",
              "value": 78.03660565723793
            },
            {
              "label": "The size below it (mm²)",
              "value": 500,
              "unit": "mm²"
            },
            {
              "label": "The size below it: resistance against the copper's (%)",
              "value": 100.66555740432612
            },
            {
              "label": "Aluminium area against copper area",
              "value": 2.1
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "corrugated-decking-deflection-calculator",
      "title": "Corrugated Metal Decking Span Deflection Checker",
      "url": "https://craftquantities.com/calculators/materials-quantities/corrugated-decking-deflection-calculator/",
      "sources": [
        "Steel Deck Institute Floor/Roof Deck Design Manuals: Δ = 5wL⁴/(384EI) applied per unit width, with E = 200,000 MPa; effective moment of inertia (I) is profile- and gauge-specific and must come from the deck manufacturer's or SDI's own span table — it cannot be derived from a general formula"
      ],
      "vectors": [
        {
          "name": "3000 N/m, 3m span, I=20x10^6mm^4, L/240",
          "inputs": {
            "udl": 3000,
            "span": 3,
            "momentOfInertia": 20,
            "deflectionLimitRatio": "240"
          },
          "expected": 0.791,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Allowable limit",
              "value": 12.5,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "4000 N/m, 4m span, I=35x10^6mm^4, L/240",
          "inputs": {
            "udl": 4000,
            "span": 4,
            "momentOfInertia": 35,
            "deflectionLimitRatio": "240"
          },
          "expected": 1.905,
          "toleranceDecimalPlaces": 1,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Allowable limit",
              "value": 16.666666666666668,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "corrugated-panel-overlap-calculator",
      "title": "Corrugated Metal Panel Side Lap Overlap Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/corrugated-panel-overlap-calculator/",
      "sources": [
        "Net coverage width per panel = panel width − side lap width; panels needed = ceil(total roof width ÷ net coverage width per panel)"
      ],
      "vectors": [
        {
          "name": "20m roof, 1.05m panel, 0.05m side lap",
          "inputs": {
            "roofWidth": 20,
            "panelWidth": 1.05,
            "sideLapWidth": 0.05
          },
          "expected": 20,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "high",
          "steps": [
            {
              "label": "Net coverage width per panel",
              "value": 1,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15m roof, 0.9m panel, 0.075m side lap",
          "inputs": {
            "roofWidth": 15,
            "panelWidth": 0.9,
            "sideLapWidth": 0.075
          },
          "expected": 19,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "high",
          "steps": [
            {
              "label": "Net coverage width per panel",
              "value": 0.8250000000000001,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cost-per-cubic-yard-calculator",
      "title": "Cost Per Cubic Yard Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/cost-per-cubic-yard-calculator/",
      "sources": [
        "Cost per cubic yard = total cost / total volume in cubic yards"
      ],
      "vectors": [
        {
          "name": "$1000 for 25 yd³",
          "inputs": {
            "totalCost": 1000,
            "bulkVolume": 19113.8714496
          },
          "expected": 40,
          "toleranceDecimalPlaces": 0,
          "unit": "currency/yd³",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "$1500 for 30 yd³",
          "inputs": {
            "totalCost": 1500,
            "bulkVolume": 22936.64573952
          },
          "expected": 50,
          "toleranceDecimalPlaces": 0,
          "unit": "currency/yd³",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cost-per-linear-foot-calculator",
      "title": "Cost Per Linear Foot Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/cost-per-linear-foot-calculator/",
      "sources": [
        "Cost per linear foot = total project cost / total length"
      ],
      "vectors": [
        {
          "name": "$3000 for 150ft",
          "inputs": {
            "totalCost": 3000,
            "totalLength": 45.72
          },
          "expected": 20,
          "toleranceDecimalPlaces": 0.1,
          "unit": "currency/linear ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Total length",
              "value": 150,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "$1500 for 100ft",
          "inputs": {
            "totalCost": 1500,
            "totalLength": 30.48
          },
          "expected": 15,
          "toleranceDecimalPlaces": 0.1,
          "unit": "currency/linear ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Total length",
              "value": 100,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cost-per-square-foot-calculator",
      "title": "Cost Per Square Foot Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/cost-per-square-foot-calculator/",
      "sources": [
        "Pure arithmetic: cost per square foot = total cost / total area"
      ],
      "vectors": [
        {
          "name": "$15,000 over 1,000 sq ft",
          "inputs": {
            "totalCost": 15000,
            "areaSqft": 92.90304
          },
          "expected": 15,
          "toleranceDecimalPlaces": 2,
          "unit": "currency / sq ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Total cost",
              "value": 15000,
              "unit": "USD"
            },
            {
              "label": "Area",
              "value": 1000,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "$48,500 over 1,850 sq ft",
          "inputs": {
            "totalCost": 48500,
            "areaSqft": 171.870624
          },
          "expected": 26.22,
          "toleranceDecimalPlaces": 1,
          "unit": "currency / sq ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Total cost",
              "value": 48500,
              "unit": "USD"
            },
            {
              "label": "Area",
              "value": 1849.9999999999998,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cost-to-build-house-calculator",
      "title": "Cost to Build a House Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/cost-to-build-house-calculator/",
      "sources": [
        "Element-based build-up. Rates are user-supplied; no market data is embedded.",
        "Order of application matters: contingency on construction, fees on the contingent sum, tax on everything"
      ],
      "vectors": [
        {
          "name": "150 m² fully built up",
          "inputs": {
            "floorArea": 150,
            "buildRate": 2200,
            "externalWorks": 35000,
            "serviceConnections": 12000,
            "designFeePercent": 10,
            "contingencyPercent": 12,
            "taxPercent": 0
          },
          "expected": 466664,
          "toleranceDecimalPlaces": -4,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Building",
              "value": 330000,
              "unit": "currency"
            },
            {
              "label": "External works",
              "value": 35000,
              "unit": "currency"
            },
            {
              "label": "Service connections",
              "value": 12000,
              "unit": "currency"
            },
            {
              "label": "Contingency",
              "value": 45240,
              "unit": "currency"
            },
            {
              "label": "Professional fees",
              "value": 42224,
              "unit": "currency"
            },
            {
              "label": "Tax",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "All-in cost per unit of GIA",
              "value": 3096.4266666666667,
              "unit": "currency/m²"
            },
            {
              "label": "Uplift over the bare build rate",
              "value": 40.74666666666666,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "The bare build with no additions",
          "inputs": {
            "floorArea": 150,
            "buildRate": 2200,
            "externalWorks": 0,
            "serviceConnections": 0,
            "designFeePercent": 0,
            "contingencyPercent": 0,
            "taxPercent": 0
          },
          "expected": 330000,
          "toleranceDecimalPlaces": -4,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Building",
              "value": 330000,
              "unit": "currency"
            },
            {
              "label": "External works",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Service connections",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Contingency",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Professional fees",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Tax",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "All-in cost per unit of GIA",
              "value": 2200,
              "unit": "currency/m²"
            },
            {
              "label": "Uplift over the bare build rate",
              "value": 0,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Tax applies on top of everything",
          "inputs": {
            "floorArea": 150,
            "buildRate": 2200,
            "externalWorks": 35000,
            "serviceConnections": 12000,
            "designFeePercent": 10,
            "contingencyPercent": 12,
            "taxPercent": 20
          },
          "expected": 559996.8,
          "toleranceDecimalPlaces": -4,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Building",
              "value": 330000,
              "unit": "currency"
            },
            {
              "label": "External works",
              "value": 35000,
              "unit": "currency"
            },
            {
              "label": "Service connections",
              "value": 12000,
              "unit": "currency"
            },
            {
              "label": "Contingency",
              "value": 45240,
              "unit": "currency"
            },
            {
              "label": "Professional fees",
              "value": 42224,
              "unit": "currency"
            },
            {
              "label": "Tax",
              "value": 92892.8,
              "unit": "currency"
            },
            {
              "label": "All-in cost per unit of GIA",
              "value": 3715.7120000000004,
              "unit": "currency/m²"
            },
            {
              "label": "Uplift over the bare build rate",
              "value": 68.89600000000002,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Zero rate gives only the fixed sums",
          "inputs": {
            "floorArea": 150,
            "buildRate": 0,
            "externalWorks": 35000,
            "serviceConnections": 12000,
            "designFeePercent": 10,
            "contingencyPercent": 12,
            "taxPercent": 0
          },
          "expected": 57904,
          "toleranceDecimalPlaces": 2,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Building",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "External works",
              "value": 35000,
              "unit": "currency"
            },
            {
              "label": "Service connections",
              "value": 12000,
              "unit": "currency"
            },
            {
              "label": "Contingency",
              "value": 5640,
              "unit": "currency"
            },
            {
              "label": "Professional fees",
              "value": 5264,
              "unit": "currency"
            },
            {
              "label": "Tax",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "All-in cost per unit of GIA",
              "value": 386.02666666666664,
              "unit": "currency/m²"
            },
            {
              "label": "Uplift over the bare build rate",
              "value": 0,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "countertop-calculator",
      "title": "Countertop Area Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/countertop-calculator/",
      "sources": [
        "Standard kitchen countertop depth is about 25-26 in including a 1-1.5 in overhang; backsplash height is commonly 4 in for a standard splash or full-height to the cabinets"
      ],
      "vectors": [
        {
          "name": "4m counter, 25.5in depth, 4in backsplash",
          "inputs": {
            "counterLength": 4,
            "counterDepth": 0.6477,
            "backsplashHeight": 0.1016
          },
          "expected": 32.27,
          "toleranceDecimalPlaces": 1,
          "unit": "sq ft (total)",
          "confidence": "high",
          "steps": [
            {
              "label": "Countertop surface",
              "value": 27.887139107611553,
              "unit": "sq ft"
            },
            {
              "label": "Backsplash",
              "value": 4.37445319335083,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "6m counter, 25in depth, 18in backsplash",
          "inputs": {
            "counterLength": 6,
            "counterDepth": 0.635,
            "backsplashHeight": 0.4572
          },
          "expected": 70.53,
          "toleranceDecimalPlaces": 1,
          "unit": "sq ft (total)",
          "confidence": "high",
          "steps": [
            {
              "label": "Countertop surface",
              "value": 41.01049868766405,
              "unit": "sq ft"
            },
            {
              "label": "Backsplash",
              "value": 29.52755905511811,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "court-line-marking-paint-calculator",
      "title": "Sports Court Floor Line Marking Paint Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/court-line-marking-paint-calculator/",
      "sources": [
        "Line marking area = total line length × line width; paint needed = line area ÷ the paint product's rated coverage rate"
      ],
      "vectors": [
        {
          "name": "200m of line, 50mm wide, 8 m²/L coverage",
          "inputs": {
            "totalLineLength": 200,
            "lineWidth": 0.05,
            "coverageRate": 8
          },
          "expected": 1.25,
          "toleranceDecimalPlaces": 1,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Total line area",
              "value": 10,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "300m of line, 60mm wide, 8 m²/L coverage",
          "inputs": {
            "totalLineLength": 300,
            "lineWidth": 0.06,
            "coverageRate": 8
          },
          "expected": 2.25,
          "toleranceDecimalPlaces": 1,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Total line area",
              "value": 18,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cove-base-roll-calculator",
      "title": "Vinyl/Rubber Cove Base Roll Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/cove-base-roll-calculator/",
      "sources": [
        "Total cove base length = wall perimeter × (1 + waste allowance); rolls needed = ceil(total length ÷ standard roll length), commonly 36.5m (120 ft) per roll for commercial resilient cove base"
      ],
      "vectors": [
        {
          "name": "40m perimeter, 5% waste, 36.5m roll",
          "inputs": {
            "wallPerimeter": 40,
            "wastePercent": 5,
            "rollLength": 36.5
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Total length needed",
              "value": 42,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "80m perimeter, 8% waste, 36.5m roll",
          "inputs": {
            "wallPerimeter": 80,
            "wastePercent": 8,
            "rollLength": 36.5
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Total length needed",
              "value": 86.4,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "covered-walkway-bay-spacing-calculator",
      "title": "Pedestrian Covered Walkway Support Bay Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/covered-walkway-bay-spacing-calculator/",
      "sources": [
        "Number of bays = ceil(Walkway Length ÷ Maximum Bay Spacing) + 1, the standard support-count method (identical in principle to this site's duct/pipe hanger spacing calculators) applied to a covered walkway/pedestrian protection canopy structure — maximum bay spacing must come from the specific walkway system's structural design or manufacturer's engineering data, since it depends on the canopy's load rating (foot traffic, debris/impact loading per local code) and structural member sizing."
      ],
      "vectors": [
        {
          "name": "30m walkway, 3m max bay spacing",
          "inputs": {
            "walkwayLength": 30,
            "maxBaySpacing": 3
          },
          "expected": 11,
          "toleranceDecimalPlaces": 0,
          "unit": "frames",
          "confidence": "medium",
          "steps": [
            {
              "label": "Bays along the walkway",
              "value": 10
            },
            {
              "label": "Frame centres, as erected",
              "value": 3,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "45m walkway, 4m max bay spacing",
          "inputs": {
            "walkwayLength": 45,
            "maxBaySpacing": 4
          },
          "expected": 13,
          "toleranceDecimalPlaces": 0,
          "unit": "frames",
          "confidence": "medium",
          "steps": [
            {
              "label": "Bays along the walkway",
              "value": 12
            },
            {
              "label": "Frame centres, as erected",
              "value": 3.75,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "crack-isolation-membrane-calculator",
      "title": "Floor Crack Isolation Membrane Coverage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/crack-isolation-membrane-calculator/",
      "sources": [
        "Roll count = ceil(floor area ÷ roll coverage area), the standard method for estimating rolled crack isolation/anti-fracture membrane material"
      ],
      "vectors": [
        {
          "name": "30m² floor, 9.3m² roll",
          "inputs": {
            "floorArea": 30,
            "rollCoverageArea": 9.3
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "45m² floor, 9.3m² roll",
          "inputs": {
            "floorArea": 45,
            "rollCoverageArea": 9.3
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "crane-lift-utilisation-calculator",
      "title": "Crane Lift Utilisation Calculator",
      "url": "https://craftquantities.com/calculators/heavy-civil/crane-lift-utilisation-calculator/",
      "sources": [
        "Rated capacity is read from the crane's own load chart for the specific configuration, radius and boom length — it is not derived here",
        "ASME B30.5 and common practice: gross load includes the load, all rigging, the hook block, and any jib or auxiliary head, whether in use or not"
      ],
      "vectors": [
        {
          "name": "4,500 kg load on an 8,000 kg chart figure",
          "inputs": {
            "ratedCapacity": 8000,
            "loadMass": 4500,
            "riggingMass": 250,
            "blockMass": 400,
            "windAllowancePercent": 10
          },
          "expected": 70.81,
          "toleranceDecimalPlaces": 1,
          "unit": "%",
          "confidence": "medium",
          "steps": [
            {
              "label": "Gross lifted load",
              "value": 5665.000000000001,
              "unit": "kg"
            },
            {
              "label": "Rated capacity",
              "value": 8000,
              "unit": "kg"
            },
            {
              "label": "Margin remaining",
              "value": 2334.999999999999,
              "unit": "kg"
            },
            {
              "label": "Load alone as a share of capacity",
              "value": 56.25,
              "unit": "%"
            },
            {
              "label": "Rigging, block and allowance",
              "value": 1165.000000000001,
              "unit": "kg"
            },
            {
              "label": "Gross load in tonnes",
              "value": 5.665000000000001,
              "unit": "t"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ignoring rigging and block understates it",
          "inputs": {
            "ratedCapacity": 8000,
            "loadMass": 4500,
            "riggingMass": 0,
            "blockMass": 0,
            "windAllowancePercent": 0
          },
          "expected": 56.25,
          "toleranceDecimalPlaces": 2,
          "unit": "%",
          "confidence": "medium",
          "steps": [
            {
              "label": "Gross lifted load",
              "value": 4500,
              "unit": "kg"
            },
            {
              "label": "Rated capacity",
              "value": 8000,
              "unit": "kg"
            },
            {
              "label": "Margin remaining",
              "value": 3500,
              "unit": "kg"
            },
            {
              "label": "Load alone as a share of capacity",
              "value": 56.25,
              "unit": "%"
            },
            {
              "label": "Rigging, block and allowance",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Gross load in tonnes",
              "value": 4.5,
              "unit": "t"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A heavier load exceeds capacity",
          "inputs": {
            "ratedCapacity": 8000,
            "loadMass": 7500,
            "riggingMass": 250,
            "blockMass": 400,
            "windAllowancePercent": 10
          },
          "expected": 112.0625,
          "toleranceDecimalPlaces": 2,
          "unit": "%",
          "confidence": "medium",
          "steps": [
            {
              "label": "Gross lifted load",
              "value": 8965,
              "unit": "kg"
            },
            {
              "label": "Rated capacity",
              "value": 8000,
              "unit": "kg"
            },
            {
              "label": "Margin remaining",
              "value": -965,
              "unit": "kg"
            },
            {
              "label": "Load alone as a share of capacity",
              "value": 93.75,
              "unit": "%"
            },
            {
              "label": "Rigging, block and allowance",
              "value": 1465,
              "unit": "kg"
            },
            {
              "label": "Gross load in tonnes",
              "value": 8.965,
              "unit": "t"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "No load is zero utilisation",
          "inputs": {
            "ratedCapacity": 8000,
            "loadMass": 0,
            "riggingMass": 0,
            "blockMass": 0,
            "windAllowancePercent": 10
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "%",
          "confidence": "medium",
          "steps": [
            {
              "label": "Gross lifted load",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Rated capacity",
              "value": 8000,
              "unit": "kg"
            },
            {
              "label": "Margin remaining",
              "value": 8000,
              "unit": "kg"
            },
            {
              "label": "Load alone as a share of capacity",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Rigging, block and allowance",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Gross load in tonnes",
              "value": 0,
              "unit": "t"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "crane-load-wind-force-calculator",
      "title": "Suspended Load Wind Force and Swing Calculator",
      "url": "https://craftquantities.com/calculators/heavy-civil/crane-load-wind-force-calculator/",
      "sources": [
        "Wind force = ½ × air density × wind speed² × shape factor × projected sail area, the standard dynamic-pressure form used for wind loading on a body",
        "Air density default of 1.225 kg/m³ is the International Standard Atmosphere value at sea level and 15 °C; cold, dense air produces a larger force at the same wind speed",
        "RULE OF THUMB, stated as one: the default shape factor of 1.2 is a general value for a compact load. Flat plates, panels and lattice frames all differ, sometimes substantially, and the governing coefficient comes from the standard the lift plan is written under or from the crane manufacturer's own guidance",
        "Swing geometry: a suspended load hangs at the angle whose tangent is the horizontal force divided by the load's weight, and the offset at the load is the rope length below the boom head times the sine of that angle"
      ],
      "vectors": [
        {
          "name": "12 m² sail area in a 20 m/s gust, general shape factor, 3 t load",
          "inputs": {
            "sailArea": 12,
            "gustWindSpeed": 20,
            "shapeFactor": 1.2,
            "airDensity": 1.225,
            "loadWeight": 3000,
            "ropeLength": 10,
            "workingRadius": 20
          },
          "expected": 3528,
          "toleranceDecimalPlaces": 1,
          "unit": "N",
          "confidence": "medium",
          "steps": [
            {
              "label": "Wind pressure on the sail area",
              "value": 294,
              "unit": "N/m²"
            },
            {
              "label": "Angle the load hangs off vertical",
              "value": 6.838177203434974,
              "unit": "°"
            },
            {
              "label": "Sideways offset of the load",
              "value": 1.1906557266435764,
              "unit": "m"
            },
            {
              "label": "Added moment from the offset",
              "value": 35.029031945067686,
              "unit": "kN·m"
            },
            {
              "label": "Moment about the slew centre if the wind blows across the boom",
              "value": 70.56,
              "unit": "kN·m"
            },
            {
              "label": "Load moment at the radius with no wind",
              "value": 588.399,
              "unit": "kN·m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "30 m² panel in a 12 m/s gust with a flat-plate shape factor",
          "inputs": {
            "sailArea": 30,
            "gustWindSpeed": 12,
            "shapeFactor": 1.6,
            "airDensity": 1.225,
            "loadWeight": 1500,
            "ropeLength": 15,
            "workingRadius": 25
          },
          "expected": 4233.6,
          "toleranceDecimalPlaces": 1,
          "unit": "N",
          "confidence": "medium",
          "steps": [
            {
              "label": "Wind pressure on the sail area",
              "value": 141.12,
              "unit": "N/m²"
            },
            {
              "label": "Angle the load hangs off vertical",
              "value": 16.056067387371066,
              "unit": "°"
            },
            {
              "label": "Sideways offset of the load",
              "value": 4.14866814648476,
              "unit": "m"
            },
            {
              "label": "Added moment from the offset",
              "value": 61.02680471808715,
              "unit": "kN·m"
            },
            {
              "label": "Moment about the slew centre if the wind blows across the boom",
              "value": 105.84000000000002,
              "unit": "kN·m"
            },
            {
              "label": "Load moment at the radius with no wind",
              "value": 367.74937499999993,
              "unit": "kN·m"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "crane-mat-bearing-pressure-calculator",
      "title": "Crane Outrigger/Mat Ground-Bearing Pressure Calculator",
      "url": "https://craftquantities.com/calculators/heavy-civil/crane-mat-bearing-pressure-calculator/",
      "sources": [
        "Applied bearing pressure = Outrigger Reaction Load × 9.81 ÷ Mat Contact Area — the standard bearing-pressure check for temporary crane pick support, using the SAME reaction load the rigger/crane operator reads directly from the crane's own manufacturer-certified load chart (this calculator does not calculate crane capacity, stability, or ballast — it only checks whether the GROUND under a known reaction load, from your own certified chart, can support it)."
      ],
      "vectors": [
        {
          "name": "15000kg reaction, 1.2x1.2m mat, 150kPa allowable (pass)",
          "inputs": {
            "reactionLoad": 15000,
            "matWidth": 1.2,
            "matLength": 1.2,
            "allowableBearing": 150000
          },
          "expected": 102.19,
          "toleranceDecimalPlaces": 1,
          "unit": "kN/m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Outrigger reaction force",
              "value": 147150,
              "unit": "N"
            },
            {
              "label": "Mat contact area",
              "value": 1.44,
              "unit": "m²"
            },
            {
              "label": "Allowable bearing capacity (user-supplied)",
              "value": 150,
              "unit": "kN/m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "25000kg reaction, 1.5x1.5m mat, 150kPa allowable (pass)",
          "inputs": {
            "reactionLoad": 25000,
            "matWidth": 1.5,
            "matLength": 1.5,
            "allowableBearing": 150000
          },
          "expected": 109,
          "toleranceDecimalPlaces": 0,
          "unit": "kN/m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Outrigger reaction force",
              "value": 245250,
              "unit": "N"
            },
            {
              "label": "Mat contact area",
              "value": 2.25,
              "unit": "m²"
            },
            {
              "label": "Allowable bearing capacity (user-supplied)",
              "value": 150,
              "unit": "kN/m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "crawl-space-vent-calculator",
      "title": "Crawl Space and Subfloor Vent Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/crawl-space-vent-calculator/",
      "sources": [
        "International Code Council, 2021 International Residential Code, R408.2: net ventilation opening area at least 1 sq ft (0.0929 m²) for each 150 sq ft (14 m²) of under-floor area, one opening within 3 ft (915 mm) of each external corner; exception 1, 1/1,500 of the area where the ground is covered with a Class I vapor retarder; exception 2, cross ventilation in place of the corner rule with that retarder",
        "The same code, R408.3 unvented crawl spaces: a continuous Class I vapor retarder and, among the options, continuous exhaust or a conditioned supply of 1 cfm (0.47 L/s) for each 50 sq ft (4.7 m²) of floor area",
        "HM Government, Approved Document C (2004 edition incorporating 2010 and 2013 amendments), 4.14(b) and 4.19(b): openings in two opposing external walls of not less than 1,500 mm² per metre run of external wall or 500 mm² per m² of floor area, whichever gives the greater; a void of at least 75 mm to wall-plates and 150 mm to the floor; ducts at least 100 mm in diameter",
        "Vent ratings: Gibraltar Building Products ventilation catalogue (2022), 16 × 8 in foundation vents at 45 sq in (models ALSL, PLSLBL) and 64 sq in (PLDPBL) net free area; Timloc 1201 airbrick datasheet (2025), 6,170 mm² equivalent area; Rytons Periscope PUFV datasheet (2010), 7,750 mm² with airbrick fitted"
      ],
      "vectors": [
        {
          "name": "IRC open ground: 1,200 sq ft is 8 sq ft of vent, 1,152 sq in — 26 vents at 45 sq in",
          "inputs": {
            "rule": "irc",
            "length": 12.192,
            "width": 9.144,
            "vent": "vent1",
            "ventArea": 0.029032199999999998
          },
          "expected": 1152,
          "toleranceDecimalPlaces": 1,
          "unit": "in²",
          "confidence": "high",
          "steps": [
            {
              "label": "The same area",
              "value": 8,
              "unit": "sq ft"
            },
            {
              "label": "Vents at the chosen rating",
              "value": 26,
              "unit": "vents"
            },
            {
              "label": "Under-floor area",
              "value": 1200,
              "unit": "sq ft"
            },
            {
              "label": "Unvented instead: continuous exhaust (R408.3)",
              "value": 24,
              "unit": "cfm"
            },
            {
              "label": "Least vents by position (one near each corner)",
              "value": 4,
              "unit": "vents"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "IRC with a Class I vapor retarder: 1,200 sq ft at 1/1,500 is 0.8 sq ft, 115.2 sq in",
          "inputs": {
            "rule": "ircRetarder",
            "length": 12.192,
            "width": 9.144,
            "vent": "vent2",
            "ventArea": 0.029032199999999998
          },
          "expected": 115.2,
          "toleranceDecimalPlaces": 1,
          "unit": "in²",
          "confidence": "high",
          "steps": [
            {
              "label": "The same area",
              "value": 0.8,
              "unit": "sq ft"
            },
            {
              "label": "Vents at the chosen rating",
              "value": 2,
              "unit": "vents"
            },
            {
              "label": "Under-floor area",
              "value": 1200,
              "unit": "sq ft"
            },
            {
              "label": "Unvented instead: continuous exhaust (R408.3)",
              "value": 24,
              "unit": "cfm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Approved Document C: 12 × 9 m, perimeter 42 m — 63,000 mm² by the wall run beats 54,000 by the floor; 97.65 sq in",
          "inputs": {
            "rule": "adc",
            "length": 12,
            "width": 9,
            "vent": "custom",
            "ventArea": 0.00617
          },
          "expected": 97.6502,
          "toleranceDecimalPlaces": 2,
          "unit": "in²",
          "confidence": "high",
          "steps": [
            {
              "label": "The same area",
              "value": 0.6781263562527124,
              "unit": "sq ft"
            },
            {
              "label": "Vents at the chosen rating",
              "value": 11,
              "unit": "vents"
            },
            {
              "label": "Under-floor area",
              "value": 1162.50232500465,
              "unit": "sq ft"
            },
            {
              "label": "By the wall run (1,500 mm² per metre)",
              "value": 97.6501953003906,
              "unit": "in²"
            },
            {
              "label": "By the floor area (500 mm² per m²)",
              "value": 83.7001674003348,
              "unit": "in²"
            },
            {
              "label": "Clear void under a timber floor",
              "value": 5.905511811023622,
              "unit": "in"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "crawlspace-liner-calculator",
      "title": "Crawlspace Encapsulation Liner Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/crawlspace-liner-calculator/",
      "sources": [
        "Total liner area = floor area + wall area (perimeter × wall height); liner needed = total area × (1 + waste allowance), covering both the floor and the crawlspace wall lining in a full encapsulation system"
      ],
      "vectors": [
        {
          "name": "40m² floor, 26m perimeter, 1m walls, 10% waste",
          "inputs": {
            "floorArea": 40,
            "perimeter": 26,
            "wallHeight": 1,
            "wastePercent": 10
          },
          "expected": 72.6,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Wall area",
              "value": 26,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "55m² floor, 30m perimeter, 1.2m walls, 10% waste",
          "inputs": {
            "floorArea": 55,
            "perimeter": 30,
            "wallHeight": 1.2,
            "wastePercent": 10
          },
          "expected": 100.1,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Wall area",
              "value": 36,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "critical-path-float-calculator",
      "title": "Critical Path and Float Calculator (CPM)",
      "url": "https://craftquantities.com/calculators/financial-adjacent/critical-path-float-calculator/",
      "sources": [
        "The critical path method, Kelley and Walker (1959): a forward pass sets each activity's early start as the latest early finish of the activities it follows, a backward pass sets its late finish as the earliest late start of the activities that follow it, and total float is late start minus early start",
        "Critical activities are those with zero total float; any delay to one of them delays the end of the programme by the same amount, while an activity with float can slip by up to its float without moving the end"
      ],
      "vectors": [
        {
          "name": "The defaults: a two-path network with one day of float on C",
          "inputs": {
            "durationA": 5,
            "durationB": 3,
            "preB1": "A",
            "preB2": "none",
            "durationC": 6,
            "preC1": "A",
            "preC2": "none",
            "durationD": 4,
            "preD1": "B",
            "preD2": "none",
            "durationE": 2,
            "preE1": "C",
            "preE2": "D",
            "durationF": 3,
            "preF1": "E",
            "preF2": "none"
          },
          "expected": 17,
          "toleranceDecimalPlaces": 0,
          "unit": "days",
          "confidence": "high",
          "steps": [
            {
              "label": "Activity A: total float (early start day 0, late start day 0)",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Activity B: total float (early start day 5, late start day 5)",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Activity C: total float (early start day 5, late start day 6)",
              "value": 1,
              "unit": "days"
            },
            {
              "label": "Activity D: total float (early start day 8, late start day 8)",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Activity E: total float (early start day 12, late start day 12)",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Activity F: total float (early start day 14, late start day 14)",
              "value": 0,
              "unit": "days"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Lengthening C moves the critical path onto it",
          "inputs": {
            "durationA": 5,
            "durationB": 3,
            "preB1": "A",
            "preB2": "none",
            "durationC": 9,
            "preC1": "A",
            "preC2": "none",
            "durationD": 4,
            "preD1": "B",
            "preD2": "none",
            "durationE": 2,
            "preE1": "C",
            "preE2": "D",
            "durationF": 3,
            "preF1": "E",
            "preF2": "none"
          },
          "expected": 19,
          "toleranceDecimalPlaces": 0,
          "unit": "days",
          "confidence": "high",
          "steps": [
            {
              "label": "Activity A: total float (early start day 0, late start day 0)",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Activity B: total float (early start day 5, late start day 7)",
              "value": 2,
              "unit": "days"
            },
            {
              "label": "Activity C: total float (early start day 5, late start day 5)",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Activity D: total float (early start day 8, late start day 10)",
              "value": 2,
              "unit": "days"
            },
            {
              "label": "Activity E: total float (early start day 14, late start day 14)",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Activity F: total float (early start day 16, late start day 16)",
              "value": 0,
              "unit": "days"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "An activity at zero is left out",
          "inputs": {
            "durationA": 5,
            "durationB": 3,
            "preB1": "A",
            "preB2": "none",
            "durationC": 6,
            "preC1": "A",
            "preC2": "none",
            "durationD": 4,
            "preD1": "B",
            "preD2": "none",
            "durationE": 2,
            "preE1": "C",
            "preE2": "D",
            "durationF": 0,
            "preF1": "E",
            "preF2": "none"
          },
          "expected": 14,
          "toleranceDecimalPlaces": 0,
          "unit": "days",
          "confidence": "high",
          "steps": [
            {
              "label": "Activity A: total float (early start day 0, late start day 0)",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Activity B: total float (early start day 5, late start day 5)",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Activity C: total float (early start day 5, late start day 6)",
              "value": 1,
              "unit": "days"
            },
            {
              "label": "Activity D: total float (early start day 8, late start day 8)",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Activity E: total float (early start day 12, late start day 12)",
              "value": 0,
              "unit": "days"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Two activities that start together",
          "inputs": {
            "durationA": 4,
            "durationB": 7,
            "preB1": "none",
            "preB2": "none",
            "durationC": 2,
            "preC1": "A",
            "preC2": "none",
            "durationD": 0,
            "preD1": "none",
            "preD2": "none",
            "durationE": 0,
            "preE1": "none",
            "preE2": "none",
            "durationF": 3,
            "preF1": "B",
            "preF2": "C"
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "days",
          "confidence": "high",
          "steps": [
            {
              "label": "Activity A: total float (early start day 0, late start day 1)",
              "value": 1,
              "unit": "days"
            },
            {
              "label": "Activity B: total float (early start day 0, late start day 0)",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Activity C: total float (early start day 4, late start day 5)",
              "value": 1,
              "unit": "days"
            },
            {
              "label": "Activity F: total float (early start day 7, late start day 7)",
              "value": 0,
              "unit": "days"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Link coverage, network 0",
          "inputs": {
            "durationA": 2,
            "durationB": 3,
            "preB1": "none",
            "preB2": "none",
            "durationC": 4,
            "preC1": "none",
            "preC2": "B",
            "durationD": 5,
            "preD1": "none",
            "preD2": "B",
            "durationE": 6,
            "preE1": "none",
            "preE2": "B",
            "durationF": 7,
            "preF1": "none",
            "preF2": "B"
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "days",
          "confidence": "high",
          "steps": [
            {
              "label": "Activity A: total float (early start day 0, late start day 8)",
              "value": 8,
              "unit": "days"
            },
            {
              "label": "Activity B: total float (early start day 0, late start day 0)",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Activity C: total float (early start day 3, late start day 6)",
              "value": 3,
              "unit": "days"
            },
            {
              "label": "Activity D: total float (early start day 3, late start day 5)",
              "value": 2,
              "unit": "days"
            },
            {
              "label": "Activity E: total float (early start day 3, late start day 4)",
              "value": 1,
              "unit": "days"
            },
            {
              "label": "Activity F: total float (early start day 3, late start day 3)",
              "value": 0,
              "unit": "days"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Link coverage, network 1",
          "inputs": {
            "durationA": 2,
            "durationB": 3,
            "preB1": "A",
            "preB2": "A",
            "durationC": 4,
            "preC1": "A",
            "preC2": "none",
            "durationD": 5,
            "preD1": "A",
            "preD2": "C",
            "durationE": 6,
            "preE1": "A",
            "preE2": "C",
            "durationF": 7,
            "preF1": "A",
            "preF2": "C"
          },
          "expected": 13,
          "toleranceDecimalPlaces": 0,
          "unit": "days",
          "confidence": "high",
          "steps": [
            {
              "label": "Activity A: total float (early start day 0, late start day 0)",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Activity B: total float (early start day 2, late start day 10)",
              "value": 8,
              "unit": "days"
            },
            {
              "label": "Activity C: total float (early start day 2, late start day 2)",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Activity D: total float (early start day 6, late start day 8)",
              "value": 2,
              "unit": "days"
            },
            {
              "label": "Activity E: total float (early start day 6, late start day 7)",
              "value": 1,
              "unit": "days"
            },
            {
              "label": "Activity F: total float (early start day 6, late start day 6)",
              "value": 0,
              "unit": "days"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Link coverage, network 2",
          "inputs": {
            "durationA": 2,
            "durationB": 3,
            "preB1": "none",
            "preB2": "none",
            "durationC": 4,
            "preC1": "B",
            "preC2": "A",
            "durationD": 5,
            "preD1": "B",
            "preD2": "none",
            "durationE": 6,
            "preE1": "B",
            "preE2": "D",
            "durationF": 7,
            "preF1": "B",
            "preF2": "D"
          },
          "expected": 15,
          "toleranceDecimalPlaces": 0,
          "unit": "days",
          "confidence": "high",
          "steps": [
            {
              "label": "Activity A: total float (early start day 0, late start day 9)",
              "value": 9,
              "unit": "days"
            },
            {
              "label": "Activity B: total float (early start day 0, late start day 0)",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Activity C: total float (early start day 3, late start day 11)",
              "value": 8,
              "unit": "days"
            },
            {
              "label": "Activity D: total float (early start day 3, late start day 3)",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Activity E: total float (early start day 8, late start day 9)",
              "value": 1,
              "unit": "days"
            },
            {
              "label": "Activity F: total float (early start day 8, late start day 8)",
              "value": 0,
              "unit": "days"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Link coverage, network 3",
          "inputs": {
            "durationA": 2,
            "durationB": 3,
            "preB1": "A",
            "preB2": "A",
            "durationC": 4,
            "preC1": "none",
            "preC2": "B",
            "durationD": 5,
            "preD1": "C",
            "preD2": "A",
            "durationE": 6,
            "preE1": "C",
            "preE2": "none",
            "durationF": 7,
            "preF1": "C",
            "preF2": "E"
          },
          "expected": 22,
          "toleranceDecimalPlaces": 0,
          "unit": "days",
          "confidence": "high",
          "steps": [
            {
              "label": "Activity A: total float (early start day 0, late start day 0)",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Activity B: total float (early start day 2, late start day 2)",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Activity C: total float (early start day 5, late start day 5)",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Activity D: total float (early start day 9, late start day 17)",
              "value": 8,
              "unit": "days"
            },
            {
              "label": "Activity E: total float (early start day 9, late start day 9)",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Activity F: total float (early start day 15, late start day 15)",
              "value": 0,
              "unit": "days"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Link coverage, network 4",
          "inputs": {
            "durationA": 2,
            "durationB": 3,
            "preB1": "none",
            "preB2": "none",
            "durationC": 4,
            "preC1": "A",
            "preC2": "none",
            "durationD": 5,
            "preD1": "none",
            "preD2": "B",
            "durationE": 6,
            "preE1": "D",
            "preE2": "A",
            "durationF": 7,
            "preF1": "D",
            "preF2": "none"
          },
          "expected": 15,
          "toleranceDecimalPlaces": 0,
          "unit": "days",
          "confidence": "high",
          "steps": [
            {
              "label": "Activity A: total float (early start day 0, late start day 7)",
              "value": 7,
              "unit": "days"
            },
            {
              "label": "Activity B: total float (early start day 0, late start day 0)",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Activity C: total float (early start day 2, late start day 11)",
              "value": 9,
              "unit": "days"
            },
            {
              "label": "Activity D: total float (early start day 3, late start day 3)",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Activity E: total float (early start day 8, late start day 9)",
              "value": 1,
              "unit": "days"
            },
            {
              "label": "Activity F: total float (early start day 8, late start day 8)",
              "value": 0,
              "unit": "days"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Link coverage, network 5",
          "inputs": {
            "durationA": 2,
            "durationB": 3,
            "preB1": "A",
            "preB2": "A",
            "durationC": 4,
            "preC1": "B",
            "preC2": "A",
            "durationD": 5,
            "preD1": "A",
            "preD2": "C",
            "durationE": 6,
            "preE1": "none",
            "preE2": "B",
            "durationF": 7,
            "preF1": "E",
            "preF2": "A"
          },
          "expected": 18,
          "toleranceDecimalPlaces": 0,
          "unit": "days",
          "confidence": "high",
          "steps": [
            {
              "label": "Activity A: total float (early start day 0, late start day 0)",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Activity B: total float (early start day 2, late start day 2)",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Activity C: total float (early start day 5, late start day 9)",
              "value": 4,
              "unit": "days"
            },
            {
              "label": "Activity D: total float (early start day 9, late start day 13)",
              "value": 4,
              "unit": "days"
            },
            {
              "label": "Activity E: total float (early start day 5, late start day 5)",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Activity F: total float (early start day 11, late start day 11)",
              "value": 0,
              "unit": "days"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "crown-molding-calculator",
      "title": "Crown Molding Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/crown-molding-calculator/",
      "sources": [
        "Room perimeter = 2 x (length + width); crown molding runs the full ceiling perimeter since doorways don't reach the ceiling",
        "15% waste is standard for crown molding to account for compound-angle corner miters, higher than flat trim's typical 10%",
        "Crown molding is racked in 8, 10, 12, 14 and 16 ft sticks where trim is sold by the foot, and in 2.4, 3, 3.6, 4.2 and 4.8 m sticks where it is sold by the metre, that ladder climbing in 300 mm steps",
        "Compound mitre for a sprung moulding cut flat on the saw: miter = arctan(sin S · tan(A/2)) and bevel = arcsin(cos S · sin(A/2)), where S is the spring angle and A is the angle the moulding TURNS — 180° less the angle the walls include. Reproduces the settings every crown table prints: 31.62°/33.86° for a 38/52 crown at a square corner, and 35.26°/30° for a 45/45"
      ],
      "vectors": [
        {
          "name": "4x3.5m room, 8ft sticks",
          "inputs": {
            "roomLength": 4,
            "roomWidth": 3.5,
            "stickLengthFt": 8
          },
          "expected": 56.59,
          "toleranceDecimalPlaces": 1,
          "unit": "linear ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Ceiling perimeter",
              "value": 49.212598425196845,
              "unit": "linear ft"
            },
            {
              "label": "Sticks needed",
              "value": 8,
              "unit": "x 8 ft sticks"
            },
            {
              "label": "Mitre, set on the saw's table",
              "value": null,
              "unit": "°"
            },
            {
              "label": "Bevel, set on the saw's blade",
              "value": null,
              "unit": "°"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "4x3.5m room with no mitre waste added",
          "inputs": {
            "roomLength": 4,
            "roomWidth": 3.5,
            "stickLengthFt": 8,
            "wastePercent": 0
          },
          "expected": 49.21,
          "toleranceDecimalPlaces": 1,
          "unit": "linear ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Ceiling perimeter",
              "value": 49.212598425196845,
              "unit": "linear ft"
            },
            {
              "label": "Sticks needed",
              "value": 7,
              "unit": "x 8 ft sticks"
            },
            {
              "label": "Mitre, set on the saw's table",
              "value": null,
              "unit": "°"
            },
            {
              "label": "Bevel, set on the saw's blade",
              "value": null,
              "unit": "°"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "5x4m room, 12ft sticks",
          "inputs": {
            "roomLength": 5,
            "roomWidth": 4,
            "stickLengthFt": 12
          },
          "expected": 67.92,
          "toleranceDecimalPlaces": 1,
          "unit": "linear ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Ceiling perimeter",
              "value": 59.055118110236215,
              "unit": "linear ft"
            },
            {
              "label": "Sticks needed",
              "value": 6,
              "unit": "x 12 ft sticks"
            },
            {
              "label": "Mitre, set on the saw's table",
              "value": null,
              "unit": "°"
            },
            {
              "label": "Bevel, set on the saw's blade",
              "value": null,
              "unit": "°"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "crushed-granite-cubic-yards-to-tons-calculator",
      "title": "Decomposed Granite Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/crushed-granite-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 1.4 short tons per cubic yard",
        "Density varies with moisture, grading and compaction — the supplier's ticket weight governs"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 14,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.4,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 140,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.4,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "crushed-granite-tons-to-cubic-yards-calculator",
      "title": "Decomposed Granite Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/crushed-granite-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 1.4 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 7.142857142857143,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.7142857142857143,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 71.42857142857143,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.7142857142857143,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "crushed-limestone-cubic-yards-to-tons-calculator",
      "title": "Crushed Limestone Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/crushed-limestone-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 1.35 short tons per cubic yard",
        "Density varies with moisture, compaction and composition — the supplier's ticket weight governs"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 13.5,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.35,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 135,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.35,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "crushed-limestone-tons-to-cubic-yards-calculator",
      "title": "Crushed Limestone Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/crushed-limestone-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 1.35 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 7.4074074074074066,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.7407407407407407,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 74.07407407407408,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.7407407407407407,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "cubic-feet-to-board-feet-calculator",
      "title": "Cubic Feet to Board Feet Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/cubic-feet-to-board-feet-calculator/",
      "sources": [
        "1 cubic foot = 12 board feet, since a board foot is 1/12 cu ft"
      ],
      "vectors": [
        {
          "name": "10 cu ft converts correctly",
          "inputs": {
            "cubicFeet": 10
          },
          "expected": 120,
          "toleranceDecimalPlaces": 6,
          "unit": "bd ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 12,
              "unit": "bd ft per cu ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicFeet": 100
          },
          "expected": 1200,
          "toleranceDecimalPlaces": 6,
          "unit": "bd ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 12,
              "unit": "bd ft per cu ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cubic-feet-to-cubic-meters-calculator",
      "title": "Cubic Feet to Cubic Metres Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/cubic-feet-to-cubic-meters-calculator/",
      "sources": [
        "NIST SP 811, Appendix B — 1 ft³ = 0.02831685 m³",
        "International yard and pound agreement, 1959 — the foot is exactly 0.3048 m"
      ],
      "vectors": [
        {
          "name": "100 ft³ is 2.832 m³",
          "inputs": {
            "cubicFeet": 100
          },
          "expected": 2.8316847,
          "toleranceDecimalPlaces": 5,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Cubic feet entered",
              "value": 100,
              "unit": "ft³"
            },
            {
              "label": "Cubic metres",
              "value": 2.8316846592,
              "unit": "m³"
            },
            {
              "label": "Litres",
              "value": 2831.6846592,
              "unit": "L"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "1 ft³ is 0.02832 m³",
          "inputs": {
            "cubicFeet": 1
          },
          "expected": 0.028316847,
          "toleranceDecimalPlaces": 7,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Cubic feet entered",
              "value": 1,
              "unit": "ft³"
            },
            {
              "label": "Cubic metres",
              "value": 0.028316846592,
              "unit": "m³"
            },
            {
              "label": "Litres",
              "value": 28.316846592,
              "unit": "L"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "35.3147 ft³ is one cubic metre",
          "inputs": {
            "cubicFeet": 35.3147
          },
          "expected": 1.0000009,
          "toleranceDecimalPlaces": 5,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Cubic feet entered",
              "value": 35.3147,
              "unit": "ft³"
            },
            {
              "label": "Cubic metres",
              "value": 1.0000009423425025,
              "unit": "m³"
            },
            {
              "label": "Litres",
              "value": 1000.0009423425025,
              "unit": "L"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "1000 ft³ is 28.32 m³",
          "inputs": {
            "cubicFeet": 1000
          },
          "expected": 28.316847,
          "toleranceDecimalPlaces": 4,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Cubic feet entered",
              "value": 1000,
              "unit": "ft³"
            },
            {
              "label": "Cubic metres",
              "value": 28.316846592,
              "unit": "m³"
            },
            {
              "label": "Litres",
              "value": 28316.846592,
              "unit": "L"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "cubic-feet-to-cubic-yards-calculator",
      "title": "Cubic Feet to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/cubic-feet-to-cubic-yards-calculator/",
      "sources": [
        "1 yd = 3 ft, so 1 cu yd = 3^3 = 27 cu ft exactly"
      ],
      "vectors": [
        {
          "name": "100 cu ft converts correctly",
          "inputs": {
            "cubicFeet": 100
          },
          "expected": 3.7037037037037033,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.037037037037037035,
              "unit": "cu yd per cu ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicFeet": 1000
          },
          "expected": 37.03703703703704,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.037037037037037035,
              "unit": "cu yd per cu ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cubic-feet-to-gallons-calculator",
      "title": "Cubic Feet to Gallons Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/cubic-feet-to-gallons-calculator/",
      "sources": [
        "NIST Handbook 44, Appendix C — 1 US liquid gallon = 231 cubic inches (exact)",
        "1 imperial gallon = 4.54609 L (exact), Weights and Measures Act 1985 (UK)"
      ],
      "vectors": [
        {
          "name": "10 ft³ is 74.805 US gallons",
          "inputs": {
            "cubicFeet": 10
          },
          "expected": 74.8052,
          "toleranceDecimalPlaces": 4,
          "unit": "US gallons",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume entered",
              "value": 10,
              "unit": "ft³"
            },
            {
              "label": "Imperial gallons (UK)",
              "value": 62.28835072667039,
              "unit": "imp gal"
            },
            {
              "label": "Litres",
              "value": 283.16846591999996,
              "unit": "L"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "1 ft³ is 7.4805 gallons",
          "inputs": {
            "cubicFeet": 1
          },
          "expected": 7.48052,
          "toleranceDecimalPlaces": 1,
          "unit": "US gallons",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume entered",
              "value": 1,
              "unit": "ft³"
            },
            {
              "label": "Imperial gallons (UK)",
              "value": 6.228835072667039,
              "unit": "imp gal"
            },
            {
              "label": "Litres",
              "value": 28.316846591999997,
              "unit": "L"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A 500 ft³ tank",
          "inputs": {
            "cubicFeet": 500
          },
          "expected": 3740.26,
          "toleranceDecimalPlaces": -2,
          "unit": "US gallons",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume entered",
              "value": 500,
              "unit": "ft³"
            },
            {
              "label": "Imperial gallons (UK)",
              "value": 3114.41753633352,
              "unit": "imp gal"
            },
            {
              "label": "Litres",
              "value": 14158.423295999999,
              "unit": "L"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Zero volume is zero gallons",
          "inputs": {
            "cubicFeet": 0
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "US gallons",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume entered",
              "value": 0,
              "unit": "ft³"
            },
            {
              "label": "Imperial gallons (UK)",
              "value": 0,
              "unit": "imp gal"
            },
            {
              "label": "Litres",
              "value": 0,
              "unit": "L"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "cubic-feet-to-liters-calculator",
      "title": "Cubic Feet to Litres Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/cubic-feet-to-liters-calculator/",
      "sources": [
        "NIST SP 811, Appendix B — 1 ft³ = 0.02831685 m³",
        "International yard and pound agreement, 1959 — the foot is exactly 0.3048 m, so 1 ft³ = 0.3048³ m³ = 28.316846592 L exactly",
        "BIPM, The International System of Units (SI Brochure), 9th edition — the litre is 1 dm³ = 0.001 m³"
      ],
      "vectors": [
        {
          "name": "1 cu ft is 28.316846592 L",
          "inputs": {
            "cubicFeet": 1
          },
          "expected": 28.316846592,
          "toleranceDecimalPlaces": 6,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Cubic feet entered",
              "value": 1,
              "unit": "cu ft"
            },
            {
              "label": "Litres",
              "value": 28.316846592,
              "unit": "L"
            },
            {
              "label": "Cubic metres",
              "value": 0.028316846592,
              "unit": "m³"
            },
            {
              "label": "US gallons",
              "value": 7.480519480519481,
              "unit": "US gal"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A 2 cu ft bag is 56.633693184 L",
          "inputs": {
            "cubicFeet": 2
          },
          "expected": 56.633693184,
          "toleranceDecimalPlaces": 6,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Cubic feet entered",
              "value": 2,
              "unit": "cu ft"
            },
            {
              "label": "Litres",
              "value": 56.633693184,
              "unit": "L"
            },
            {
              "label": "Cubic metres",
              "value": 0.056633693184,
              "unit": "m³"
            },
            {
              "label": "US gallons",
              "value": 14.961038961038962,
              "unit": "US gal"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "10 cu ft is 283.16846592 L",
          "inputs": {
            "cubicFeet": 10
          },
          "expected": 283.16846592,
          "toleranceDecimalPlaces": 6,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Cubic feet entered",
              "value": 10,
              "unit": "cu ft"
            },
            {
              "label": "Litres",
              "value": 283.16846592,
              "unit": "L"
            },
            {
              "label": "Cubic metres",
              "value": 0.28316846592,
              "unit": "m³"
            },
            {
              "label": "US gallons",
              "value": 74.80519480519482,
              "unit": "US gal"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A 6 cu ft barrow is 169.901079552 L",
          "inputs": {
            "cubicFeet": 6
          },
          "expected": 169.901079552,
          "toleranceDecimalPlaces": 6,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Cubic feet entered",
              "value": 6,
              "unit": "cu ft"
            },
            {
              "label": "Litres",
              "value": 169.901079552,
              "unit": "L"
            },
            {
              "label": "Cubic metres",
              "value": 0.169901079552,
              "unit": "m³"
            },
            {
              "label": "US gallons",
              "value": 44.883116883116884,
              "unit": "US gal"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "cubic-meters-per-hour-to-cfm-calculator",
      "title": "Cubic Metres per Hour to CFM Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/cubic-meters-per-hour-to-cfm-calculator/",
      "sources": [
        "This is the reciprocal of 1.69901079552. Exactly, 1 m³/h = 97656250 / 165919023 CFM = 0.588577778691476…, a repeating decimal, so the multiplier here is that exact fraction rounded to 16 significant figures. The definition it derives from — 1 ft = 0.3048 m exactly — is exact; only its decimal form is not."
      ],
      "vectors": [
        {
          "name": "850 m³/h converts correctly",
          "inputs": {
            "cubicMetresPerHour": 850
          },
          "expected": 500.29111188775505,
          "toleranceDecimalPlaces": 6,
          "unit": "CFM",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.5885777786914765,
              "unit": "CFM per m³/h"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicMetresPerHour": 8500
          },
          "expected": 5002.9111188775505,
          "toleranceDecimalPlaces": 6,
          "unit": "CFM",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.5885777786914765,
              "unit": "CFM per m³/h"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cubic-meters-per-hour-to-liters-per-second-calculator",
      "title": "Cubic Metres per Hour to Litres per Second Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/cubic-meters-per-hour-to-liters-per-second-calculator/",
      "sources": [
        "SI Brochure, 9th edition — the litre is 10⁻³ m³ and the hour 3,600 s",
        "NIST SP 811 — accepted non-SI units used with the SI"
      ],
      "vectors": [
        {
          "name": "100 m³/h is 27.78 L/s",
          "inputs": {
            "cubicMetersPerHour": 100
          },
          "expected": 27.777778,
          "toleranceDecimalPlaces": 5,
          "unit": "L/s",
          "confidence": "high",
          "steps": [
            {
              "label": "Cubic metres per hour entered",
              "value": 100,
              "unit": "m³/h"
            },
            {
              "label": "Litres per second",
              "value": 27.77777777777778,
              "unit": "L/s"
            },
            {
              "label": "Cubic metres per day at this rate",
              "value": 2400,
              "unit": "m³/day"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "36 m³/h is exactly 10 L/s",
          "inputs": {
            "cubicMetersPerHour": 36
          },
          "expected": 10,
          "toleranceDecimalPlaces": 6,
          "unit": "L/s",
          "confidence": "high",
          "steps": [
            {
              "label": "Cubic metres per hour entered",
              "value": 36,
              "unit": "m³/h"
            },
            {
              "label": "Litres per second",
              "value": 10,
              "unit": "L/s"
            },
            {
              "label": "Cubic metres per day at this rate",
              "value": 864,
              "unit": "m³/day"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "1 m³/h is 0.2778 L/s",
          "inputs": {
            "cubicMetersPerHour": 1
          },
          "expected": 0.27777778,
          "toleranceDecimalPlaces": 6,
          "unit": "L/s",
          "confidence": "high",
          "steps": [
            {
              "label": "Cubic metres per hour entered",
              "value": 1,
              "unit": "m³/h"
            },
            {
              "label": "Litres per second",
              "value": 0.2777777777777778,
              "unit": "L/s"
            },
            {
              "label": "Cubic metres per day at this rate",
              "value": 24,
              "unit": "m³/day"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "1000 m³/h is 277.8 L/s",
          "inputs": {
            "cubicMetersPerHour": 1000
          },
          "expected": 277.77778,
          "toleranceDecimalPlaces": 4,
          "unit": "L/s",
          "confidence": "high",
          "steps": [
            {
              "label": "Cubic metres per hour entered",
              "value": 1000,
              "unit": "m³/h"
            },
            {
              "label": "Litres per second",
              "value": 277.77777777777777,
              "unit": "L/s"
            },
            {
              "label": "Cubic metres per day at this rate",
              "value": 24000,
              "unit": "m³/day"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "cubic-meters-to-cubic-feet-calculator",
      "title": "Cubic Metres to Cubic Feet Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/cubic-meters-to-cubic-feet-calculator/",
      "sources": [
        "NIST SP 811, Appendix B — 1 m³ = 35.31467 ft³",
        "International yard and pound agreement, 1959 — the foot is exactly 0.3048 m"
      ],
      "vectors": [
        {
          "name": "10 m³ is 353.1 ft³",
          "inputs": {
            "cubicMeters": 10
          },
          "expected": 353.14667,
          "toleranceDecimalPlaces": 4,
          "unit": "ft³",
          "confidence": "high",
          "steps": [
            {
              "label": "Cubic metres entered",
              "value": 10,
              "unit": "m³"
            },
            {
              "label": "Cubic feet",
              "value": 353.14666721488595,
              "unit": "ft³"
            },
            {
              "label": "Cubic yards",
              "value": 13.079506193143924,
              "unit": "yd³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "1 m³ is 35.31 ft³",
          "inputs": {
            "cubicMeters": 1
          },
          "expected": 35.314667,
          "toleranceDecimalPlaces": 5,
          "unit": "ft³",
          "confidence": "high",
          "steps": [
            {
              "label": "Cubic metres entered",
              "value": 1,
              "unit": "m³"
            },
            {
              "label": "Cubic feet",
              "value": 35.31466672148859,
              "unit": "ft³"
            },
            {
              "label": "Cubic yards",
              "value": 1.3079506193143924,
              "unit": "yd³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Half a cubic metre is 17.66 ft³",
          "inputs": {
            "cubicMeters": 0.5
          },
          "expected": 17.657333,
          "toleranceDecimalPlaces": 5,
          "unit": "ft³",
          "confidence": "high",
          "steps": [
            {
              "label": "Cubic metres entered",
              "value": 0.5,
              "unit": "m³"
            },
            {
              "label": "Cubic feet",
              "value": 17.657333360744296,
              "unit": "ft³"
            },
            {
              "label": "Cubic yards",
              "value": 0.6539753096571962,
              "unit": "yd³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "100 m³ is 3531 ft³",
          "inputs": {
            "cubicMeters": 100
          },
          "expected": 3531.4667,
          "toleranceDecimalPlaces": 3,
          "unit": "ft³",
          "confidence": "high",
          "steps": [
            {
              "label": "Cubic metres entered",
              "value": 100,
              "unit": "m³"
            },
            {
              "label": "Cubic feet",
              "value": 3531.4666721488593,
              "unit": "ft³"
            },
            {
              "label": "Cubic yards",
              "value": 130.79506193143922,
              "unit": "yd³"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "cubic-meters-to-cubic-yards-calculator",
      "title": "Cubic Metres to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/cubic-meters-to-cubic-yards-calculator/",
      "sources": [
        "1 cubic yard = 0.764554857984 m^3, so 1 m^3 = 1.30795 cu yd"
      ],
      "vectors": [
        {
          "name": "10 m³ converts correctly",
          "inputs": {
            "cubicMetres": 10
          },
          "expected": 13.07950619314392,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.3079506193143922,
              "unit": "cu yd per m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicMetres": 100
          },
          "expected": 130.79506193143922,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.3079506193143922,
              "unit": "cu yd per m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cubic-yard-calculator",
      "title": "Cubic Yard Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/cubic-yard-calculator/",
      "sources": [
        "1 cubic yard = 0.764554857984 m³ exactly, from the international yard of 0.9144 m (1959)",
        "Ready-mix concrete, aggregate and topsoil are sold by the cubic yard across North America"
      ],
      "vectors": [
        {
          "name": "6 × 4 × 0.1 m at 10% waste",
          "inputs": {
            "length": 6,
            "width": 4,
            "depth": 0.1,
            "wasteFactorPercent": 10
          },
          "expected": 3.4531,
          "toleranceDecimalPlaces": 1,
          "unit": "cubic yards",
          "confidence": "high",
          "steps": [
            {
              "label": "Geometric volume",
              "value": 3.1390814863545415,
              "unit": "yd³"
            },
            {
              "label": "Cubic metres",
              "value": 2.6400000000000006,
              "unit": "m³"
            },
            {
              "label": "Cubic feet",
              "value": 93.23072014472989,
              "unit": "ft³"
            }
          ],
          "includesAllowance": {
            "label": "Waste allowance",
            "percent": 10
          },
          "basis": "ambiguous"
        },
        {
          "name": "One cubic yard exactly, no waste",
          "inputs": {
            "length": 0.9144,
            "width": 0.9144,
            "depth": 0.9144,
            "wasteFactorPercent": 0
          },
          "expected": 1,
          "toleranceDecimalPlaces": 2,
          "unit": "cubic yards",
          "confidence": "high",
          "steps": [
            {
              "label": "Geometric volume",
              "value": 1,
              "unit": "yd³"
            },
            {
              "label": "Cubic metres",
              "value": 0.764554857984,
              "unit": "m³"
            },
            {
              "label": "Cubic feet",
              "value": 26.999999999999996,
              "unit": "ft³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Zero depth is zero volume",
          "inputs": {
            "length": 10,
            "width": 10,
            "depth": 0,
            "wasteFactorPercent": 10
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "cubic yards",
          "confidence": "high",
          "steps": [
            {
              "label": "Geometric volume",
              "value": 0,
              "unit": "yd³"
            },
            {
              "label": "Cubic metres",
              "value": 0,
              "unit": "m³"
            },
            {
              "label": "Cubic feet",
              "value": 0,
              "unit": "ft³"
            }
          ],
          "includesAllowance": {
            "label": "Waste allowance",
            "percent": 10
          },
          "basis": "ambiguous"
        },
        {
          "name": "Doubling depth doubles volume",
          "inputs": {
            "length": 6,
            "width": 4,
            "depth": 0.2,
            "wasteFactorPercent": 10
          },
          "expected": 6.9062,
          "toleranceDecimalPlaces": 1,
          "unit": "cubic yards",
          "confidence": "high",
          "steps": [
            {
              "label": "Geometric volume",
              "value": 6.278162972709083,
              "unit": "yd³"
            },
            {
              "label": "Cubic metres",
              "value": 5.280000000000001,
              "unit": "m³"
            },
            {
              "label": "Cubic feet",
              "value": 186.46144028945977,
              "unit": "ft³"
            }
          ],
          "includesAllowance": {
            "label": "Waste allowance",
            "percent": 10
          },
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "cubic-yards-from-dimensions-calculator",
      "title": "Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/cubic-yards-from-dimensions-calculator/",
      "sources": [
        "Volume (cubic yards) = length x width x depth (all in feet) / 27"
      ],
      "vectors": [
        {
          "name": "6x4m area, 0.1m depth",
          "inputs": {
            "length": 6,
            "width": 4,
            "depth": 0.1
          },
          "expected": 3.139,
          "toleranceDecimalPlaces": 3,
          "unit": "cubic yards",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume in cubic feet",
              "value": 84.75520013157262,
              "unit": "ft³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "10x8m area, 0.15m depth",
          "inputs": {
            "length": 10,
            "width": 8,
            "depth": 0.15
          },
          "expected": 15.694,
          "toleranceDecimalPlaces": 2,
          "unit": "cubic yards",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume in cubic feet",
              "value": 423.776000657863,
              "unit": "ft³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cubic-yards-to-concrete-bags-calculator",
      "title": "Cubic Yards to Concrete Bags Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/cubic-yards-to-concrete-bags-calculator/",
      "sources": [
        "27 cu ft per cubic yard divided by approximately 0.6 cu ft yield per 80 lb bag",
        "Typical result: about 45 bags of 80 lb mix per cubic yard"
      ],
      "vectors": [
        {
          "name": "1 cu yd converts correctly",
          "inputs": {
            "cubicYards": 1
          },
          "expected": 45,
          "toleranceDecimalPlaces": 6,
          "unit": "bags",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 45,
              "unit": "bags per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 450,
          "toleranceDecimalPlaces": 6,
          "unit": "bags",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 45,
              "unit": "bags per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "cubic-yards-to-cubic-feet-calculator",
      "title": "Cubic Yards to Cubic Feet Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/cubic-yards-to-cubic-feet-calculator/",
      "sources": [
        "1 cu yd = 27 cu ft; a yard is 3 ft and 3^3 = 27"
      ],
      "vectors": [
        {
          "name": "5 cu yd converts correctly",
          "inputs": {
            "cubicYards": 5
          },
          "expected": 135,
          "toleranceDecimalPlaces": 6,
          "unit": "cu ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 27,
              "unit": "cu ft per cu yd"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 50
          },
          "expected": 1350,
          "toleranceDecimalPlaces": 6,
          "unit": "cu ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 27,
              "unit": "cu ft per cu yd"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cubic-yards-to-cubic-meters-calculator",
      "title": "Cubic Yards to Cubic Metres Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/cubic-yards-to-cubic-meters-calculator/",
      "sources": [
        "1 yd = 0.9144 m exactly, so 1 cu yd = 0.9144^3 = 0.764554857984 m^3"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 7.64554857984,
          "toleranceDecimalPlaces": 6,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.764554857984,
              "unit": "m³ per cu yd"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 76.4554857984,
          "toleranceDecimalPlaces": 6,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.764554857984,
              "unit": "m³ per cu yd"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "culvert-deflection-calculator",
      "title": "Flexible Culvert Pipe Deflection Calculator (Iowa/Modified Spangler Formula)",
      "url": "https://craftquantities.com/calculators/heavy-civil/culvert-deflection-calculator/",
      "sources": [
        "Modified Iowa Formula (Spangler 1941, Watkins & Spangler 1958): Δx = (Dl×K×W×r³)/(E×I + 0.061×E'×r³), where Dl is the deflection lag factor (typically 1.0-1.5), K is the bedding constant (typically ~0.10 for standard bedding), W is the load per unit pipe length, r is the mean pipe radius, EI is the pipe wall stiffness per unit length, and E' is the modulus of soil reaction — a well-established formula per AASHTO LRFD and state DOT culvert design manuals"
      ],
      "vectors": [
        {
          "name": "300mm radius pipe, EI=5,000,000, E'=7 (pass)",
          "inputs": {
            "deflectionLagFactor": 1.5,
            "beddingConstant": 0.1,
            "loadPerLength": 50,
            "pipeRadius": 0.3,
            "pipeStiffness": 5000000,
            "soilReactionModulus": 7000000
          },
          "expected": 12.25,
          "toleranceDecimalPlaces": 1,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Allowable deflection (5% of diameter, AASHTO)",
              "value": 30,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "450mm radius pipe, EI=8,000,000, E'=10 (pass)",
          "inputs": {
            "deflectionLagFactor": 1.5,
            "beddingConstant": 0.1,
            "loadPerLength": 70,
            "pipeRadius": 0.45,
            "pipeStiffness": 8000000,
            "soilReactionModulus": 10000000
          },
          "expected": 15.05,
          "toleranceDecimalPlaces": 1,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Allowable deflection (5% of diameter, AASHTO)",
              "value": 45,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "culvert-pipe-length-calculator",
      "title": "Culvert Pipe Length Calculator",
      "url": "https://craftquantities.com/calculators/heavy-civil/culvert-pipe-length-calculator/",
      "sources": [
        "Total pipe length = roadway width + 2 × end treatment length, accounting for the pipe extending beyond the roadway width to accommodate headwalls or end sections at each end"
      ],
      "vectors": [
        {
          "name": "12m roadway, 1.5m end treatment",
          "inputs": {
            "roadwayWidth": 12,
            "endTreatmentLength": 1.5
          },
          "expected": 15,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15m roadway, 2m end treatment",
          "inputs": {
            "roadwayWidth": 15,
            "endTreatmentLength": 2
          },
          "expected": 19,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "curb-gutter-volume-calculator",
      "title": "Concrete Curb and Gutter Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/curb-gutter-volume-calculator/",
      "sources": [
        "Combined cross-sectional area = (curb height × curb width) + (gutter width × gutter thickness); volume = run length × combined cross-sectional area"
      ],
      "vectors": [
        {
          "name": "50m run, 0.15x0.15 curb, 0.6x0.15 gutter",
          "inputs": {
            "runLength": 50,
            "curbHeight": 0.15,
            "curbWidth": 0.15,
            "gutterWidth": 0.6,
            "gutterThickness": 0.15
          },
          "expected": 5.625,
          "toleranceDecimalPlaces": 3,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Combined cross-sectional area",
              "value": 0.11249999999999999,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "75m run, 0.18x0.15 curb, 0.45x0.15 gutter",
          "inputs": {
            "runLength": 75,
            "curbHeight": 0.18,
            "curbWidth": 0.15,
            "gutterWidth": 0.45,
            "gutterThickness": 0.15
          },
          "expected": 7.0875,
          "toleranceDecimalPlaces": 4,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Combined cross-sectional area",
              "value": 0.0945,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "curing-compound-coverage-calculator",
      "title": "Concrete Curing Compound Coverage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/curing-compound-coverage-calculator/",
      "sources": [
        "Coverage rate is set by the specific curing compound product's technical data sheet — this calculator applies that rate to the slab's surface area"
      ],
      "vectors": [
        {
          "name": "200m² area, 5 m²/L",
          "inputs": {
            "surfaceArea": 200,
            "coverageRateM2PerLiter": 5
          },
          "expected": 40,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in gallons",
              "value": 10.566882094325937,
              "unit": "gal"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "350m² area, 4 m²/L",
          "inputs": {
            "surfaceArea": 350,
            "coverageRateM2PerLiter": 4
          },
          "expected": 87.5,
          "toleranceDecimalPlaces": 1,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in gallons",
              "value": 23.11505458133799,
              "unit": "gal"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "curtain-wall-anchor-bracket-calculator",
      "title": "Curtain Wall Anchor Bracket Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/curtain-wall-anchor-bracket-calculator/",
      "sources": [
        "Anchor bracket count = ceil(perimeter run length ÷ bracket spacing) + 1, the standard layout method for spacing repetitive structural attachment points"
      ],
      "vectors": [
        {
          "name": "40m run, 1.5m spacing",
          "inputs": {
            "runLength": 40,
            "bracketSpacing": 1.5
          },
          "expected": 28,
          "toleranceDecimalPlaces": 0,
          "unit": "brackets",
          "confidence": "high",
          "steps": [
            {
              "label": "Bays along the run",
              "value": 27
            },
            {
              "label": "Bracket centres, as fixed",
              "value": 1.4814814814814814,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "55m run, 1.2m spacing",
          "inputs": {
            "runLength": 55,
            "bracketSpacing": 1.2
          },
          "expected": 47,
          "toleranceDecimalPlaces": 0,
          "unit": "brackets",
          "confidence": "high",
          "steps": [
            {
              "label": "Bays along the run",
              "value": 46
            },
            {
              "label": "Bracket centres, as fixed",
              "value": 1.1956521739130435,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "curtain-wall-condensation-checker",
      "title": "Curtain Wall Spandrel Condensation Risk Checker",
      "url": "https://craftquantities.com/calculators/materials-quantities/curtain-wall-condensation-checker/",
      "sources": [
        "Steady-state condensation risk check per AAMA 1503/NFRC 500 methodology: interior surface temperature Ts = Ti − U×(Ti−To)/hi, where Ti/To are interior/exterior design temperatures, U is the assembly's overall U-factor, and hi is the interior air film coefficient (commonly 8 W/m²K); condensation risk exists if Ts falls below the interior air's dew point"
      ],
      "vectors": [
        {
          "name": "Ti=21, To=-10, U=1.8, hi=8, dew=10 (pass)",
          "inputs": {
            "interiorTemp": 21,
            "exteriorTemp": -10,
            "uFactor": 1.8,
            "interiorFilmCoefficient": 8,
            "dewPoint": 10
          },
          "expected": 14.03,
          "toleranceDecimalPlaces": 1,
          "unit": "°C",
          "confidence": "medium",
          "steps": [
            {
              "label": "Interior air dew point",
              "value": 10,
              "unit": "°C"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ti=21, To=-20, U=2.5, hi=8, dew=12 (fail)",
          "inputs": {
            "interiorTemp": 21,
            "exteriorTemp": -20,
            "uFactor": 2.5,
            "interiorFilmCoefficient": 8,
            "dewPoint": 12
          },
          "expected": 8.19,
          "toleranceDecimalPlaces": 1,
          "unit": "°C",
          "confidence": "medium",
          "steps": [
            {
              "label": "Interior air dew point",
              "value": 12,
              "unit": "°C"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "curtain-wall-mullion-load-calculator",
      "title": "Curtain Wall Mullion Tributary Dead Load Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/curtain-wall-mullion-load-calculator/",
      "sources": [
        "Mullion tributary dead load = tributary width × tributary height × glass weight per unit area, the standard tributary-area method for assigning distributed load to a supporting structural member"
      ],
      "vectors": [
        {
          "name": "1.5m x 3m tributary, 25kg/m²",
          "inputs": {
            "tributaryWidth": 1.5,
            "tributaryHeight": 3,
            "glassWeightPerArea": 25
          },
          "expected": 112.5,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1.2m x 3.5m tributary, 30kg/m²",
          "inputs": {
            "tributaryWidth": 1.2,
            "tributaryHeight": 3.5,
            "glassWeightPerArea": 30
          },
          "expected": 126,
          "toleranceDecimalPlaces": 0,
          "unit": "kg",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "curtain-wall-panel-count-calculator",
      "title": "Curtain Wall Panel Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/curtain-wall-panel-count-calculator/",
      "sources": [
        "Panel count = ceil(total facade area ÷ single panel area), the standard method for estimating unitized curtain wall panel quantities"
      ],
      "vectors": [
        {
          "name": "500m² facade, 6m² panel",
          "inputs": {
            "facadeArea": 500,
            "panelArea": 6
          },
          "expected": 84,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "800m² facade, 7.5m² panel",
          "inputs": {
            "facadeArea": 800,
            "panelArea": 7.5
          },
          "expected": 107,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "curved-bullnose-segment-calculator",
      "title": "Curved Wall Bullnose Corner Bead Segment Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/curved-bullnose-segment-calculator/",
      "sources": [
        "Arc length = radius × angle (in radians); segments needed = ceil(arc length ÷ maximum practical segment length for a rigid bullnose bead)"
      ],
      "vectors": [
        {
          "name": "3m radius, 90°, 0.6m max segment",
          "inputs": {
            "curveRadius": 3,
            "curveAngle": 90,
            "maxSegmentLength": 0.6
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "segments",
          "confidence": "high",
          "steps": [
            {
              "label": "Total arc length",
              "value": 4.71238898038469,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2m radius, 180°, 0.5m max segment",
          "inputs": {
            "curveRadius": 2,
            "curveAngle": 180,
            "maxSegmentLength": 0.5
          },
          "expected": 13,
          "toleranceDecimalPlaces": 0,
          "unit": "segments",
          "confidence": "high",
          "steps": [
            {
              "label": "Total arc length",
              "value": 6.283185307179586,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "curved-wall-stud-layout-calculator",
      "title": "Curved/Radius Wall Framing Stud Layout Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/curved-wall-stud-layout-calculator/",
      "sources": [
        "Arc length = Wall Radius × Arc Angle (in radians); Stud count = ceil(Arc Length ÷ Stud Spacing) + 1 — the standard method for laying out framing members along a curved wall's arc length, analogous to straight-wall stud spacing but using arc length instead of chord length."
      ],
      "vectors": [
        {
          "name": "3m radius, 90° arc, 0.4m spacing",
          "inputs": {
            "wallRadius": 3,
            "wallArcAngle": 90,
            "studSpacing": 0.4
          },
          "expected": 13,
          "toleranceDecimalPlaces": 0,
          "unit": "studs",
          "confidence": "high",
          "steps": [
            {
              "label": "Arc length",
              "value": 4.71238898038469,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "4m radius, 120° arc, 0.3m spacing",
          "inputs": {
            "wallRadius": 4,
            "wallArcAngle": 120,
            "studSpacing": 0.3
          },
          "expected": 29,
          "toleranceDecimalPlaces": 0,
          "unit": "studs",
          "confidence": "high",
          "steps": [
            {
              "label": "Arc length",
              "value": 8.377580409572781,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "cut-fill-earthwork-balance-calculator",
      "title": "Slope Cut-and-Fill Earthwork Balance Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/cut-fill-earthwork-balance-calculator/",
      "sources": [
        "Standard earthwork balance: cut volume (bank/in-situ measure) converts to a smaller compacted fill volume via a shrinkage factor; comparing that to the required fill volume gives a net surplus (haul off-site) or deficit (import fill)"
      ],
      "vectors": [
        {
          "name": "1000m³ cut, 800m³ fill, -10% shrinkage (surplus)",
          "inputs": {
            "cutVolume": 1000,
            "fillVolume": 800,
            "shrinkageFactorPercent": -10
          },
          "expected": 100,
          "toleranceDecimalPlaces": 0,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cut volume as compacted fill",
              "value": 900,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "500m³ cut, 700m³ fill, -12% shrinkage (deficit)",
          "inputs": {
            "cutVolume": 500,
            "fillVolume": 700,
            "shrinkageFactorPercent": -12
          },
          "expected": -260,
          "toleranceDecimalPlaces": 0,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cut volume as compacted fill",
              "value": 440,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "daily-noise-exposure-calculator",
      "title": "Daily Noise Exposure (LEP,d) Calculator",
      "url": "https://craftquantities.com/calculators/sustainability-compliance/daily-noise-exposure-calculator/",
      "sources": [
        "ISO 9612:2009 and HSE L108 (Controlling noise at work): the daily personal noise exposure LEP,d = 10 log10[(1/T0) × Σ Tm × 10^(0.1 × LAeq,m)], where each task m lasts Tm hours at an equivalent continuous A-weighted level LAeq,m and T0 is the 8-hour reference day",
        "Control of Noise at Work Regulations 2005, regulation 4, and Directive 2003/10/EC, Article 3: lower exposure action values 80 dB(A) LEP,d and 135 dB(C) peak; upper exposure action values 85 dB(A) and 137 dB(C); exposure limit values 87 dB(A) and 140 dB(C), the limit values alone taking account of the hearing protection worn",
        "Work Health and Safety Regulations 2011 (Australia), regulation 56: the exposure standard for noise is an LAeq,8h of 85 dB(A) or a peak of 140 dB(C)",
        "HSE noise exposure points, as used in the ready-reckoner in L108: a task scores (Tm ÷ 8 hours) × 10^((LAeq,m − 85) ÷ 10) × 100 points, so 100 points is an LEP,d of 85 dB(A) and 32 points is 80 dB(A)"
      ],
      "vectors": [
        {
          "name": "One task at 85 dB(A) for the whole 8-hour reference day is exactly 85",
          "inputs": {
            "taskLevel1": 85,
            "taskHours1": 8,
            "taskLevel2": 82,
            "taskHours2": 0,
            "taskLevel3": 95,
            "taskHours3": 0,
            "taskLevel4": 75,
            "taskHours4": 0,
            "comparison": "uk-eu",
            "customValue": 85
          },
          "expected": 85,
          "toleranceDecimalPlaces": 2,
          "unit": "dB(A)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Exposure points (HSE scale: 100 is 85 dB(A), 32 is 80 dB(A))",
              "value": 100,
              "unit": "points"
            },
            {
              "label": "Time the tasks add up to",
              "value": 8,
              "unit": "hours"
            },
            {
              "label": "Task 1's share of the day's noise energy",
              "value": 100,
              "unit": "%"
            },
            {
              "label": "Time at the loudest level, 85.0 dB(A), that reaches 85 dB(A) on its own",
              "value": 8,
              "unit": "hours"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Four hours at 88 and four at 82 energy-average to 86.0, not the arithmetic 85",
          "inputs": {
            "taskLevel1": 88,
            "taskHours1": 4,
            "taskLevel2": 82,
            "taskHours2": 4,
            "taskLevel3": 95,
            "taskHours3": 0,
            "taskLevel4": 75,
            "taskHours4": 0,
            "comparison": "uk-eu",
            "customValue": 85
          },
          "expected": 85.962928,
          "toleranceDecimalPlaces": 2,
          "unit": "dB(A)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Exposure points (HSE scale: 100 is 85 dB(A), 32 is 80 dB(A))",
              "value": 124.82247742980759,
              "unit": "points"
            },
            {
              "label": "Time the tasks add up to",
              "value": 8,
              "unit": "hours"
            },
            {
              "label": "Task 1's share of the day's noise energy",
              "value": 79.92399910868987,
              "unit": "%"
            },
            {
              "label": "Task 2's share of the day's noise energy",
              "value": 20.07600089131012,
              "unit": "%"
            },
            {
              "label": "Time at the loudest level, 88.0 dB(A), that reaches 85 dB(A) on its own",
              "value": 4.009497869018178,
              "unit": "hours"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The defaults — three hours at 88, four at 82 and half an hour at 95 — make 87.1",
          "inputs": {
            "taskLevel1": 88,
            "taskHours1": 3,
            "taskLevel2": 82,
            "taskHours2": 4,
            "taskLevel3": 95,
            "taskHours3": 0.5,
            "taskLevel4": 75,
            "taskHours4": 0,
            "comparison": "uk-eu",
            "customValue": 85
          },
          "expected": 87.105371,
          "toleranceDecimalPlaces": 2,
          "unit": "dB(A)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Exposure points (HSE scale: 100 is 85 dB(A), 32 is 80 dB(A))",
              "value": 162.3816984926966,
              "unit": "points"
            },
            {
              "label": "Time the tasks add up to",
              "value": 7.5,
              "unit": "hours"
            },
            {
              "label": "Task 1's share of the day's noise energy",
              "value": 46.078060216064515,
              "unit": "%"
            },
            {
              "label": "Task 2's share of the day's noise energy",
              "value": 15.432380566268462,
              "unit": "%"
            },
            {
              "label": "Task 3's share of the day's noise energy",
              "value": 38.489559217667015,
              "unit": "%"
            },
            {
              "label": "Time at the loudest level, 95.0 dB(A), that reaches 85 dB(A) on its own",
              "value": 0.8,
              "unit": "hours"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "One hour at 94 dB(A) is the same dose as a whole day at 85 — nine decibels is eight times the energy",
          "inputs": {
            "taskLevel1": 94,
            "taskHours1": 1,
            "taskLevel2": 82,
            "taskHours2": 0,
            "taskLevel3": 95,
            "taskHours3": 0,
            "taskLevel4": 75,
            "taskHours4": 0,
            "comparison": "australia",
            "customValue": 85
          },
          "expected": 84.9691,
          "toleranceDecimalPlaces": 2,
          "unit": "dB(A)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Exposure points (HSE scale: 100 is 85 dB(A), 32 is 80 dB(A))",
              "value": 99.2910293405352,
              "unit": "points"
            },
            {
              "label": "Time the tasks add up to",
              "value": 1,
              "unit": "hours"
            },
            {
              "label": "Task 1's share of the day's noise energy",
              "value": 100,
              "unit": "%"
            },
            {
              "label": "Time at the loudest level, 94.0 dB(A), that reaches 85 dB(A) on its own",
              "value": 1.0071403294353338,
              "unit": "hours"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A 12-hour shift at a steady 85 dB(A) counts as 86.8 against the 8-hour day",
          "inputs": {
            "taskLevel1": 85,
            "taskHours1": 12,
            "taskLevel2": 82,
            "taskHours2": 0,
            "taskLevel3": 95,
            "taskHours3": 0,
            "taskLevel4": 75,
            "taskHours4": 0,
            "comparison": "custom",
            "customValue": 82
          },
          "expected": 86.760913,
          "toleranceDecimalPlaces": 2,
          "unit": "dB(A)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Exposure points (HSE scale: 100 is 85 dB(A), 32 is 80 dB(A))",
              "value": 150,
              "unit": "points"
            },
            {
              "label": "Time the tasks add up to",
              "value": 12,
              "unit": "hours"
            },
            {
              "label": "Task 1's share of the day's noise energy",
              "value": 100,
              "unit": "%"
            },
            {
              "label": "Time at the loudest level, 85.0 dB(A), that reaches 85 dB(A) on its own",
              "value": 8,
              "unit": "hours"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "darcys-law-seepage-calculator",
      "title": "Darcy's Law Seepage Flow Rate Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/darcys-law-seepage-calculator/",
      "sources": [
        "Darcy's Law: Q = k x i x A, where Q is flow rate, k is hydraulic conductivity, i is the hydraulic gradient, and A is the cross-sectional flow area"
      ],
      "vectors": [
        {
          "name": "k=0.0001 m/s, i=0.05, A=10m²",
          "inputs": {
            "hydraulicConductivity": 0.0001,
            "hydraulicGradient": 0.05,
            "flowArea": 10
          },
          "expected": 0.05,
          "toleranceDecimalPlaces": 3,
          "unit": "L/s",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in m³/day",
              "value": 4.32,
              "unit": "m³/day"
            },
            {
              "label": "Equivalent in m³/year",
              "value": 1576.8000000000002,
              "unit": "m³/year"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "k=0.0005 m/s, i=0.02, A=20m²",
          "inputs": {
            "hydraulicConductivity": 0.0005,
            "hydraulicGradient": 0.02,
            "flowArea": 20
          },
          "expected": 0.2,
          "toleranceDecimalPlaces": 2,
          "unit": "L/s",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in m³/day",
              "value": 17.28,
              "unit": "m³/day"
            },
            {
              "label": "Equivalent in m³/year",
              "value": 6307.200000000001,
              "unit": "m³/year"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "debris-chute-bracket-spacing-calculator",
      "title": "Debris Chute Support Bracket Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/debris-chute-bracket-spacing-calculator/",
      "sources": [
        "Number of brackets = ceil(Chute Run Length ÷ Maximum Bracket Spacing) + 1. OSHA 29 CFR 1926.852 requires debris chutes to be securely supported and resist impact failure as a performance standard, but per OSHA's own standard interpretation, it publishes no specific bracket spacing table or formula — the maximum spacing must come from the specific chute manufacturer's installation instructions."
      ],
      "vectors": [
        {
          "name": "30m run, 4m max spacing",
          "inputs": {
            "chuteLength": 30,
            "maxBracketSpacing": 4
          },
          "expected": 9,
          "toleranceDecimalPlaces": 0,
          "unit": "brackets",
          "confidence": "medium",
          "steps": [
            {
              "label": "Bays down the chute",
              "value": 8
            },
            {
              "label": "Bracket centres down the chute",
              "value": 3.75,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "45m run, 5m max spacing",
          "inputs": {
            "chuteLength": 45,
            "maxBracketSpacing": 5
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "brackets",
          "confidence": "medium",
          "steps": [
            {
              "label": "Bays down the chute",
              "value": 9
            },
            {
              "label": "Bracket centres down the chute",
              "value": 5,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "debris-chute-impact-energy-calculator",
      "title": "High-Rise Debris Drop Chute Impact Energy Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/debris-chute-impact-energy-calculator/",
      "sources": [
        "Kinetic energy at impact ≈ mass × gravity (9.81 m/s²) × drop height (energy conservation, ignoring chute friction as a conservative/worst-case simplification — this is the same basic approach used in industry dropped-object risk screening tools such as the DROPS Calculator). Average impact force = Impact Energy ÷ Stopping/Cushioning Distance (work-energy theorem). OSHA 29 CFR 1926.852 requires debris chutes to be 'designed and constructed of such strength as to eliminate failure due to impact of materials or debris loaded therein' as a performance standard, but per OSHA's own 1992 standard interpretation letter, OSHA publishes no specific formula, load table, or approved design for meeting that standard."
      ],
      "vectors": [
        {
          "name": "20 kg item, 30 m drop, 0.5 m stopping distance",
          "inputs": {
            "debrisMass": 20,
            "dropHeight": 30,
            "stoppingDistance": 0.5
          },
          "expected": 11772,
          "toleranceDecimalPlaces": -1,
          "unit": "N",
          "confidence": "low",
          "steps": [
            {
              "label": "Impact energy (free-fall, no friction)",
              "value": 5886.000000000001,
              "unit": "J"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "50 kg item, 45 m drop, 1.0 m stopping distance",
          "inputs": {
            "debrisMass": 50,
            "dropHeight": 45,
            "stoppingDistance": 1
          },
          "expected": 22072.5,
          "toleranceDecimalPlaces": -1,
          "unit": "N",
          "confidence": "low",
          "steps": [
            {
              "label": "Impact energy (free-fall, no friction)",
              "value": 22072.5,
              "unit": "J"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "debris-staging-clearance-calculator",
      "title": "Debris Staging/Laydown Area Clearance Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/debris-staging-clearance-calculator/",
      "sources": [
        "Total footprint = (Pile Width + 2 × Setback) × (Pile Length + 2 × Setback), applying the required clearance evenly around the pile's footprint — the same standard clearance-footprint method used elsewhere on this site (e.g. HVAC equipment pad clearance). The required setback distance itself should come from the applicable local fire code, site safety plan, or property line/structure setback requirement for combustible or bulk debris storage, which varies by jurisdiction and material type."
      ],
      "vectors": [
        {
          "name": "6m x 10m pile, 3m setback",
          "inputs": {
            "pileWidth": 6,
            "pileLength": 10,
            "requiredSetback": 3
          },
          "expected": 192,
          "toleranceDecimalPlaces": 0,
          "unit": "m²",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "8m x 12m pile, 4.5m setback",
          "inputs": {
            "pileWidth": 8,
            "pileLength": 12,
            "requiredSetback": 4.5
          },
          "expected": 357,
          "toleranceDecimalPlaces": 0,
          "unit": "m²",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "debris-weight-volume-conversion-calculator",
      "title": "Demolition Debris Weight-to-Volume Conversion Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/debris-weight-volume-conversion-calculator/",
      "sources": [
        "Estimated weight (tons) = (Volume × Density) ÷ 2000, where density (lb per cubic yard) is material-specific — mixed construction & demolition debris density commonly ranges roughly 300-800 lb/yd³ depending on material mix, with concrete/masonry-heavy loads running much higher. This calculator applies the density you supply for your specific debris mix rather than assuming a single universal value."
      ],
      "vectors": [
        {
          "name": "20 yd³ at 600 lb/yd³",
          "inputs": {
            "debrisVolume": 15291.0972,
            "density": 355.9659
          },
          "expected": 6,
          "toleranceDecimalPlaces": 3,
          "unit": "tons",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30 yd³ at 800 lb/yd³",
          "inputs": {
            "debrisVolume": 22936.6457,
            "density": 474.6211
          },
          "expected": 12,
          "toleranceDecimalPlaces": 3,
          "unit": "tons",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "decibel-addition-calculator",
      "title": "Decibel Addition and Background Correction Calculator",
      "url": "https://craftquantities.com/calculators/sustainability-compliance/decibel-addition-calculator/",
      "sources": [
        "Sound levels combine on energy: L = 10 log10(10^(L1 ÷ 10) + 10^(L2 ÷ 10) + … + 10^(Ln ÷ 10)), so two equal levels are 3.01 dB above either and a level 10 dB below another adds 0.41 dB to it",
        "The residual-sound correction used in ISO 1996-2 and BS 4142: the source alone is Ls = 10 log10(10^(Lt ÷ 10) − 10^(Lb ÷ 10)), the same energy arithmetic in reverse, which depends on the background being measured at the same position with the source off"
      ],
      "vectors": [
        {
          "name": "Two sources at 85 dB make 88.0 — double the energy is 3 dB, not twice the decibels",
          "inputs": {
            "mode": "add",
            "level1": 85,
            "level2": 85,
            "level3": 0,
            "level4": 0,
            "level5": 0,
            "level6": 0,
            "total": 88,
            "background": 82
          },
          "expected": 88.0103,
          "toleranceDecimalPlaces": 2,
          "unit": "dB (combined)",
          "confidence": "high",
          "steps": [
            {
              "label": "Level 1's share of the total energy",
              "value": 50,
              "unit": "%"
            },
            {
              "label": "Level 2's share of the total energy",
              "value": 50,
              "unit": "%"
            },
            {
              "label": "Rise over the loudest single level",
              "value": 3.0102999566398125,
              "unit": "dB"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The defaults — 85, 82 and 79 dB — combine to 87.4",
          "inputs": {
            "mode": "add",
            "level1": 85,
            "level2": 82,
            "level3": 79,
            "level4": 0,
            "level5": 0,
            "level6": 0,
            "total": 88,
            "background": 82
          },
          "expected": 87.436273,
          "toleranceDecimalPlaces": 2,
          "unit": "dB (combined)",
          "confidence": "high",
          "steps": [
            {
              "label": "Level 1's share of the total energy",
              "value": 57.065382675691446,
              "unit": "%"
            },
            {
              "label": "Level 2's share of the total energy",
              "value": 28.600441279111415,
              "unit": "%"
            },
            {
              "label": "Level 3's share of the total energy",
              "value": 14.33417604519713,
              "unit": "%"
            },
            {
              "label": "Rise over the loudest single level",
              "value": 2.4362726604562113,
              "unit": "dB"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A source 10 dB quieter adds only 0.4 dB: 90 and 80 make 90.4",
          "inputs": {
            "mode": "add",
            "level1": 90,
            "level2": 80,
            "level3": 0,
            "level4": 0,
            "level5": 0,
            "level6": 0,
            "total": 88,
            "background": 82
          },
          "expected": 90.413927,
          "toleranceDecimalPlaces": 2,
          "unit": "dB (combined)",
          "confidence": "high",
          "steps": [
            {
              "label": "Level 1's share of the total energy",
              "value": 90.9090909090909,
              "unit": "%"
            },
            {
              "label": "Level 2's share of the total energy",
              "value": 9.090909090909092,
              "unit": "%"
            },
            {
              "label": "Rise over the loudest single level",
              "value": 0.4139268515822607,
              "unit": "dB"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "88 dB measured over an 82 dB background — the source alone is 86.7",
          "inputs": {
            "mode": "subtract",
            "level1": 85,
            "level2": 82,
            "level3": 79,
            "level4": 0,
            "level5": 0,
            "level6": 0,
            "total": 88,
            "background": 82
          },
          "expected": 86.743724,
          "toleranceDecimalPlaces": 2,
          "unit": "dB (source alone)",
          "confidence": "high",
          "steps": [
            {
              "label": "Correction taken off the total",
              "value": 1.2562757749181372,
              "unit": "dB"
            },
            {
              "label": "Total minus background",
              "value": 6,
              "unit": "dB"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "decimal-inches-to-fraction-calculator",
      "title": "Decimal Inches to Fraction Calculator (and Fraction to Decimal)",
      "url": "https://craftquantities.com/calculators/measurements-conversions/decimal-inches-to-fraction-calculator/",
      "sources": [
        "NIST Handbook 44 (2026 edition), Section 5.52 Linear Measures, S.1: a linear measure may be subdivided in inches and binary submultiples of the inch — the halves, quarters, eighths, sixteenths, thirty-seconds and sixty-fourths offered here",
        "NIST Handbook 44 (2026 edition), Appendix C, General Tables of Units of Measurement: 1 inch = 2.54 centimetres exactly and 12 inches = 1 foot, per the Federal Register of 1 July 1959 (24 FR 5348)"
      ],
      "vectors": [
        {
          "name": "5.83 in is 5 13/16 in to the nearest sixteenth",
          "inputs": {
            "direction": "toFraction",
            "decimalInches": 5.83,
            "precision": "16",
            "wholeInches": 5,
            "numerator": 13,
            "denominator": "16"
          },
          "expected": 5.8125,
          "toleranceDecimalPlaces": 6,
          "unit": "in (5 13/16 in)",
          "confidence": "high",
          "steps": [
            {
              "label": "Nearest 1/8 in",
              "value": 5.875,
              "unit": "in (5 7/8 in)"
            },
            {
              "label": "Nearest 1/16 in",
              "value": 5.8125,
              "unit": "in (5 13/16 in)"
            },
            {
              "label": "Nearest 1/32 in",
              "value": 5.84375,
              "unit": "in (5 27/32 in)"
            },
            {
              "label": "Nearest 1/64 in",
              "value": 5.828125,
              "unit": "in (5 53/64 in)"
            },
            {
              "label": "Chosen mark minus the figure entered, in millimetres",
              "value": -0.4445000000000018,
              "unit": "mm"
            },
            {
              "label": "Figure entered, in millimetres",
              "value": 148.082,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "5.83 in is 5 7/8 in to the nearest eighth",
          "inputs": {
            "direction": "toFraction",
            "decimalInches": 5.83,
            "precision": "8",
            "wholeInches": 5,
            "numerator": 13,
            "denominator": "16"
          },
          "expected": 5.875,
          "toleranceDecimalPlaces": 6,
          "unit": "in (5 7/8 in)",
          "confidence": "high",
          "steps": [
            {
              "label": "Nearest 1/8 in",
              "value": 5.875,
              "unit": "in (5 7/8 in)"
            },
            {
              "label": "Nearest 1/16 in",
              "value": 5.8125,
              "unit": "in (5 13/16 in)"
            },
            {
              "label": "Nearest 1/32 in",
              "value": 5.84375,
              "unit": "in (5 27/32 in)"
            },
            {
              "label": "Nearest 1/64 in",
              "value": 5.828125,
              "unit": "in (5 53/64 in)"
            },
            {
              "label": "Chosen mark minus the figure entered, in millimetres",
              "value": 1.1429999999999982,
              "unit": "mm"
            },
            {
              "label": "Figure entered, in millimetres",
              "value": 148.082,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "0.97 in rounds up to a whole inch at sixteenths",
          "inputs": {
            "direction": "toFraction",
            "decimalInches": 0.97,
            "precision": "16",
            "wholeInches": 5,
            "numerator": 13,
            "denominator": "16"
          },
          "expected": 1,
          "toleranceDecimalPlaces": 6,
          "unit": "in",
          "confidence": "high",
          "steps": [
            {
              "label": "Nearest 1/8 in",
              "value": 1,
              "unit": "in"
            },
            {
              "label": "Nearest 1/16 in",
              "value": 1,
              "unit": "in"
            },
            {
              "label": "Nearest 1/32 in",
              "value": 0.96875,
              "unit": "in (31/32 in)"
            },
            {
              "label": "Nearest 1/64 in",
              "value": 0.96875,
              "unit": "in (31/32 in)"
            },
            {
              "label": "Chosen mark minus the figure entered, in millimetres",
              "value": 0.7620000000000007,
              "unit": "mm"
            },
            {
              "label": "Figure entered, in millimetres",
              "value": 24.637999999999998,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "5.83 in is 5 27/32 in to the nearest thirty-second",
          "inputs": {
            "direction": "toFraction",
            "decimalInches": 5.83,
            "precision": "32",
            "wholeInches": 5,
            "numerator": 13,
            "denominator": "16"
          },
          "expected": 5.84375,
          "toleranceDecimalPlaces": 6,
          "unit": "in (5 27/32 in)",
          "confidence": "high",
          "steps": [
            {
              "label": "Nearest 1/8 in",
              "value": 5.875,
              "unit": "in (5 7/8 in)"
            },
            {
              "label": "Nearest 1/16 in",
              "value": 5.8125,
              "unit": "in (5 13/16 in)"
            },
            {
              "label": "Nearest 1/32 in",
              "value": 5.84375,
              "unit": "in (5 27/32 in)"
            },
            {
              "label": "Nearest 1/64 in",
              "value": 5.828125,
              "unit": "in (5 53/64 in)"
            },
            {
              "label": "Chosen mark minus the figure entered, in millimetres",
              "value": 0.3492499999999982,
              "unit": "mm"
            },
            {
              "label": "Figure entered, in millimetres",
              "value": 148.082,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "5.83 in is 5 53/64 in to the nearest sixty-fourth",
          "inputs": {
            "direction": "toFraction",
            "decimalInches": 5.83,
            "precision": "64",
            "wholeInches": 5,
            "numerator": 13,
            "denominator": "16"
          },
          "expected": 5.828125,
          "toleranceDecimalPlaces": 6,
          "unit": "in (5 53/64 in)",
          "confidence": "high",
          "steps": [
            {
              "label": "Nearest 1/8 in",
              "value": 5.875,
              "unit": "in (5 7/8 in)"
            },
            {
              "label": "Nearest 1/16 in",
              "value": 5.8125,
              "unit": "in (5 13/16 in)"
            },
            {
              "label": "Nearest 1/32 in",
              "value": 5.84375,
              "unit": "in (5 27/32 in)"
            },
            {
              "label": "Nearest 1/64 in",
              "value": 5.828125,
              "unit": "in (5 53/64 in)"
            },
            {
              "label": "Chosen mark minus the figure entered, in millimetres",
              "value": -0.047625000000001805,
              "unit": "mm"
            },
            {
              "label": "Figure entered, in millimetres",
              "value": 148.082,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "5 13/16 in is 5.8125 in",
          "inputs": {
            "direction": "toDecimal",
            "decimalInches": 5.83,
            "precision": "16",
            "wholeInches": 5,
            "numerator": 13,
            "denominator": "16"
          },
          "expected": 5.8125,
          "toleranceDecimalPlaces": 8,
          "unit": "in (5 13/16 in)",
          "confidence": "high",
          "steps": [
            {
              "label": "Millimetres",
              "value": 147.6375,
              "unit": "mm"
            },
            {
              "label": "Decimal feet",
              "value": 0.484375,
              "unit": "ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "27/64 in is 0.421875 in",
          "inputs": {
            "direction": "toDecimal",
            "decimalInches": 5.83,
            "precision": "16",
            "wholeInches": 0,
            "numerator": 27,
            "denominator": "64"
          },
          "expected": 0.421875,
          "toleranceDecimalPlaces": 8,
          "unit": "in (27/64 in)",
          "confidence": "high",
          "steps": [
            {
              "label": "Millimetres",
              "value": 10.715625,
              "unit": "mm"
            },
            {
              "label": "Decimal feet",
              "value": 0.03515625,
              "unit": "ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "3 1/2 in is 3.5 in, and 88.9 mm",
          "inputs": {
            "direction": "toDecimal",
            "decimalInches": 5.83,
            "precision": "16",
            "wholeInches": 3,
            "numerator": 1,
            "denominator": "2"
          },
          "expected": 3.5,
          "toleranceDecimalPlaces": 8,
          "unit": "in (3 1/2 in)",
          "confidence": "high",
          "steps": [
            {
              "label": "Millimetres",
              "value": 88.89999999999999,
              "unit": "mm"
            },
            {
              "label": "Decimal feet",
              "value": 0.2916666666666667,
              "unit": "ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "2 3/4 in is 2.75 in",
          "inputs": {
            "direction": "toDecimal",
            "decimalInches": 5.83,
            "precision": "16",
            "wholeInches": 2,
            "numerator": 3,
            "denominator": "4"
          },
          "expected": 2.75,
          "toleranceDecimalPlaces": 8,
          "unit": "in (2 3/4 in)",
          "confidence": "high",
          "steps": [
            {
              "label": "Millimetres",
              "value": 69.85,
              "unit": "mm"
            },
            {
              "label": "Decimal feet",
              "value": 0.22916666666666666,
              "unit": "ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "7/8 in is 0.875 in",
          "inputs": {
            "direction": "toDecimal",
            "decimalInches": 5.83,
            "precision": "16",
            "wholeInches": 0,
            "numerator": 7,
            "denominator": "8"
          },
          "expected": 0.875,
          "toleranceDecimalPlaces": 8,
          "unit": "in (7/8 in)",
          "confidence": "high",
          "steps": [
            {
              "label": "Millimetres",
              "value": 22.224999999999998,
              "unit": "mm"
            },
            {
              "label": "Decimal feet",
              "value": 0.07291666666666667,
              "unit": "ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1 5/32 in is 1.15625 in",
          "inputs": {
            "direction": "toDecimal",
            "decimalInches": 5.83,
            "precision": "16",
            "wholeInches": 1,
            "numerator": 5,
            "denominator": "32"
          },
          "expected": 1.15625,
          "toleranceDecimalPlaces": 8,
          "unit": "in (1 5/32 in)",
          "confidence": "high",
          "steps": [
            {
              "label": "Millimetres",
              "value": 29.36875,
              "unit": "mm"
            },
            {
              "label": "Decimal feet",
              "value": 0.09635416666666667,
              "unit": "ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A top number of 1.3 sixteenths counts one mark, 0.0625 in",
          "inputs": {
            "direction": "toDecimal",
            "decimalInches": 5.83,
            "precision": "16",
            "wholeInches": 0,
            "numerator": 1.3,
            "denominator": "16"
          },
          "expected": 0.0625,
          "toleranceDecimalPlaces": 8,
          "unit": "in (1/16 in)",
          "confidence": "high",
          "steps": [
            {
              "label": "Millimetres",
              "value": 1.5875,
              "unit": "mm"
            },
            {
              "label": "Decimal feet",
              "value": 0.005208333333333333,
              "unit": "ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "deck-board-calculator",
      "title": "Deck Board Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/deck-board-calculator/",
      "sources": [
        "A standard 5/4x6 deck board has an actual width of about 5.5 in; a 1/8-1/4 in gap between boards is standard for drainage and seasonal expansion"
      ],
      "vectors": [
        {
          "name": "6x4m deck, 12ft boards",
          "inputs": {
            "deckLength": 6,
            "deckWidth": 4,
            "boardLengthFt": 12
          },
          "expected": 56,
          "toleranceDecimalPlaces": 0,
          "unit": "boards",
          "confidence": "high",
          "steps": [
            {
              "label": "Deck area",
              "value": 258.33385000103334,
              "unit": "sq ft"
            },
            {
              "label": "Rows of boards (across width)",
              "value": 28,
              "unit": "rows"
            },
            {
              "label": "Boards per row (along length)",
              "value": 2,
              "unit": "boards"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "8x3m deck, 8ft boards",
          "inputs": {
            "deckLength": 8,
            "deckWidth": 3,
            "boardLengthFt": 8
          },
          "expected": 84,
          "toleranceDecimalPlaces": 0,
          "unit": "boards",
          "confidence": "high",
          "steps": [
            {
              "label": "Deck area",
              "value": 258.33385000103334,
              "unit": "sq ft"
            },
            {
              "label": "Rows of boards (across width)",
              "value": 21,
              "unit": "rows"
            },
            {
              "label": "Boards per row (along length)",
              "value": 4,
              "unit": "boards"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "deck-cost-calculator",
      "title": "Deck Cost Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/deck-cost-calculator/",
      "sources": [
        "Element-based estimating. Rates are user-supplied; no market data is embedded.",
        "Railing and stairs are priced per linear metre and per riser because their cost does not scale with deck area"
      ],
      "vectors": [
        {
          "name": "30 m² deck with all elements priced",
          "inputs": {
            "deckArea": 30,
            "areaRate": 180,
            "railingLength": 20,
            "railingRate": 120,
            "footingCount": 12,
            "footingRate": 95,
            "stairRisers": 4,
            "stairRate": 140,
            "contingencyPercent": 10
          },
          "expected": 10450,
          "toleranceDecimalPlaces": 2,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Deck surface",
              "value": 5400,
              "unit": "currency"
            },
            {
              "label": "Railing",
              "value": 2400,
              "unit": "currency"
            },
            {
              "label": "Footings",
              "value": 1140,
              "unit": "currency"
            },
            {
              "label": "Stairs",
              "value": 560,
              "unit": "currency"
            },
            {
              "label": "Contingency",
              "value": 950,
              "unit": "currency"
            },
            {
              "label": "Cost per m² of deck",
              "value": 348.3333333333333,
              "unit": "currency/m²"
            },
            {
              "label": "Railing share of the total",
              "value": 22.966507177033492,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Zero rates give zero cost",
          "inputs": {
            "deckArea": 30,
            "areaRate": 0,
            "railingLength": 20,
            "railingRate": 0,
            "footingCount": 12,
            "footingRate": 0,
            "stairRisers": 4,
            "stairRate": 0,
            "contingencyPercent": 10
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Deck surface",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Railing",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Footings",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Stairs",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Contingency",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Cost per m² of deck",
              "value": 0,
              "unit": "currency/m²"
            },
            {
              "label": "Railing share of the total",
              "value": 0,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "No contingency lowers the total",
          "inputs": {
            "deckArea": 30,
            "areaRate": 180,
            "railingLength": 20,
            "railingRate": 120,
            "footingCount": 12,
            "footingRate": 95,
            "stairRisers": 4,
            "stairRate": 140,
            "contingencyPercent": 0
          },
          "expected": 9500,
          "toleranceDecimalPlaces": 2,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Deck surface",
              "value": 5400,
              "unit": "currency"
            },
            {
              "label": "Railing",
              "value": 2400,
              "unit": "currency"
            },
            {
              "label": "Footings",
              "value": 1140,
              "unit": "currency"
            },
            {
              "label": "Stairs",
              "value": 560,
              "unit": "currency"
            },
            {
              "label": "Contingency",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Cost per m² of deck",
              "value": 316.6666666666667,
              "unit": "currency/m²"
            },
            {
              "label": "Railing share of the total",
              "value": 25.263157894736842,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Surface only, no railing or stairs",
          "inputs": {
            "deckArea": 30,
            "areaRate": 180,
            "railingLength": 0,
            "railingRate": 120,
            "footingCount": 0,
            "footingRate": 95,
            "stairRisers": 0,
            "stairRate": 140,
            "contingencyPercent": 10
          },
          "expected": 5940,
          "toleranceDecimalPlaces": 2,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Deck surface",
              "value": 5400,
              "unit": "currency"
            },
            {
              "label": "Railing",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Footings",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Stairs",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Contingency",
              "value": 540,
              "unit": "currency"
            },
            {
              "label": "Cost per m² of deck",
              "value": 198,
              "unit": "currency/m²"
            },
            {
              "label": "Railing share of the total",
              "value": 0,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "deck-footing-calculator",
      "title": "Deck Footing Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/deck-footing-calculator/",
      "sources": [
        "Footings per side = ceil(side length / spacing) + 1, summed over four sides less the four corners counted twice; 6-8 ft spacing is a commonly used residential deck framing guideline, though actual spacing depends on joist/beam size and species per local span tables"
      ],
      "vectors": [
        {
          "name": "4x3.5m deck, 8ft spacing",
          "inputs": {
            "deckLength": 4,
            "deckWidth": 3.5,
            "footingSpacingFt": "8"
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "footings (minimum)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Perimeter beam length",
              "value": 49.212598425196845,
              "unit": "linear ft"
            },
            {
              "label": "Footings along each long side",
              "value": 3,
              "unit": "footings"
            },
            {
              "label": "Footings along each short side",
              "value": 3,
              "unit": "footings"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "6x4m deck, 6ft spacing",
          "inputs": {
            "deckLength": 6,
            "deckWidth": 4,
            "footingSpacingFt": "6"
          },
          "expected": 14,
          "toleranceDecimalPlaces": 0,
          "unit": "footings (minimum)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Perimeter beam length",
              "value": 65.61679790026247,
              "unit": "linear ft"
            },
            {
              "label": "Footings along each long side",
              "value": 5,
              "unit": "footings"
            },
            {
              "label": "Footings along each short side",
              "value": 4,
              "unit": "footings"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "deck-joist-span-calculator",
      "title": "Deck Joist Span and Size Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/deck-joist-span-calculator/",
      "sources": [
        "ANSI/AWC NDS, National Design Specification for Wood Construction: allowable stress design for sawn lumber bending members, with reference design values and adjustment factors published in the NDS Supplement per species, grade and size",
        "Simple-span mechanics: bending moment M = wL²/8, required section modulus S = M/Fb′, and deflection Δ = 5wL⁴/(384EI) checked against the span divided by the deflection ratio",
        "IRC R507.6 (Deck joists) limits a deck joist's cantilever to one quarter of the adjacent joist span, or the shorter cantilever its Table R507.6 gives for the species, size and spacing, whichever is less; the deck live load is set by the adopted residential code and is entered here rather than assumed"
      ],
      "vectors": [
        {
          "name": "3.6 m span at 16 in centres, 2.4 kPa, Fb′ 6.9 MPa, L/360",
          "inputs": {
            "clearSpan": 3.6,
            "joistSpacing": 0.4064,
            "totalLoad": 2400,
            "bendingValue": 6900000,
            "modulusE": 9650000000,
            "joistWidth": 0.0381,
            "deflectionRatio": "360",
            "proposedDepth": 0.235,
            "cantilever": 0.6
          },
          "expected": 190.948,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Depth required for bending",
              "value": 189.90157633798668,
              "unit": "mm"
            },
            {
              "label": "Depth required for deflection",
              "value": 190.94761005757195,
              "unit": "mm"
            },
            {
              "label": "Design bending moment",
              "value": 1580.0832000000003,
              "unit": "N·m"
            },
            {
              "label": "Line load carried by one joist",
              "value": 975.36,
              "unit": "N/m"
            },
            {
              "label": "Bending capacity used by the proposed section",
              "value": 65.30123801838332,
              "unit": "%"
            },
            {
              "label": "Deflection allowance used by the proposed section",
              "value": 53.64621604156018,
              "unit": "%"
            },
            {
              "label": "Deflection of the proposed section",
              "value": 5.364621604156017,
              "unit": "mm"
            },
            {
              "label": "Largest permitted cantilever",
              "value": 900,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "4.2 m span at 12 in centres, same species values",
          "inputs": {
            "clearSpan": 4.2,
            "joistSpacing": 0.3048,
            "totalLoad": 2400,
            "bendingValue": 6900000,
            "modulusE": 9650000000,
            "joistWidth": 0.0381,
            "deflectionRatio": "360",
            "proposedDepth": 0.286,
            "cantilever": 0.6
          },
          "expected": 202.402,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Depth required for bending",
              "value": 191.869520881974,
              "unit": "mm"
            },
            {
              "label": "Depth required for deflection",
              "value": 202.40198672615563,
              "unit": "mm"
            },
            {
              "label": "Design bending moment",
              "value": 1613.0016,
              "unit": "N·m"
            },
            {
              "label": "Line load carried by one joist",
              "value": 731.52,
              "unit": "N/m"
            },
            {
              "label": "Bending capacity used by the proposed section",
              "value": 45.006984502271834,
              "unit": "%"
            },
            {
              "label": "Deflection allowance used by the proposed section",
              "value": 35.44428450874591,
              "unit": "%"
            },
            {
              "label": "Deflection of the proposed section",
              "value": 4.135166526020357,
              "unit": "mm"
            },
            {
              "label": "Largest permitted cantilever",
              "value": 1050,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "deck-ledger-flashing-calculator",
      "title": "Deck Ledger Flashing Length Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/deck-ledger-flashing-calculator/",
      "sources": [
        "Flashing length = ledger board length + 2 x end overhang, providing a kick-out allowance to direct water away from the wall at each end of the ledger"
      ],
      "vectors": [
        {
          "name": "6m ledger, 75mm overhang",
          "inputs": {
            "ledgerLength": 6,
            "endOverhang": 0.075
          },
          "expected": 6.15,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "8m ledger, 100mm overhang",
          "inputs": {
            "ledgerLength": 8,
            "endOverhang": 0.1
          },
          "expected": 8.2,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "deck-screws-calculator",
      "title": "Deck Screws Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/deck-screws-calculator/",
      "sources": [
        "Standard decking with 2 screws per board per joist at 16 in O.C. joist spacing uses approximately 3.5 screws per sq ft"
      ],
      "vectors": [
        {
          "name": "20m² deck",
          "inputs": {
            "deckArea": 20
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "x 300-count boxes",
          "confidence": "medium",
          "steps": [
            {
              "label": "Screws needed",
              "value": 754,
              "unit": "screws"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "40m² deck",
          "inputs": {
            "deckArea": 40
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "x 300-count boxes",
          "confidence": "medium",
          "steps": [
            {
              "label": "Screws needed",
              "value": 1507,
              "unit": "screws"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "256 sq ft deck: boxes follow the screw count",
          "inputs": {
            "deckArea": 23.78317824
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "x 300-count boxes",
          "confidence": "medium",
          "steps": [
            {
              "label": "Screws needed",
              "value": 896,
              "unit": "screws"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "deck-stain-calculator",
      "title": "Deck Stain Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/deck-stain-calculator/",
      "sources": [
        "Deck stain typically covers approximately 200-300 sq ft per gallon per coat, depending on wood porosity and stain opacity"
      ],
      "vectors": [
        {
          "name": "20m² deck, 1 coat",
          "inputs": {
            "deckArea": 20,
            "coats": 1
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "gallons",
          "confidence": "medium",
          "steps": [
            {
              "label": "Area to cover (all coats)",
              "value": 215.27820833419443,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "40m² deck, 2 coats",
          "inputs": {
            "deckArea": 40,
            "coats": 2
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "gallons",
          "confidence": "medium",
          "steps": [
            {
              "label": "Area to cover (all coats)",
              "value": 861.1128333367777,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "decorative-column-wrap-calculator",
      "title": "Decorative Column/Pilaster Wrap Material Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/decorative-column-wrap-calculator/",
      "sources": [
        "Wrap area = π × Column Diameter × Column Height — the standard lateral surface area formula for a cylinder, applied to sizing decorative column wrap/cladding material (fiberglass, PVC, or fabric column covers)."
      ],
      "vectors": [
        {
          "name": "0.4m diameter, 3m tall column",
          "inputs": {
            "columnDiameter": 0.4,
            "columnHeight": 3
          },
          "expected": 3.77,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "0.5m diameter, 3.6m tall column",
          "inputs": {
            "columnDiameter": 0.5,
            "columnHeight": 3.6
          },
          "expected": 5.65,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "degrees-to-roof-pitch-calculator",
      "title": "Degrees to Roof Pitch Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/degrees-to-roof-pitch-calculator/",
      "sources": [
        "Inverse of the pitch definition: rise per 12 units of run = tan(angle) x 12",
        "Manufacturer minimum slopes are commonly stated in rise-per-12, e.g. 2:12 for many asphalt shingle systems with additional underlayment"
      ],
      "vectors": [
        {
          "name": "30 ° converts correctly",
          "inputs": {
            "degrees": 30
          },
          "expected": 6.928203230275509,
          "toleranceDecimalPlaces": 6,
          "unit": "in per 12 in",
          "confidence": "high",
          "steps": [],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "degrees": 300
          },
          "expected": -20.784609690826525,
          "toleranceDecimalPlaces": 6,
          "unit": "in per 12 in",
          "confidence": "high",
          "steps": [],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "dehumidifier-pulldown-calculator",
      "title": "Dehumidifier Water Removal Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/dehumidifier-pulldown-calculator/",
      "sources": [
        "Magnus saturation-vapour-pressure approximation, e_s = 6.112·exp(17.62·T/(243.12+T)) hPa — WMO-recommended coefficients",
        "Vapour mass from the ideal gas law on the vapour's own partial pressure, m = e·V/(R_v·T), with R_v = 461.5 J/(kg·K) — so no fixed air density enters and the figure stays exact across the whole temperature range",
        "Humidity ratio W = 0.622·e/(P−e) at standard sea-level pressure — psychrometric relations per ASHRAE Handbook — Fundamentals",
        "Rated dehumidifier capacity is defined at a standard test condition; the US DOE test procedure (10 CFR 430) moved from 80°F/60% RH to 65°F/60% RH, roughly halving printed ratings for the same hardware — the unit's own documentation governs its real extraction"
      ],
      "vectors": [
        {
          "name": "40 m² room, 2.5 m ceiling, 20 °C, 70% → 55%",
          "inputs": {
            "area": 40,
            "height": 2.5,
            "temp": 20,
            "rhStart": 70,
            "rhTarget": 55,
            "ratedCapacity": 20,
            "deratePercent": 70
          },
          "expected": 0.2586,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Room air volume",
              "value": 100,
              "unit": "m³"
            },
            {
              "label": "Water in the air now",
              "value": 1.2069130043678546,
              "unit": "L"
            },
            {
              "label": "Water in the air at the target",
              "value": 0.9482887891461719,
              "unit": "L"
            },
            {
              "label": "Pull-down time at derated capacity",
              "value": 0.44335579752288473,
              "unit": "hours"
            },
            {
              "label": "Effective extraction rate",
              "value": 14,
              "unit": "L/day"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Cool 300 m³ basement, 80% → 50%",
          "inputs": {
            "area": 100,
            "height": 3,
            "temp": 15,
            "rhStart": 80,
            "rhTarget": 50,
            "ratedCapacity": 12,
            "deratePercent": 50
          },
          "expected": 1.1532,
          "toleranceDecimalPlaces": 1,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Room air volume",
              "value": 300,
              "unit": "m³"
            },
            {
              "label": "Water in the air now",
              "value": 3.071119895114769,
              "unit": "L"
            },
            {
              "label": "Water in the air at the target",
              "value": 1.9194499344467304,
              "unit": "L"
            },
            {
              "label": "Pull-down time at derated capacity",
              "value": 4.606679842672154,
              "unit": "hours"
            },
            {
              "label": "Effective extraction rate",
              "value": 6,
              "unit": "L/day"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Target above current humidity: nothing to remove",
          "inputs": {
            "area": 40,
            "height": 2.5,
            "temp": 20,
            "rhStart": 50,
            "rhTarget": 60,
            "ratedCapacity": 20,
            "deratePercent": 70
          },
          "expected": 0,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "low",
          "steps": [
            {
              "label": "Room air volume",
              "value": 100,
              "unit": "m³"
            },
            {
              "label": "Water in the air now",
              "value": 0.8620807174056107,
              "unit": "L"
            },
            {
              "label": "Water in the air at the target",
              "value": 1.0344968608867329,
              "unit": "L"
            },
            {
              "label": "Pull-down time at derated capacity",
              "value": 0,
              "unit": "hours"
            },
            {
              "label": "Effective extraction rate",
              "value": 14,
              "unit": "L/day"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "dehumidifier-sizing-calculator",
      "title": "Dehumidifier Sizing Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/dehumidifier-sizing-calculator/",
      "sources": [
        "Widely published dehumidifier sizing guide (per 500 sq ft): slightly damp = 10 pints, moderately damp = 12, very damp = 14, wet = 16, extremely wet = 22"
      ],
      "vectors": [
        {
          "name": "50m² moderately damp basement",
          "inputs": {
            "roomArea": 50,
            "dampnessLevel": "moderately-damp"
          },
          "expected": 12.917,
          "toleranceDecimalPlaces": 3,
          "unit": "pints/day",
          "confidence": "medium",
          "steps": [
            {
              "label": "Room area",
              "value": 538.195520835486,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "100m² very damp basement",
          "inputs": {
            "roomArea": 100,
            "dampnessLevel": "very-damp"
          },
          "expected": 30.139,
          "toleranceDecimalPlaces": 3,
          "unit": "pints/day",
          "confidence": "medium",
          "steps": [
            {
              "label": "Room area",
              "value": 1076.391041670972,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "delay-cost-acceleration-calculator",
      "title": "Delay Cost and Acceleration Break-Even Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/delay-cost-acceleration-calculator/",
      "sources": [
        "Liquidated damages are a pre-agreed rate stated in the contract, recoverable without proof of actual loss, and in most standard forms subject to a stated maximum expressed as a percentage of the contract sum; once that maximum is reached no further damages accrue however long the delay continues",
        "Standard forms distinguish culpable delay (damages apply, prolongation borne by the contractor), excusable non-compensable delay such as exceptional weather (an extension of time stops damages but carries no money), and excusable compensable delay caused by the employer (an extension plus loss and expense, which recovers time-related costs)",
        "Loss and expense for prolongation is evaluated on the time-related preliminaries actually incurred over the extended period, not as a percentage of the contract sum, and requires notice and substantiation under every standard form"
      ],
      "vectors": [
        {
          "name": "six culpable weeks, inside the damages cap",
          "inputs": {
            "delayWeeks": 6,
            "delayType": "culpable",
            "liquidatedDamagesPerWeek": 3500,
            "damagesCap": 90000,
            "weeklyPrelimsRate": 4350,
            "accelerationCost": 30000,
            "weeksRecovered": 4
          },
          "expected": 47100,
          "toleranceDecimalPlaces": 0,
          "unit": "currency",
          "confidence": "high",
          "steps": [
            {
              "label": "Liquidated damages",
              "value": 21000,
              "unit": "currency"
            },
            {
              "label": "Prolongation borne",
              "value": 26100,
              "unit": "currency"
            },
            {
              "label": "Saving from recovering 4 week(s)",
              "value": 31400,
              "unit": "currency"
            },
            {
              "label": "Cost of that acceleration",
              "value": 30000,
              "unit": "currency"
            },
            {
              "label": "Net of accelerating",
              "value": 1400,
              "unit": "currency"
            },
            {
              "label": "Most it is worth spending to recover those weeks",
              "value": 31400,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "the cap bites, so the delay costs far less than the weekly rate suggests",
          "inputs": {
            "delayWeeks": 40,
            "delayType": "culpable",
            "liquidatedDamagesPerWeek": 3500,
            "damagesCap": 90000,
            "weeklyPrelimsRate": 4350,
            "accelerationCost": 30000,
            "weeksRecovered": 4
          },
          "expected": 264000,
          "toleranceDecimalPlaces": 0,
          "unit": "currency",
          "confidence": "high",
          "steps": [
            {
              "label": "Liquidated damages",
              "value": 90000,
              "unit": "currency"
            },
            {
              "label": "Prolongation borne",
              "value": 174000,
              "unit": "currency"
            },
            {
              "label": "Saving from recovering 4 week(s)",
              "value": 17400,
              "unit": "currency"
            },
            {
              "label": "Cost of that acceleration",
              "value": 30000,
              "unit": "currency"
            },
            {
              "label": "Net of accelerating",
              "value": -12600,
              "unit": "currency"
            },
            {
              "label": "Most it is worth spending to recover those weeks",
              "value": 17400,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "a neutral event: an extension stops the damages, the prolongation stays",
          "inputs": {
            "delayWeeks": 6,
            "delayType": "excusable",
            "liquidatedDamagesPerWeek": 3500,
            "damagesCap": 90000,
            "weeklyPrelimsRate": 4350,
            "accelerationCost": 30000,
            "weeksRecovered": 4
          },
          "expected": 26100,
          "toleranceDecimalPlaces": 0,
          "unit": "currency",
          "confidence": "high",
          "steps": [
            {
              "label": "Liquidated damages",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Prolongation borne",
              "value": 26100,
              "unit": "currency"
            },
            {
              "label": "Saving from recovering 4 week(s)",
              "value": 17400,
              "unit": "currency"
            },
            {
              "label": "Cost of that acceleration",
              "value": 30000,
              "unit": "currency"
            },
            {
              "label": "Net of accelerating",
              "value": -12600,
              "unit": "currency"
            },
            {
              "label": "Most it is worth spending to recover those weeks",
              "value": 17400,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "an employer delay properly notified costs the contractor nothing",
          "inputs": {
            "delayWeeks": 6,
            "delayType": "compensable",
            "liquidatedDamagesPerWeek": 3500,
            "damagesCap": 90000,
            "weeklyPrelimsRate": 4350,
            "accelerationCost": 30000,
            "weeksRecovered": 4
          },
          "expected": 0,
          "toleranceDecimalPlaces": 0,
          "unit": "currency",
          "confidence": "high",
          "steps": [
            {
              "label": "Liquidated damages",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Prolongation borne",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Saving from recovering 4 week(s)",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Cost of that acceleration",
              "value": 30000,
              "unit": "currency"
            },
            {
              "label": "Net of accelerating",
              "value": -30000,
              "unit": "currency"
            },
            {
              "label": "Most it is worth spending to recover those weeks",
              "value": 0,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "demolition-bulk-volume-swell-calculator",
      "title": "Demolition Bulk Volume Swell Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/demolition-bulk-volume-swell-calculator/",
      "sources": [
        "Bulked volume = In-place volume × Swell (bulking) Factor. Broken masonry and concrete occupy significantly more volume once demolished due to voids created by fracturing — typical swell factors commonly used in demolition estimating: concrete ~1.3x, CMU block ~1.4x, brick masonry ~1.5x, natural stone ~1.5x. These are industry estimating conventions (mirroring the same swell/bulking concept used in this site's Soil Swell & Shrinkage calculator), not a single universal engineering constant — actual swell varies with demolition method and debris size."
      ],
      "vectors": [
        {
          "name": "20 yd³ (15,291 L) concrete",
          "inputs": {
            "inPlaceVolumeYd3": 15291.097159680001,
            "materialType": "concrete"
          },
          "expected": 26,
          "toleranceDecimalPlaces": 0,
          "unit": "cubic yards",
          "confidence": "medium",
          "steps": [
            {
              "label": "Swell factor used",
              "value": 1.3,
              "unit": "x"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15 yd³ (11,468 L) brick masonry",
          "inputs": {
            "inPlaceVolumeYd3": 11468.32286976,
            "materialType": "brick-masonry"
          },
          "expected": 22.5,
          "toleranceDecimalPlaces": 1,
          "unit": "cubic yards",
          "confidence": "medium",
          "steps": [
            {
              "label": "Swell factor used",
              "value": 1.5,
              "unit": "x"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "design-vehicle-turning-path-calculator",
      "title": "Design Vehicle Swept Path Calculator",
      "url": "https://craftquantities.com/calculators/heavy-civil/design-vehicle-turning-path-calculator/",
      "sources": [
        "AASHTO, A Policy on Geometric Design of Highways and Streets — publishes the standard design vehicle classes and their minimum turning paths, which are the dimensions this page is driven with and the templates a submitted plan should be checked against",
        "Standard bicycle-model turning geometry: the turn centre lies on the rear axle line at a radius of wheelbase ÷ tan(steer angle); the inside rear wheel tracks half a track width inside it, and the outer front body corner sweeps the hypotenuse of that radius plus half the width and the wheelbase plus the front overhang."
      ],
      "vectors": [
        {
          "name": "Single-unit truck: 6.1 m wheelbase at 31.8 degrees",
          "inputs": {
            "wheelbase": 6.1,
            "steeringAngle": 31.8,
            "frontOverhang": 1.2,
            "bodyWidth": 2.44,
            "clearanceMargin": 0.6
          },
          "expected": 5.232211,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Inside rear tyre path radius",
              "value": 8.618292835043992,
              "unit": "m"
            },
            {
              "label": "Outer body envelope radius",
              "value": 13.850503402723435,
              "unit": "m"
            },
            {
              "label": "Turn radius at the rear axle centre",
              "value": 9.838292835043992,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Long tractor: 12.3 m wheelbase at 20 degrees",
          "inputs": {
            "wheelbase": 12.3,
            "steeringAngle": 20,
            "frontOverhang": 0.9,
            "bodyWidth": 2.6,
            "clearanceMargin": 0.9
          },
          "expected": 5.900386,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Inside rear tyre path radius",
              "value": 32.49397225929186,
              "unit": "m"
            },
            {
              "label": "Outer body envelope radius",
              "value": 38.394358094731345,
              "unit": "m"
            },
            {
              "label": "Turn radius at the rear axle centre",
              "value": 33.793972259291856,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Passenger car: 3.35 m wheelbase at 33 degrees",
          "inputs": {
            "wheelbase": 3.35,
            "steeringAngle": 33,
            "frontOverhang": 0.9,
            "bodyWidth": 2.13,
            "clearanceMargin": 0.6
          },
          "expected": 4.042701,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Inside rear tyre path radius",
              "value": 4.093547628778852,
              "unit": "m"
            },
            {
              "label": "Outer body envelope radius",
              "value": 8.136248741096521,
              "unit": "m"
            },
            {
              "label": "Turn radius at the rear axle centre",
              "value": 5.1585476287788525,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "detectable-warning-panel-calculator",
      "title": "ADA Curb Ramp Detectable Warning Panel Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/detectable-warning-panel-calculator/",
      "sources": [
        "Required warning surface area = ramp width × the ADA-required minimum depth (24 in / 0.61 m per ADA/PROWAG); panel count = ceil(required area ÷ single panel area)"
      ],
      "vectors": [
        {
          "name": "1.5m ramp, 0.61m depth, 0.3m² panels",
          "inputs": {
            "rampWidth": 1.5,
            "requiredDepth": 0.61,
            "panelArea": 0.3
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "medium",
          "steps": [
            {
              "label": "Required warning surface area",
              "value": 0.915,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2.4m ramp, 0.61m depth, 0.3m² panels",
          "inputs": {
            "rampWidth": 2.4,
            "requiredDepth": 0.61,
            "panelArea": 0.3
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "medium",
          "steps": [
            {
              "label": "Required warning surface area",
              "value": 1.464,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "dew-point-calculator",
      "title": "Dew Point and Relative Humidity Calculator (with the Coating Surface Check)",
      "url": "https://craftquantities.com/calculators/materials-quantities/dew-point-calculator/",
      "sources": [
        "WMO, Guide to Instruments and Methods of Observation (WMO-No. 8), Volume I (2023 edition), Annex 4.B, Formulae for the computation of measures of humidity: e_w(t) = 6.112 exp[17.62 t / (243.12 + t)], water (pure phase), −45 °C to +60 °C, uncertainty up to 0.6% (k = 2); over ice 6.112 exp[22.46 t / (272.62 + t)], −65 °C to 0 °C. Read as the WMO reproduces the annex in its own training unit, Calibration of humidity instruments, Part 1",
        "Algebra of the Magnus form with b = 17.62 and c = 243.12 °C, since relative humidity is the vapour pressure over the saturation pressure at the air temperature: dew point Td = cγ / (b − γ) with γ = ln(RH/100) + bT / (c + T); RH = 100 exp(bTd / (c + Td) − bT / (c + T)); air temperature T = cδ / (b − δ) with δ = bTd / (c + Td) − ln(RH/100)",
        "Wattyl (Valspar Paint (Australia) Pty Ltd), Protective & Marine InfoSheet I-05, Ambient Application Conditions (Version 6, March 2021): to allow a safety margin, normally the substrate temperature must be at least 3 °C above the dew point; most coatings have an upper limit of 85% relative humidity; worked example: 16 °C at 71% relative humidity gives a dew point of 11 °C, and a substrate at 13 °C is only 2 °C above it, so painting should not proceed",
        "Tnemec, Application Guide SS-5.0 to SS-5.2 (Propolymer and Vinester special systems), 3.3 Dehumidification: the surface should be clean, dry and contaminant free, and be at least 5°F (3°C) above the dew point; do not apply when humidity exceeds 80%",
        "ISO 8502-4:2017, Preparation of steel substrates before application of paints and related products — Tests for the assessment of surface cleanliness — Part 4: Guidance on the estimation of the probability of condensation prior to paint application (published 9 January 2017), as the Standards Council of Canada records it: it \"gives guidance on the estimation of the probability of condensation on a surface to be painted\" and \"may be used to establish whether conditions at the job site are suitable for painting or not\". The standard's text is not reproduced here, and no figure on this page is taken from it"
      ],
      "vectors": [
        {
          "name": "The opening: air at 20 °C and 60%",
          "inputs": {
            "solveFor": "dewPoint",
            "airTemperature": 20,
            "relativeHumidity": 60,
            "surfaceTemperature": 18,
            "coatingMargin": 3
          },
          "expected": 11.99545,
          "toleranceDecimalPlaces": 4,
          "unit": "°C",
          "confidence": "high",
          "steps": [
            {
              "label": "Dew point",
              "value": 11.995453892411351,
              "unit": "°C"
            },
            {
              "label": "Air temperature",
              "value": 20,
              "unit": "°C"
            },
            {
              "label": "Relative humidity",
              "value": 60,
              "unit": "%"
            },
            {
              "label": "Air temperature above the dew point",
              "value": 8.004546107588649,
              "unit": "Δ°C"
            },
            {
              "label": "Surface temperature above the dew point",
              "value": 6.004546107588649,
              "unit": "Δ°C"
            },
            {
              "label": "Lowest surface temperature the coating check asks for",
              "value": 14.995453892411351,
              "unit": "°C"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Wattyl's worked example: 16 °C at 71%, a dew point of about 11 °C",
          "inputs": {
            "solveFor": "dewPoint",
            "airTemperature": 16,
            "relativeHumidity": 71,
            "surfaceTemperature": 13,
            "coatingMargin": 3
          },
          "expected": 10.74082,
          "toleranceDecimalPlaces": 4,
          "unit": "°C",
          "confidence": "high",
          "steps": [
            {
              "label": "Dew point",
              "value": 10.740816743445663,
              "unit": "°C"
            },
            {
              "label": "Air temperature",
              "value": 16,
              "unit": "°C"
            },
            {
              "label": "Relative humidity",
              "value": 71,
              "unit": "%"
            },
            {
              "label": "Air temperature above the dew point",
              "value": 5.259183256554337,
              "unit": "Δ°C"
            },
            {
              "label": "Surface temperature above the dew point",
              "value": 2.259183256554337,
              "unit": "Δ°C"
            },
            {
              "label": "Lowest surface temperature the coating check asks for",
              "value": 13.740816743445663,
              "unit": "°C"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "Saturated air: at 100% the dew point is the air temperature",
          "inputs": {
            "solveFor": "dewPoint",
            "airTemperature": 25,
            "relativeHumidity": 100,
            "surfaceTemperature": 30,
            "coatingMargin": 3
          },
          "expected": 25,
          "toleranceDecimalPlaces": 9,
          "unit": "°C",
          "confidence": "high",
          "steps": [
            {
              "label": "Dew point",
              "value": 24.999999999999996,
              "unit": "°C"
            },
            {
              "label": "Air temperature",
              "value": 25,
              "unit": "°C"
            },
            {
              "label": "Relative humidity",
              "value": 100,
              "unit": "%"
            },
            {
              "label": "Air temperature above the dew point",
              "value": 3.552713678800501e-15,
              "unit": "Δ°C"
            },
            {
              "label": "Surface temperature above the dew point",
              "value": 5.0000000000000036,
              "unit": "Δ°C"
            },
            {
              "label": "Lowest surface temperature the coating check asks for",
              "value": 27.999999999999996,
              "unit": "°C"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "The humidity of 20 °C air whose dew point is 12 °C",
          "inputs": {
            "solveFor": "relativeHumidity",
            "rhAirTemperature": 20,
            "rhDewPoint": 12,
            "surfaceTemperature": 18,
            "coatingMargin": 3
          },
          "expected": 60.018,
          "toleranceDecimalPlaces": 2,
          "unit": "%",
          "confidence": "high",
          "steps": [
            {
              "label": "Dew point",
              "value": 12,
              "unit": "°C"
            },
            {
              "label": "Air temperature",
              "value": 20,
              "unit": "°C"
            },
            {
              "label": "Relative humidity",
              "value": 60.017955655037646,
              "unit": "%"
            },
            {
              "label": "Air temperature above the dew point",
              "value": 8,
              "unit": "Δ°C"
            },
            {
              "label": "Surface temperature above the dew point",
              "value": 6,
              "unit": "Δ°C"
            },
            {
              "label": "Lowest surface temperature the coating check asks for",
              "value": 15,
              "unit": "°C"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "The air temperature at which a 12 °C dew point reads 60%",
          "inputs": {
            "solveFor": "airTemperature",
            "knownDewPoint": 12,
            "knownHumidity": 60,
            "surfaceTemperature": 18,
            "coatingMargin": 3
          },
          "expected": 20.00484,
          "toleranceDecimalPlaces": 4,
          "unit": "°C",
          "confidence": "high",
          "steps": [
            {
              "label": "Dew point",
              "value": 12,
              "unit": "°C"
            },
            {
              "label": "Air temperature",
              "value": 20.004835864670437,
              "unit": "°C"
            },
            {
              "label": "Relative humidity",
              "value": 60,
              "unit": "%"
            },
            {
              "label": "Air temperature above the dew point",
              "value": 8.004835864670437,
              "unit": "Δ°C"
            },
            {
              "label": "Surface temperature above the dew point",
              "value": 6,
              "unit": "Δ°C"
            },
            {
              "label": "Lowest surface temperature the coating check asks for",
              "value": 15,
              "unit": "°C"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "dewatering-well-yield-calculator",
      "title": "Dewatering Well Yield Calculator (Dupuit-Forchheimer)",
      "url": "https://craftquantities.com/calculators/heavy-civil/dewatering-well-yield-calculator/",
      "sources": [
        "Dupuit-Forchheimer equation for steady radial flow to a well in an unconfined aquifer: Q = pi x K x (h1² − h2²) / ln(r1/r2)"
      ],
      "vectors": [
        {
          "name": "K=0.0001, h1=10, h2=7, r1=50, r2=1",
          "inputs": {
            "hydraulicConductivity": 0.0001,
            "outerSaturatedThickness": 10,
            "wellSaturatedThickness": 7,
            "outerRadius": 50,
            "wellRadius": 1
          },
          "expected": 245.76,
          "toleranceDecimalPlaces": 0,
          "unit": "L/min",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in m³/day",
              "value": 353.8607479958576,
              "unit": "m³/day"
            },
            {
              "label": "Equivalent in US gallons per minute",
              "value": 64.91674945319382,
              "unit": "gpm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "K=0.0002, h1=12, h2=8, r1=60, r2=0.15",
          "inputs": {
            "hydraulicConductivity": 0.0002,
            "outerSaturatedThickness": 12,
            "wellSaturatedThickness": 8,
            "outerRadius": 60,
            "wellRadius": 0.15
          },
          "expected": 503.4,
          "toleranceDecimalPlaces": -1,
          "unit": "L/min",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in m³/day",
              "value": 724.8541070678322,
              "unit": "m³/day"
            },
            {
              "label": "Equivalent in US gallons per minute",
              "value": 132.97652459376994,
              "unit": "gpm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "dhw-recirculation-flow-calculator",
      "title": "Domestic Hot Water Recirculation Flow Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/dhw-recirculation-flow-calculator/",
      "sources": [
        "Required recirculation flow = pipe heat loss ÷ (water density × specific heat × allowable temperature drop), the standard method for sizing a domestic hot water recirculation system to compensate for standby heat loss along the loop"
      ],
      "vectors": [
        {
          "name": "500W loop, 5°C allowable drop",
          "inputs": {
            "heatLoss": 500,
            "allowableTempDrop": 5
          },
          "expected": 1.43,
          "toleranceDecimalPlaces": 1,
          "unit": "L/min",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "800W loop, 6°C allowable drop",
          "inputs": {
            "heatLoss": 800,
            "allowableTempDrop": 6
          },
          "expected": 1.91,
          "toleranceDecimalPlaces": 1,
          "unit": "L/min",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "diagonal-tile-corner-waste-calculator",
      "title": "Diagonal Tile Layout 45° Corner Cut Waste Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/diagonal-tile-corner-waste-calculator/",
      "sources": [
        "A diagonal (45°) tile layout requires a triangular cut tile at every perimeter tile position; perimeter tile positions ≈ ceil(room perimeter ÷ tile size), and each cut wastes roughly half a tile's area"
      ],
      "vectors": [
        {
          "name": "20m perimeter, 0.3m tile",
          "inputs": {
            "roomPerimeter": 20,
            "tileSize": 0.3,
            "tileArea": 0.09
          },
          "expected": 3.015,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Perimeter tile positions requiring a corner cut",
              "value": 67
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "28m perimeter, 0.3m tile",
          "inputs": {
            "roomPerimeter": 28,
            "tileSize": 0.3,
            "tileArea": 0.09
          },
          "expected": 4.23,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Perimeter tile positions requiring a corner cut",
              "value": 94
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "diy-vs-contractor-cost-calculator",
      "title": "DIY vs. Contractor Cost Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/diy-vs-contractor-cost-calculator/",
      "sources": [
        "DIY total cost = materials cost + (your hours x the value you place on your time); compared directly against a contractor's all-in quote"
      ],
      "vectors": [
        {
          "name": "$2000 materials, 20hrs at $25/hr, $5000 quote",
          "inputs": {
            "materialsCost": 2000,
            "diyHours": 20,
            "timeValuePerHour": 25,
            "contractorQuote": 5000
          },
          "expected": 2500,
          "toleranceDecimalPlaces": 0,
          "unit": "$ (saved by DIY)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total DIY cost",
              "value": 2500,
              "unit": "$"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "$1500 materials, 15hrs at $30/hr, $4000 quote",
          "inputs": {
            "materialsCost": 1500,
            "diyHours": 15,
            "timeValuePerHour": 30,
            "contractorQuote": 4000
          },
          "expected": 2050,
          "toleranceDecimalPlaces": 0,
          "unit": "$ (saved by DIY)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total DIY cost",
              "value": 1950,
              "unit": "$"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "dog-fence-wire-calculator",
      "title": "In-Ground Dog Fence Wire Calculator",
      "url": "https://craftquantities.com/calculators/auto-utility/dog-fence-wire-calculator/",
      "sources": [
        "Total wire needed = boundary perimeter + twisted (non-signal) wire from the transmitter to the boundary, doubled for the wire pair, plus 10% for burial slack and splices; boundary wire is commonly stocked in 500 ft rolls in North America, while metric-market spool lengths vary by supplier, so on metric the answer is given as the length of wire required rather than a spool count"
      ],
      "vectors": [
        {
          "name": "150m boundary, 15m to transmitter",
          "inputs": {
            "perimeterLength": 150,
            "twistedWireLength": 15
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "x 500 ft rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Total wire needed (with waste)",
              "value": 649.6062992125985,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "300m boundary, 20m to transmitter",
          "inputs": {
            "perimeterLength": 300,
            "twistedWireLength": 20
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "x 500 ft rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Total wire needed (with waste)",
              "value": 1227.0341207349081,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "domestic-water-pipe-sizing-calculator",
      "title": "Domestic Water Pipe Sizing by Fixture Unit Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/domestic-water-pipe-sizing-calculator/",
      "sources": [
        "Estimated demand from fixture units (simplified Hunter's curve approximation) is converted to a minimum pipe diameter via the pipe flow area equation, keeping velocity within a safe range (commonly under ~2.4 m/s / 8 ft/s) to limit noise and water hammer risk",
        "Hazen-Williams equation (SI units): hf = 10.67 × L × Q^1.852 ÷ (C^1.852 × D^4.8704), used here to find the bore at which friction loss consumes the available pressure",
        "Static pressure loss = ρgh, at 1000 kg/m³ and 9.80665 m/s² — about 9.81 kPa, or 0.433 psi, per metre of lift",
        "Water supply fixture unit values are taken from the fixture unit table of the code in force — IPC Table E103.3(2) and UPC Table 610.3 differ, and this page does not reproduce either"
      ],
      "vectors": [
        {
          "name": "20 WSFU, demand factor 3.2, 2.4 m/s max",
          "inputs": {
            "totalFixtureUnits": 20,
            "demandFactor": 3.2,
            "maxVelocity": 2.4,
            "supplyPressure": 413685,
            "developedLength": 30,
            "fittingAllowance": 50,
            "staticLift": 6,
            "meterLoss": 34474,
            "requiredResidual": 103421,
            "pipeMaterial": "plastic"
          },
          "expected": 21.89,
          "toleranceDecimalPlaces": 1,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Estimated peak demand",
              "value": 14.310835055998655,
              "unit": "GPM"
            },
            {
              "label": "Diameter set by the velocity ceiling",
              "value": 21.885822175853964,
              "unit": "mm"
            },
            {
              "label": "Diameter set by the pressure budget",
              "value": 19.467328459968016,
              "unit": "mm"
            },
            {
              "label": "Pressure lost to static lift",
              "value": 58839.899999999994,
              "unit": "Pa"
            },
            {
              "label": "Pressure lost to friction at this diameter",
              "value": 122650.21385479186,
              "unit": "Pa"
            },
            {
              "label": "Pressure left at the furthest fixture",
              "value": 197720.88614520812,
              "unit": "Pa"
            },
            {
              "label": "Equivalent length used for friction",
              "value": 45,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "35 WSFU, demand factor 3.2, 2.4 m/s max",
          "inputs": {
            "totalFixtureUnits": 35,
            "demandFactor": 3.2,
            "maxVelocity": 2.4,
            "supplyPressure": 413685,
            "developedLength": 30,
            "fittingAllowance": 50,
            "staticLift": 6,
            "meterLoss": 34474,
            "requiredResidual": 103421,
            "pipeMaterial": "plastic"
          },
          "expected": 25.17,
          "toleranceDecimalPlaces": 1,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Estimated peak demand",
              "value": 18.93145530591877,
              "unit": "GPM"
            },
            {
              "label": "Diameter set by the velocity ceiling",
              "value": 25.172269826767536,
              "unit": "mm"
            },
            {
              "label": "Diameter set by the pressure budget",
              "value": 21.652832883306797,
              "unit": "mm"
            },
            {
              "label": "Pressure lost to static lift",
              "value": 58839.899999999994,
              "unit": "Pa"
            },
            {
              "label": "Pressure lost to friction at this diameter",
              "value": 104183.37321989443,
              "unit": "Pa"
            },
            {
              "label": "Pressure left at the furthest fixture",
              "value": 216187.72678010556,
              "unit": "Pa"
            },
            {
              "label": "Equivalent length used for friction",
              "value": 45,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A long run on weak mains is governed by pressure, not velocity",
          "inputs": {
            "totalFixtureUnits": 20,
            "demandFactor": 3.2,
            "maxVelocity": 2.4,
            "supplyPressure": 275790,
            "developedLength": 60,
            "fittingAllowance": 50,
            "staticLift": 9,
            "meterLoss": 34474,
            "requiredResidual": 103421,
            "pipeMaterial": "plastic"
          },
          "expected": 30.38,
          "toleranceDecimalPlaces": 1,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Estimated peak demand",
              "value": 14.310835055998655,
              "unit": "GPM"
            },
            {
              "label": "Diameter set by the velocity ceiling",
              "value": 21.885822175853964,
              "unit": "mm"
            },
            {
              "label": "Diameter set by the pressure budget",
              "value": 30.38348630368764,
              "unit": "mm"
            },
            {
              "label": "Pressure lost to static lift",
              "value": 88259.84999999999,
              "unit": "Pa"
            },
            {
              "label": "Pressure lost to friction at this diameter",
              "value": 49635.15,
              "unit": "Pa"
            },
            {
              "label": "Pressure left at the furthest fixture",
              "value": 103421.00000000003,
              "unit": "Pa"
            },
            {
              "label": "Equivalent length used for friction",
              "value": 90,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Where the budget is already spent, the velocity answer stands and the note says why",
          "inputs": {
            "totalFixtureUnits": 20,
            "demandFactor": 3.2,
            "maxVelocity": 2.4,
            "supplyPressure": 206843,
            "developedLength": 30,
            "fittingAllowance": 50,
            "staticLift": 12,
            "meterLoss": 34474,
            "requiredResidual": 103421,
            "pipeMaterial": "plastic"
          },
          "expected": 21.89,
          "toleranceDecimalPlaces": 1,
          "unit": "mm",
          "confidence": "low",
          "steps": [
            {
              "label": "Estimated peak demand",
              "value": 14.310835055998655,
              "unit": "GPM"
            },
            {
              "label": "Diameter set by the velocity ceiling",
              "value": 21.885822175853964,
              "unit": "mm"
            },
            {
              "label": "Diameter set by the pressure budget",
              "value": 0,
              "unit": "mm"
            },
            {
              "label": "Pressure lost to static lift",
              "value": 117679.79999999999,
              "unit": "Pa"
            },
            {
              "label": "Pressure lost to friction at this diameter",
              "value": 122650.21385479186,
              "unit": "Pa"
            },
            {
              "label": "Pressure left at the furthest fixture",
              "value": -67961.01385479185,
              "unit": "Pa"
            },
            {
              "label": "Equivalent length used for friction",
              "value": 45,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "door-effective-clear-width-calculator",
      "title": "Door Effective Clear Width Calculator (Approved Document M and ADA)",
      "url": "https://craftquantities.com/calculators/materials-quantities/door-effective-clear-width-calculator/",
      "sources": [
        "Approved Document M Volume 2, Table 2, Minimum effective clear widths of doors (new / existing buildings): straight-on 800 / 750 mm; at right angles to an access route at least 1500 mm wide 800 / 750 mm; at right angles to an access route at least 1200 mm wide 825 / 775 mm; external doors to buildings used by the general public 1000 / 775 mm — measured at right angles to the wall from the outside of the door stop on the closing side to any obstruction on the hinge side (Diagram 9)",
        "2010 ADA Standards for Accessible Design, 404.2.3: door openings shall provide a clear width of 32 inches (815 mm) minimum, measured between the face of the door and the stop with the door open 90 degrees; openings more than 24 inches (610 mm) deep shall provide 36 inches (915 mm) minimum"
      ],
      "vectors": [
        {
          "name": "The defaults: 830 mm, straight on, new building",
          "inputs": {
            "rule": "adm",
            "building": "new",
            "approach": "straight",
            "deep": "no",
            "width": 0.83
          },
          "expected": 103.75,
          "toleranceDecimalPlaces": 3,
          "unit": "%",
          "confidence": "medium",
          "steps": [
            {
              "label": "Minimum effective clear width for this door",
              "value": 800,
              "unit": "mm"
            },
            {
              "label": "Measured clear width",
              "value": 830,
              "unit": "mm"
            },
            {
              "label": "Room to spare over the minimum",
              "value": 29.999999999999915,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A turn from a 1200 mm corridor asks for 825 mm",
          "inputs": {
            "rule": "adm",
            "building": "new",
            "approach": "right-1200",
            "deep": "no",
            "width": 0.8
          },
          "expected": 96.969697,
          "toleranceDecimalPlaces": 3,
          "unit": "%",
          "confidence": "medium",
          "steps": [
            {
              "label": "Minimum effective clear width for this door",
              "value": 825,
              "unit": "mm"
            },
            {
              "label": "Measured clear width",
              "value": 800,
              "unit": "mm"
            },
            {
              "label": "Short of the minimum by",
              "value": 24.99999999999991,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "An existing public entrance at exactly its minimum",
          "inputs": {
            "rule": "adm",
            "building": "existing",
            "approach": "external",
            "deep": "no",
            "width": 0.775
          },
          "expected": 100,
          "toleranceDecimalPlaces": 3,
          "unit": "%",
          "confidence": "medium",
          "steps": [
            {
              "label": "Minimum effective clear width for this door",
              "value": 775,
              "unit": "mm"
            },
            {
              "label": "Measured clear width",
              "value": 775,
              "unit": "mm"
            },
            {
              "label": "Room to spare over the minimum",
              "value": 0,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A new public entrance at 900 mm",
          "inputs": {
            "rule": "adm",
            "building": "new",
            "approach": "external",
            "deep": "no",
            "width": 0.9
          },
          "expected": 90,
          "toleranceDecimalPlaces": 3,
          "unit": "%",
          "confidence": "medium",
          "steps": [
            {
              "label": "Minimum effective clear width for this door",
              "value": 1000,
              "unit": "mm"
            },
            {
              "label": "Measured clear width",
              "value": 900,
              "unit": "mm"
            },
            {
              "label": "Short of the minimum by",
              "value": 99.99999999999997,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A turn from a 1500 mm corridor, existing building",
          "inputs": {
            "rule": "adm",
            "building": "existing",
            "approach": "right-1500",
            "deep": "no",
            "width": 0.76
          },
          "expected": 101.333333,
          "toleranceDecimalPlaces": 3,
          "unit": "%",
          "confidence": "medium",
          "steps": [
            {
              "label": "Minimum effective clear width for this door",
              "value": 750,
              "unit": "mm"
            },
            {
              "label": "Measured clear width",
              "value": 760,
              "unit": "mm"
            },
            {
              "label": "Room to spare over the minimum",
              "value": 10.000000000000009,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "An existing straight-on door at its minimum",
          "inputs": {
            "rule": "adm",
            "building": "existing",
            "approach": "straight",
            "deep": "no",
            "width": 0.75
          },
          "expected": 100,
          "toleranceDecimalPlaces": 3,
          "unit": "%",
          "confidence": "medium",
          "steps": [
            {
              "label": "Minimum effective clear width for this door",
              "value": 750,
              "unit": "mm"
            },
            {
              "label": "Measured clear width",
              "value": 750,
              "unit": "mm"
            },
            {
              "label": "Room to spare over the minimum",
              "value": 0,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "ADA: exactly 32 inches",
          "inputs": {
            "rule": "ada",
            "building": "new",
            "approach": "straight",
            "deep": "no",
            "width": 0.8128
          },
          "expected": 100,
          "toleranceDecimalPlaces": 3,
          "unit": "%",
          "confidence": "medium",
          "steps": [
            {
              "label": "Minimum effective clear width for this door",
              "value": 812.8,
              "unit": "mm"
            },
            {
              "label": "Measured clear width",
              "value": 812.8,
              "unit": "mm"
            },
            {
              "label": "Room to spare over the minimum",
              "value": 0,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "ADA: a deep opening at 34 inches",
          "inputs": {
            "rule": "ada",
            "building": "new",
            "approach": "straight",
            "deep": "yes",
            "width": 0.8636
          },
          "expected": 94.444444,
          "toleranceDecimalPlaces": 3,
          "unit": "%",
          "confidence": "medium",
          "steps": [
            {
              "label": "Minimum effective clear width for this door",
              "value": 914.4,
              "unit": "mm"
            },
            {
              "label": "Measured clear width",
              "value": 863.6,
              "unit": "mm"
            },
            {
              "label": "Short of the minimum by",
              "value": 50.799999999999955,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "door-maneuvering-clearance-calculator",
      "title": "ADA Door Maneuvering Clearance Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/door-maneuvering-clearance-calculator/",
      "sources": [
        "2010 ADA Standards for Accessible Design, section 404.2.4.1 and Table 404.2.4.1, maneuvering clearances at manual swinging doors and gates",
        "ICC A117.1, Accessible and Usable Buildings and Facilities, carries an equivalent table; confirm which document your jurisdiction has adopted, since editions differ in places",
        "2010 ADA Standards 404.2.3 sets the minimum clear opening width at 32 in with the door open ninety degrees, and 404.2.4.4 requires the maneuvering space floor to be level within a slope of 1:48"
      ],
      "vectors": [
        {
          "name": "Front approach, pull side — 60 in deep",
          "inputs": {
            "approach": "front",
            "side": "pull",
            "hasCloser": "no",
            "hasLatch": "yes",
            "clearOpeningWidth": 0.8128,
            "hingeOption": "deep"
          },
          "expected": 1524,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Clear space required alongside the doorway",
              "value": 457.2,
              "unit": "mm"
            },
            {
              "label": "Total clear width of the maneuvering space",
              "value": 1270,
              "unit": "mm"
            },
            {
              "label": "Minimum clear opening width at the door",
              "value": 812.8,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Latch-side approach, push side, closer fitted — 48 in deep",
          "inputs": {
            "approach": "latch",
            "side": "push",
            "hasCloser": "yes",
            "hasLatch": "yes",
            "clearOpeningWidth": 0.9144,
            "hingeOption": "deep"
          },
          "expected": 1219.2,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Clear space required alongside the doorway",
              "value": 609.5999999999999,
              "unit": "mm"
            },
            {
              "label": "Total clear width of the maneuvering space",
              "value": 1524,
              "unit": "mm"
            },
            {
              "label": "Minimum clear opening width at the door",
              "value": 812.8,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Hinge-side approach, pull side, wider alternative — 54 in deep",
          "inputs": {
            "approach": "hinge",
            "side": "pull",
            "hasCloser": "no",
            "hasLatch": "yes",
            "clearOpeningWidth": 0.8128,
            "hingeOption": "wide"
          },
          "expected": 1371.6,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Clear space required alongside the doorway",
              "value": 1066.8,
              "unit": "mm"
            },
            {
              "label": "Total clear width of the maneuvering space",
              "value": 1879.6,
              "unit": "mm"
            },
            {
              "label": "Minimum clear opening width at the door",
              "value": 812.8,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "door-window-casing-calculator",
      "title": "Door & Window Casing Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/door-window-casing-calculator/",
      "sources": [
        "A door opening is cased on both side jambs plus the head (top): 2 x height + width. A window is cased on all four sides: 2 x (height + width)",
        "10% waste is standard for casing to account for 45° corner miters",
        "Casing stock runs 7, 8 and 10 ft where trim is sold by the foot; the metric shelf carries the same product at 2.1, 2.4 and 3 m, the 2.1 m length being the one cut to clear a standard door height in a single piece"
      ],
      "vectors": [
        {
          "name": "1 door, 80x34 in, 7ft sticks",
          "inputs": {
            "openingType": "door",
            "openingHeight": 2.032,
            "openingWidth": 0.864,
            "openingCount": 1,
            "stickLengthFt": 7
          },
          "expected": 17.79,
          "toleranceDecimalPlaces": 0.5,
          "unit": "linear ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Casing needed (before waste)",
              "value": 16.16797900262467,
              "unit": "linear ft"
            },
            {
              "label": "Sticks needed",
              "value": 3,
              "unit": "x 7 ft sticks"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "2 windows, 1.2x0.9m, 8ft sticks",
          "inputs": {
            "openingType": "window",
            "openingHeight": 1.2,
            "openingWidth": 0.9,
            "openingCount": 2,
            "stickLengthFt": 8
          },
          "expected": 30.32,
          "toleranceDecimalPlaces": 0.5,
          "unit": "linear ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Casing needed (before waste)",
              "value": 27.559055118110237,
              "unit": "linear ft"
            },
            {
              "label": "Sticks needed",
              "value": 4,
              "unit": "x 8 ft sticks"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "1 door with no mitre waste",
          "inputs": {
            "openingType": "door",
            "openingHeight": 2.032,
            "openingWidth": 0.864,
            "openingCount": 1,
            "stickLengthFt": 7,
            "wastePercent": 0
          },
          "expected": 16.17,
          "toleranceDecimalPlaces": 0.5,
          "unit": "linear ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Casing needed (before waste)",
              "value": 16.16797900262467,
              "unit": "linear ft"
            },
            {
              "label": "Sticks needed",
              "value": 3,
              "unit": "x 7 ft sticks"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "dormer-rafter-length-calculator",
      "title": "Dormer Rafter Length Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/dormer-rafter-length-calculator/",
      "sources": [
        "Standard carpentry rafter-length formula applied to a dormer's own (typically narrower, steeper) roof: rafter length = run × √(1+(pitch/12)²)"
      ],
      "vectors": [
        {
          "name": "2m dormer, 8/12 pitch, 0.3m overhang",
          "inputs": {
            "dormerWidth": 2,
            "dormerPitch": 8,
            "overhang": 0.3
          },
          "expected": 1.5625,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Rafter length to ridge",
              "value": 1.2018504251546631,
              "unit": "m"
            },
            {
              "label": "Overhang tail",
              "value": 0.3605551275463989,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2.4m dormer, 10/12 pitch, 0.25m overhang",
          "inputs": {
            "dormerWidth": 2.4,
            "dormerPitch": 10,
            "overhang": 0.25
          },
          "expected": 1.8875,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Rafter length to ridge",
              "value": 1.562049935181331,
              "unit": "m"
            },
            {
              "label": "Overhang tail",
              "value": 0.32542706982944397,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "dot-and-dab-adhesive-calculator",
      "title": "Dot-and-Dab (Direct Bond) Drywall Adhesive Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/dot-and-dab-adhesive-calculator/",
      "sources": [
        "Adhesive mass = board area × the background's coverage rate (kg per m²); bags = mass ÷ bag mass, rounded up to whole bags",
        "Dab pattern per board face: three vertical bands of dabs to a 1200 mm wide board, with a continuous band at floor and ceiling level"
      ],
      "vectors": [
        {
          "name": "30 m² of board at 3.8 kg/m² with a 10% waste allowance",
          "inputs": {
            "boardArea": 30,
            "coverageRate": 3.8,
            "wastePercent": 10
          },
          "expected": 276.4597,
          "toleranceDecimalPlaces": 2,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Coverage rate used",
              "value": 0.7783013457655824,
              "unit": "lb/sq ft"
            },
            {
              "label": "Board area fixed",
              "value": 322.91731250129163,
              "unit": "sq ft"
            },
            {
              "label": "50 lb bags",
              "value": 6,
              "unit": "bags"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "12 m² on flat blockwork at 3 kg/m², no waste allowance",
          "inputs": {
            "boardArea": 12,
            "coverageRate": 3,
            "wastePercent": 0
          },
          "expected": 79.3664,
          "toleranceDecimalPlaces": 2,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Coverage rate used",
              "value": 0.6144484308675651,
              "unit": "lb/sq ft"
            },
            {
              "label": "Board area fixed",
              "value": 129.16692500051667,
              "unit": "sq ft"
            },
            {
              "label": "50 lb bags",
              "value": 2,
              "unit": "bags"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a bowed wall at twice the coverage takes twice the adhesive",
          "inputs": {
            "boardArea": 30,
            "coverageRate": 7.6,
            "wastePercent": 10
          },
          "expected": 552.9194,
          "toleranceDecimalPlaces": 2,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Coverage rate used",
              "value": 1.5566026915311648,
              "unit": "lb/sq ft"
            },
            {
              "label": "Board area fixed",
              "value": 322.91731250129163,
              "unit": "sq ft"
            },
            {
              "label": "50 lb bags",
              "value": 12,
              "unit": "bags"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "downspout-length-calculator",
      "title": "Downspout Length Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/downspout-length-calculator/",
      "sources": [
        "Total downspout length = number of downspouts x drop height; each downspout typically needs about 2 elbows (top offset from the gutter, bottom offset away from the foundation)"
      ],
      "vectors": [
        {
          "name": "2 downspouts, 3m drop",
          "inputs": {
            "downspoutCount": 2,
            "dropHeight": 3
          },
          "expected": 21.65,
          "toleranceDecimalPlaces": 2,
          "unit": "linear ft of downspout pipe",
          "confidence": "high",
          "steps": [
            {
              "label": "Elbows needed",
              "value": 4,
              "unit": "elbows"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "4 downspouts, 4.5m drop",
          "inputs": {
            "downspoutCount": 4,
            "dropHeight": 4.5
          },
          "expected": 64.96,
          "toleranceDecimalPlaces": 2,
          "unit": "linear ft of downspout pipe",
          "confidence": "high",
          "steps": [
            {
              "label": "Elbows needed",
              "value": 8,
              "unit": "elbows"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "drain-pipe-slope-calculator",
      "title": "Drain Pipe Slope Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/drain-pipe-slope-calculator/",
      "sources": [
        "Standard plumbing code minimum drain slope (UPC/IPC): 1/4 in per ft for pipes 3 in and smaller, 1/8 in per ft for pipes larger than 3 in"
      ],
      "vectors": [
        {
          "name": "6m run, small pipe",
          "inputs": {
            "pipeLength": 6,
            "pipeDiameterCategory": "small"
          },
          "expected": 4.921,
          "toleranceDecimalPlaces": 2,
          "unit": "in of drop (minimum)",
          "confidence": "high",
          "steps": [
            {
              "label": "Pipe run length",
              "value": 19.68503937007874,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "20m run, large pipe",
          "inputs": {
            "pipeLength": 20,
            "pipeDiameterCategory": "large"
          },
          "expected": 8.202,
          "toleranceDecimalPlaces": 0.1,
          "unit": "in of drop (minimum)",
          "confidence": "high",
          "steps": [
            {
              "label": "Pipe run length",
              "value": 65.61679790026247,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "drawing-scale-calculator",
      "title": "Drawing Scale Calculator (Plan to Real Size and Back)",
      "url": "https://craftquantities.com/calculators/measurements-conversions/drawing-scale-calculator/",
      "sources": [
        "ISO 5455:1979 Technical drawings — Scales (BS EN ISO 5455:1995 in the UK), read in IS 10713:1983, Scales for use on technical drawings, which states it is identical with ISO 5455-1979: recommended scales for enlargement 50:1, 20:1, 10:1, 5:1 and 2:1, full size 1:1, and reduction 1:2, 1:5, 1:10, 1:20, 1:50, 1:100, 1:200, 1:500, 1:1000, 1:2000, 1:5000 and 1:10000; designated SCALE X : 1 for an enlargement and SCALE 1 : X for a reduction; and \"The scale of a print may be different from that of the original drawing\"",
        "Planning Practice Guidance, Making an application, paragraph 024 (Reference ID 14-024-20140306), on location plans: \"The scale should typically be 1:1250 or 1:2500, but wherever possible the plan should be scaled to fit onto A4 or A3 size paper.\"",
        "Alvin, Triangular Scale Architect 12\" Plastic (model 110P), maker's specification: \"Architect scales have the following graduations: 3/32, 3/16, 1/8, 1/4, 1/2, 1, 3/8, 3/4, 1.5, 3 inches to the foot; one edge to 16ths\"",
        "Alvin, Triangular Scale Engineer 12\" Plastic (model 111P), maker's specification: \"Engineer Triangular Scale made with 10, 20, 30, 40, 50, 60 parts to the inch\"",
        "Thomas E. French, A Manual of Engineering Drawing for Students and Draftsmen, 2nd edition (McGraw-Hill, 1918), on scales: for plotting and map drawing, the civil engineers' scale of decimal parts, 10, 20, 30, 40, 50, 60, 80 and 100 to the inch",
        "NIST Handbook 44 (2026 edition), Appendix C, for the arithmetic only: 12 inches = 1 foot, so a scale of so much of an inch to the foot is 1 to twelve divided by that much (1/4 in = 1 ft is 1:48), and 1 in = 20 ft is 1:240"
      ],
      "vectors": [
        {
          "name": "85 mm at 1:50 is 4.25 m",
          "inputs": {
            "mode": "toReal",
            "scale": "1:50",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.085,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 4.25,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 50,
              "unit": "(1:50)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 167.3228346456693,
              "unit": "in (13 ft 11 5/16 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 85,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "3 1/4 in at 1/4 in = 1 ft is 13 ft (3.9624 m)",
          "inputs": {
            "mode": "toReal",
            "scale": "1:48",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.08255,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 3.9624,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 48,
              "unit": "(1:48)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 156,
              "unit": "in (13 ft 0 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 82.55,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "4.2 m drawn at 1:50 is 84 mm",
          "inputs": {
            "mode": "toDrawing",
            "scale": "1:50",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.085,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 84,
          "toleranceDecimalPlaces": 6,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 50,
              "unit": "(1:50)"
            },
            {
              "label": "Drawn length, as a rule reading",
              "value": 3.3070866141732287,
              "unit": "in (3 5/16 in)"
            },
            {
              "label": "Real size entered",
              "value": 4.2,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "200 ft of frontage drawn at 1 in = 20 ft is 10 in (254 mm)",
          "inputs": {
            "mode": "toDrawing",
            "scale": "1:240",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.085,
            "realLength": 60.96,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 254,
          "toleranceDecimalPlaces": 6,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 240,
              "unit": "(1:240)"
            },
            {
              "label": "Drawn length, as a rule reading",
              "value": 10,
              "unit": "in (10 in)"
            },
            {
              "label": "Real size entered",
              "value": 60.96,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "A 3.6 m room measuring 36 mm on the print is at 1:100",
          "inputs": {
            "mode": "findScale",
            "scale": "1:50",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.085,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 100,
          "toleranceDecimalPlaces": 6,
          "unit": "(scale 1:100)",
          "confidence": "high",
          "steps": [
            {
              "label": "Stated scale",
              "value": 50,
              "unit": "(1:50)"
            },
            {
              "label": "This print against the stated scale",
              "value": 49.99999999999999,
              "unit": "%"
            },
            {
              "label": "Length on this print × this = length at the stated scale",
              "value": 2.0000000000000004
            },
            {
              "label": "Dimension the drawing states",
              "value": 3.6,
              "unit": "m"
            },
            {
              "label": "Measured on this print",
              "value": 36,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A scale entered as two lengths: 1 mm standing for 1250 mm turns 100 mm into 125 m",
          "inputs": {
            "mode": "toReal",
            "scale": "entered",
            "scaleDrawn": 0.001,
            "scaleReal": 1.25,
            "drawnLength": 0.1,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 125,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 1250,
              "unit": "(1:1250)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 4921.259842519685,
              "unit": "in (410 ft 1 1/4 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 100,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Full size, 1:1: 38 mm measured is 38 mm",
          "inputs": {
            "mode": "toReal",
            "scale": "1:1",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.038,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 0.038,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 1,
              "unit": "(1:1)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 1.4960629921259843,
              "unit": "in (1 1/2 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 38,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1:2: 50 mm measured is 100 mm",
          "inputs": {
            "mode": "toReal",
            "scale": "1:2",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.05,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 0.1,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 2,
              "unit": "(1:2)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 3.937007874015748,
              "unit": "in (3 15/16 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 50,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1:5: 20 mm measured is 100 mm",
          "inputs": {
            "mode": "toReal",
            "scale": "1:5",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.02,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 0.1,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 5,
              "unit": "(1:5)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 3.937007874015748,
              "unit": "in (3 15/16 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 20,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1:10: 22.5 mm on a detail is 225 mm",
          "inputs": {
            "mode": "toReal",
            "scale": "1:10",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.0225,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 0.225,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 10,
              "unit": "(1:10)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 8.858267716535433,
              "unit": "in (8 7/8 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 22.5,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1:20: 45 mm on a section is 900 mm",
          "inputs": {
            "mode": "toReal",
            "scale": "1:20",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.045,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 0.9,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 20,
              "unit": "(1:20)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 35.43307086614173,
              "unit": "in (2 ft 11 7/16 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 45,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1:100: 36 mm on a plan is 3.6 m",
          "inputs": {
            "mode": "toReal",
            "scale": "1:100",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.036,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 3.6,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 100,
              "unit": "(1:100)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 141.73228346456693,
              "unit": "in (11 ft 9 3/4 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 36,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1:200: 30 mm on a site plan is 6 m",
          "inputs": {
            "mode": "toReal",
            "scale": "1:200",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.03,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 6,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 200,
              "unit": "(1:200)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 236.2204724409449,
              "unit": "in (19 ft 8 1/4 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 30,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1:500: 24 mm on a block plan is 12 m",
          "inputs": {
            "mode": "toReal",
            "scale": "1:500",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.024,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 12,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 500,
              "unit": "(1:500)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 472.4409448818898,
              "unit": "in (39 ft 4 7/16 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 24,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1:1000: 75 mm is 75 m",
          "inputs": {
            "mode": "toReal",
            "scale": "1:1000",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.075,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 75,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 1000,
              "unit": "(1:1000)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 2952.7559055118113,
              "unit": "in (246 ft 0 3/4 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 75,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1:1250: 80 mm on a location plan is 100 m",
          "inputs": {
            "mode": "toReal",
            "scale": "1:1250",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.08,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 100,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 1250,
              "unit": "(1:1250)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 3937.0078740157483,
              "unit": "in (328 ft 1 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 80,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "1:2000: 50 mm is 100 m",
          "inputs": {
            "mode": "toReal",
            "scale": "1:2000",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.05,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 100,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 2000,
              "unit": "(1:2000)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 3937.0078740157483,
              "unit": "in (328 ft 1 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 50,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1:2500: 40 mm on a location plan is 100 m",
          "inputs": {
            "mode": "toReal",
            "scale": "1:2500",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.04,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 100,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 2500,
              "unit": "(1:2500)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 3937.0078740157483,
              "unit": "in (328 ft 1 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 40,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "1:5000: 20 mm is 100 m",
          "inputs": {
            "mode": "toReal",
            "scale": "1:5000",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.02,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 100,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 5000,
              "unit": "(1:5000)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 3937.0078740157483,
              "unit": "in (328 ft 1 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 20,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1:10000: 10 mm is 100 m",
          "inputs": {
            "mode": "toReal",
            "scale": "1:10000",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.01,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 100,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 10000,
              "unit": "(1:10000)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 3937.0078740157483,
              "unit": "in (328 ft 1 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 10,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "3 in = 1 ft: 1 1/2 in on a detail is 6 in",
          "inputs": {
            "mode": "toReal",
            "scale": "1:4",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.038099999999999995,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 0.1524,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 4,
              "unit": "(1:4)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 5.999999999999999,
              "unit": "in (6 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 38.099999999999994,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "1 1/2 in = 1 ft: 4 1/2 in is 3 ft",
          "inputs": {
            "mode": "toReal",
            "scale": "1:8",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.1143,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 0.9144000000000001,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 8,
              "unit": "(1:8)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 36,
              "unit": "in (3 ft 0 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 114.3,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "1 in = 1 ft: 3 in is 3 ft",
          "inputs": {
            "mode": "toReal",
            "scale": "1:12",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.07619999999999999,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 0.9144000000000001,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 12,
              "unit": "(1:12)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 35.99999999999999,
              "unit": "in (3 ft 0 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 76.19999999999999,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "3/4 in = 1 ft: 6 in is 8 ft",
          "inputs": {
            "mode": "toReal",
            "scale": "1:16",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.15239999999999998,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 2.4384,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 16,
              "unit": "(1:16)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 95.99999999999999,
              "unit": "in (8 ft 0 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 152.39999999999998,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "1/2 in = 1 ft: 5 in is 10 ft",
          "inputs": {
            "mode": "toReal",
            "scale": "1:24",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.127,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 3.048,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 24,
              "unit": "(1:24)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 120,
              "unit": "in (10 ft 0 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 127,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "3/8 in = 1 ft: 3 in is 8 ft",
          "inputs": {
            "mode": "toReal",
            "scale": "1:32",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.07619999999999999,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 2.4384,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 32,
              "unit": "(1:32)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 95.99999999999999,
              "unit": "in (8 ft 0 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 76.19999999999999,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "3/16 in = 1 ft: 3 in is 16 ft",
          "inputs": {
            "mode": "toReal",
            "scale": "1:64",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.07619999999999999,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 4.8768,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 64,
              "unit": "(1:64)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 191.99999999999997,
              "unit": "in (16 ft 0 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 76.19999999999999,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "1/8 in = 1 ft: 2 1/2 in is 20 ft",
          "inputs": {
            "mode": "toReal",
            "scale": "1:96",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.0635,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 6.096,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 96,
              "unit": "(1:96)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 240,
              "unit": "in (20 ft 0 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 63.5,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "3/32 in = 1 ft: 3 in is 32 ft",
          "inputs": {
            "mode": "toReal",
            "scale": "1:128",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.07619999999999999,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 9.7536,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 128,
              "unit": "(1:128)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 383.99999999999994,
              "unit": "in (32 ft 0 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 76.19999999999999,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "1 in = 10 ft: 2 1/2 in is 25 ft",
          "inputs": {
            "mode": "toReal",
            "scale": "1:120",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.0635,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 7.62,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 120,
              "unit": "(1:120)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 300,
              "unit": "in (25 ft 0 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 63.5,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "1 in = 30 ft: 4 in is 120 ft",
          "inputs": {
            "mode": "toReal",
            "scale": "1:360",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.1016,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 36.576,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 360,
              "unit": "(1:360)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 1440,
              "unit": "in (120 ft 0 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 101.6,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "1 in = 40 ft: 5 in is 200 ft",
          "inputs": {
            "mode": "toReal",
            "scale": "1:480",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.127,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 60.96,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 480,
              "unit": "(1:480)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 2400,
              "unit": "in (200 ft 0 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 127,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "1 in = 50 ft: 3 in is 150 ft",
          "inputs": {
            "mode": "toReal",
            "scale": "1:600",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.07619999999999999,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 45.72,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 600,
              "unit": "(1:600)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 1799.9999999999998,
              "unit": "in (150 ft 0 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 76.19999999999999,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "1 in = 60 ft: 2 1/2 in is 150 ft",
          "inputs": {
            "mode": "toReal",
            "scale": "1:720",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.0635,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 45.72,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 720,
              "unit": "(1:720)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 1800,
              "unit": "in (150 ft 0 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 63.5,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "1 in = 100 ft: 6 in is 600 ft",
          "inputs": {
            "mode": "toReal",
            "scale": "1:1200",
            "scaleDrawn": 0.001,
            "scaleReal": 0.05,
            "drawnLength": 0.15239999999999998,
            "realLength": 4.2,
            "knownReal": 3.6,
            "knownDrawn": 0.036
          },
          "expected": 182.88,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Scale used",
              "value": 1200,
              "unit": "(1:1200)"
            },
            {
              "label": "Real size, as a tape reading",
              "value": 7199.999999999999,
              "unit": "in (600 ft 0 in)"
            },
            {
              "label": "Measured on the drawing",
              "value": 152.39999999999998,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 4
        }
      ]
    },
    {
      "slug": "drilled-pier-volume-calculator",
      "title": "Drilled Pier Concrete Volume Calculator (Straight Shaft / Belled)",
      "url": "https://craftquantities.com/calculators/materials-quantities/drilled-pier-volume-calculator/",
      "sources": [
        "Straight shaft volume = pi x radius² x length; an under-ream (bell) is a frustum of a cone, volume = (pi x height / 3) x (R² + Rr + r²), where R is the bell radius and r is the shaft radius"
      ],
      "vectors": [
        {
          "name": "0.6m shaft, 8m length, straight (no bell)",
          "inputs": {
            "shaftDiameter": 0.6,
            "shaftLength": 8,
            "pierType": "straight",
            "bellDiameter": 1.5,
            "bellHeight": 1
          },
          "expected": 2.2619,
          "toleranceDecimalPlaces": 1,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Straight shaft volume",
              "value": 2.261946710584651,
              "unit": "m³"
            },
            {
              "label": "Bell volume",
              "value": 0,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "0.6m shaft, 8m length, belled 1.5m x 1m",
          "inputs": {
            "shaftDiameter": 0.6,
            "shaftLength": 8,
            "pierType": "belled",
            "bellDiameter": 1.5,
            "bellHeight": 1
          },
          "expected": 3.1808,
          "toleranceDecimalPlaces": 1,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Straight shaft volume",
              "value": 2.261946710584651,
              "unit": "m³"
            },
            {
              "label": "Bell volume",
              "value": 0.9189158511750144,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "dripline-application-rate-calculator",
      "title": "Dripline Precipitation Rate Calculator",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/dripline-application-rate-calculator/",
      "sources": [
        "ASABE/ICC 802, Landscape Irrigation Sprinkler and Emitter Standard — provides the reference frame under which emitter discharge is published, which is the figure this calculation depends on",
        "Application rate = emitter discharge ÷ (emitter spacing × lateral spacing). One litre per hour spread over one square metre is one millimetre of depth per hour, by definition of the litre"
      ],
      "vectors": [
        {
          "name": "1.6 L/hr emitters at 300 mm on laterals 500 mm apart",
          "inputs": {
            "emitterDischarge": 1.6,
            "emitterSpacing": 0.3,
            "lateralSpacing": 0.5
          },
          "expected": 10.6667,
          "toleranceDecimalPlaces": 3,
          "unit": "mm/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Area served by each emitter",
              "value": 0.15,
              "unit": "m²"
            },
            {
              "label": "Discharge per unit length of lateral",
              "value": 5.333333333333334,
              "unit": "L/h/m"
            },
            {
              "label": "Depth applied in a thirty-minute run",
              "value": 5.333333333333334,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "2.3 L/hr emitters on a 300 mm square grid",
          "inputs": {
            "emitterDischarge": 2.3,
            "emitterSpacing": 0.3,
            "lateralSpacing": 0.3
          },
          "expected": 25.5556,
          "toleranceDecimalPlaces": 3,
          "unit": "mm/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Area served by each emitter",
              "value": 0.09,
              "unit": "m²"
            },
            {
              "label": "Discharge per unit length of lateral",
              "value": 7.666666666666666,
              "unit": "L/h/m"
            },
            {
              "label": "Depth applied in a thirty-minute run",
              "value": 12.777777777777777,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "driven-pile-skin-friction-calculator",
      "title": "Driven Pile Skin Friction Capacity Calculator (Alpha Method)",
      "url": "https://craftquantities.com/calculators/materials-quantities/driven-pile-skin-friction-calculator/",
      "sources": [
        "Alpha method for pile shaft capacity in cohesive soil: Qs = alpha x Su x pile perimeter x embedded length, where alpha is an empirical adhesion factor (from a site-specific correlation chart, e.g. API RP2A) and Su is the soil's undrained shear strength"
      ],
      "vectors": [
        {
          "name": "Su=50kPa, α=0.5, 0.4m diameter, 10m embedded",
          "inputs": {
            "undrainedShearStrength": 50000,
            "adhesionFactor": 0.5,
            "pileDiameter": 0.4,
            "embeddedLength": 10
          },
          "expected": 314.16,
          "toleranceDecimalPlaces": -1,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Pile perimeter",
              "value": 1.2566370614359172,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Su=80kPa, α=0.4, 0.5m diameter, 15m embedded",
          "inputs": {
            "undrainedShearStrength": 80000,
            "adhesionFactor": 0.4,
            "pileDiameter": 0.5,
            "embeddedLength": 15
          },
          "expected": 753.98,
          "toleranceDecimalPlaces": -1,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Pile perimeter",
              "value": 1.5707963267948966,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "driveway-calculator",
      "title": "Concrete Driveway Calculator",
      "url": "https://craftquantities.com/calculators/auto-utility/driveway-calculator/",
      "sources": [
        "Residential driveways commonly use a 4-6 in concrete slab over a 4-6 in compacted gravel base for drainage and stability",
        "Volume formula: length x width x depth / 27 = cubic yards"
      ],
      "vectors": [
        {
          "name": "12x3m driveway, 0.125m concrete, 0.1m gravel",
          "inputs": {
            "drivewayLength": 12,
            "drivewayWidth": 3,
            "concreteThickness": 0.125,
            "gravelBaseThickness": 0.1
          },
          "expected": 5.89,
          "toleranceDecimalPlaces": 1,
          "unit": "cubic yards (concrete)",
          "confidence": "high",
          "steps": [
            {
              "label": "Driveway area",
              "value": 36,
              "unit": "m²"
            },
            {
              "label": "Gravel base needed",
              "value": 4.708622229531812,
              "unit": "cubic yards"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "15x5.5m double driveway, 0.15m concrete, 0.15m gravel",
          "inputs": {
            "drivewayLength": 15,
            "drivewayWidth": 5.5,
            "concreteThickness": 0.15,
            "gravelBaseThickness": 0.15
          },
          "expected": 16.19,
          "toleranceDecimalPlaces": 1,
          "unit": "cubic yards (concrete)",
          "confidence": "high",
          "steps": [
            {
              "label": "Driveway area",
              "value": 82.5,
              "unit": "m²"
            },
            {
              "label": "Gravel base needed",
              "value": 16.185888914015603,
              "unit": "cubic yards"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "driveway-heating-cable-calculator",
      "title": "Driveway Snow Melt Cable Calculator",
      "url": "https://craftquantities.com/calculators/auto-utility/driveway-heating-cable-calculator/",
      "sources": [
        "Standard radiant cable industry formula: cable length (ft) = area (sq ft) x (12 / cable spacing in inches)"
      ],
      "vectors": [
        {
          "name": "20m² area, 3in spacing",
          "inputs": {
            "drivewayArea": 20,
            "cableSpacingIn": "3"
          },
          "expected": 947.2,
          "toleranceDecimalPlaces": 1,
          "unit": "linear ft of cable",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cable length before connection allowance",
              "value": 861.1128333367777,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "40m² area, 4in spacing",
          "inputs": {
            "drivewayArea": 40,
            "cableSpacingIn": "4"
          },
          "expected": 1420.8,
          "toleranceDecimalPlaces": 1,
          "unit": "linear ft of cable",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cable length before connection allowance",
              "value": 1291.6692500051665,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "driveway-throat-queue-length-calculator",
      "title": "Driveway Throat Queue Length Calculator",
      "url": "https://craftquantities.com/calculators/heavy-civil/driveway-throat-queue-length-calculator/",
      "sources": [
        "Single-server queueing model: with demand-to-capacity ratio p, the chance that n or more vehicles are present is p to the power n, so the queue not exceeded in a chosen fraction of the peak hour is ln(1 − fraction) ÷ ln(p). Throat length is that queue times the storage length per vehicle, plus an allowance at the head for the longest vehicle expected.",
        "ITE Trip Generation Manual and ITE Parking Generation Manual — where the peak arrival volume this model is driven with comes from. Neither publishes a throat length.",
        "Local access management standards set the minimum throat length and the design percentile for a given access class. This page is the arithmetic behind that requirement, not a substitute for the adopted figure."
      ],
      "vectors": [
        {
          "name": "180 arrivals against 300 served, 95th percentile",
          "inputs": {
            "arrivalRate": 180,
            "serviceRate": 300,
            "designPercentile": "0.95",
            "storageLength": 7.6,
            "designVehicleAllowance": 3.5
          },
          "expected": 49.1,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Design queue",
              "value": 6,
              "unit": "vehicles"
            },
            {
              "label": "Demand against capacity",
              "value": 0.6,
              "unit": "ratio"
            },
            {
              "label": "Storage applied per queued vehicle",
              "value": 7.6,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "240 against 360 with a long design vehicle",
          "inputs": {
            "arrivalRate": 240,
            "serviceRate": 360,
            "designPercentile": "0.95",
            "storageLength": 7,
            "designVehicleAllowance": 6
          },
          "expected": 62,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Design queue",
              "value": 8,
              "unit": "vehicles"
            },
            {
              "label": "Demand against capacity",
              "value": 0.6666666666666666,
              "unit": "ratio"
            },
            {
              "label": "Storage applied per queued vehicle",
              "value": 7,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Quiet approach, 100 against 400, 85th percentile",
          "inputs": {
            "arrivalRate": 100,
            "serviceRate": 400,
            "designPercentile": "0.85",
            "storageLength": 7.6,
            "designVehicleAllowance": 3.5
          },
          "expected": 18.7,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Design queue",
              "value": 2,
              "unit": "vehicles"
            },
            {
              "label": "Demand against capacity",
              "value": 0.25,
              "unit": "ratio"
            },
            {
              "label": "Storage applied per queued vehicle",
              "value": 7.6,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "drop-ceiling-grid-calculator",
      "title": "Drop or Suspended Ceiling Grid Calculator — Main Tees, Cross Tees, Wall Angle and Hangers",
      "url": "https://craftquantities.com/calculators/renovation-construction/drop-ceiling-grid-calculator/",
      "sources": [
        "Armstrong World Industries, How to Install Your Armstrong Suspended Ceiling (general installation instructions): main beams installed perpendicular to the joists on 4' centres; snap chalk lines for main beams 4' apart and screw in wire fasteners 4' apart; cross tees 2' apart for 2' x 4' panels; border panels the same size on opposite sides and as large as possible, found from the remainder plus one panel length divided by two (the sample 9' x 10' 6\" room: 2' 6\" and 1' 3\" borders); for 2' x 2' panels the first main beam at the border panel size or the border panel + 24\" from the wall; additional hanger wires may be needed for light fixtures",
        "Kanopi by Armstrong, How to Install Drop Ceilings: main beams carry the load of the grid, typically 12' or 6'; cross tees attach perpendicular to the main beams to make the 24\" x 24\" or 24\" x 48\" openings; wall moldings finish the perimeter; hanger wires attach to the joists; the left-over ends of cut main beams start additional rows",
        "Kanopi by Armstrong, ceiling grid range: 12' Wall Molding, Prelude 12' Heavy Duty Main Beam, Prelude 2' Cross Tee",
        "Judge Ceilings, Armstrong Ceiling Grid (UK merchant listing): 3.6m Armstrong Prelude Main Tees; Armstrong Prelude 1200mm Cross Tee; Armstrong Prelude 600mm Cross Tee; Armstrong Prelude Wall Angle 3m"
      ],
      "vectors": [
        {
          "name": "Armstrong's sample room, 9 ft x 10 ft 6 in, 2 x 4 panels, mains along the 10 ft 6 in side",
          "inputs": {
            "roomLength": 3.2004,
            "roomWidth": 2.7432000000000003,
            "panelSize": "2x4",
            "mainDirection": "length",
            "mainStockLength": 3.6576000000000004,
            "wallAngleStockLength": 3.6576000000000004,
            "hangerInterval": 1.2192
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "main beams",
          "confidence": "high",
          "steps": [
            {
              "label": "Lines of main beams",
              "value": 2,
              "unit": "lines"
            },
            {
              "label": "Long cross tees, border tees included",
              "value": 15,
              "unit": "tees"
            },
            {
              "label": "Short cross tees, for 2 x 2 panels",
              "value": 0,
              "unit": "tees"
            },
            {
              "label": "Wall angle pieces",
              "value": 4,
              "unit": "pieces"
            },
            {
              "label": "Hanger wires",
              "value": 6,
              "unit": "wires"
            },
            {
              "label": "Border across the mains, at each wall",
              "value": 0.7620000000000001,
              "unit": "m"
            },
            {
              "label": "Border along the mains, at each end",
              "value": 0.38100000000000006,
              "unit": "m"
            },
            {
              "label": "Perimeter for the wall angle",
              "value": 11.8872,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A 5 x 4 m room of 2 x 2 panels on the 2 ft module, 12 ft (3.66 m) mains along the length",
          "inputs": {
            "roomLength": 5,
            "roomWidth": 4,
            "panelSize": "2x2",
            "mainDirection": "length",
            "mainStockLength": 3.66,
            "wallAngleStockLength": 3.66,
            "hangerInterval": 1.2
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "main beams",
          "confidence": "high",
          "steps": [
            {
              "label": "Lines of main beams",
              "value": 3,
              "unit": "lines"
            },
            {
              "label": "Long cross tees, border tees included",
              "value": 32,
              "unit": "tees"
            },
            {
              "label": "Short cross tees, for 2 x 2 panels",
              "value": 27,
              "unit": "tees"
            },
            {
              "label": "Wall angle pieces",
              "value": 5,
              "unit": "pieces"
            },
            {
              "label": "Hanger wires",
              "value": 15,
              "unit": "wires"
            },
            {
              "label": "Border across the mains, at each wall",
              "value": 0.4759999999999998,
              "unit": "m"
            },
            {
              "label": "Border along the mains, at each end",
              "value": 0.3663999999999999,
              "unit": "m"
            },
            {
              "label": "Perimeter for the wall angle",
              "value": 18,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A 10 x 3 m corridor of 2 x 4 panels on the 2 ft module, 12 ft (3.66 m) mains run across it",
          "inputs": {
            "roomLength": 10,
            "roomWidth": 3,
            "panelSize": "2x4",
            "mainDirection": "width",
            "mainStockLength": 3.66,
            "wallAngleStockLength": 3.66,
            "hangerInterval": 1.2
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "main beams",
          "confidence": "high",
          "steps": [
            {
              "label": "Lines of main beams",
              "value": 8,
              "unit": "lines"
            },
            {
              "label": "Long cross tees, border tees included",
              "value": 36,
              "unit": "tees"
            },
            {
              "label": "Short cross tees, for 2 x 2 panels",
              "value": 0,
              "unit": "tees"
            },
            {
              "label": "Wall angle pieces",
              "value": 8,
              "unit": "pieces"
            },
            {
              "label": "Hanger wires",
              "value": 24,
              "unit": "wires"
            },
            {
              "label": "Border across the mains, at each wall",
              "value": 0.7327999999999998,
              "unit": "m"
            },
            {
              "label": "Border along the mains, at each end",
              "value": 0.5855999999999999,
              "unit": "m"
            },
            {
              "label": "Perimeter for the wall angle",
              "value": 26,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "drywall-butt-joint-backing-calculator",
      "title": "Gypsum Board Butt Joint Backing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/drywall-butt-joint-backing-calculator/",
      "sources": [
        "Backing length = number of unsupported butt joints × the backing piece length spanning each joint, ensuring every joint has solid backing even where it falls between framing members"
      ],
      "vectors": [
        {
          "name": "4 joints, 1.2m backing each",
          "inputs": {
            "unsupportedJointCount": 4,
            "jointLength": 1.2
          },
          "expected": 4.8,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "6 joints, 2.4m backing each",
          "inputs": {
            "unsupportedJointCount": 6,
            "jointLength": 2.4
          },
          "expected": 14.4,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "drywall-calculator",
      "title": "Drywall Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/drywall-calculator/",
      "sources": [
        "Standard drywall sheet size is 4 ft x 8 ft (32 sq ft / 2.973 m²) in North America and 2400 x 1200 mm (2.88 m²) in metric markets — the most common sizes sold for wall installation",
        "10-15% waste factor is standard industry practice for rooms with doors, windows, and outlet cutouts",
        "Joint tape: approximately 370 linear ft per 1,000 sq ft of drywall area (common manufacturer/retail estimating rule); screws: approximately 32 per standard sheet — 4x8 ft or 2400x1200 mm, within 3% of each other in area — on 16 in o.c. framing"
      ],
      "vectors": [
        {
          "name": "4x3.5m room, 2.4m walls, one 0.9x2.1m door, two 1.2x1.2m windows, 10% waste",
          "inputs": {
            "roomLength": 4,
            "roomWidth": 3.5,
            "wallHeight": 2.4,
            "doorCount": 1,
            "windowCount": 2,
            "wasteFactorPercent": 10,
            "doorArea": 1.89,
            "windowArea": 1.44
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets (4x8 ft)",
          "confidence": "high",
          "steps": [
            {
              "label": "Gross wall area",
              "value": 36,
              "unit": "m²"
            },
            {
              "label": "Doors + windows area (subtracted)",
              "value": 4.77,
              "unit": "m²"
            },
            {
              "label": "Net wall area",
              "value": 31.23,
              "unit": "m²"
            },
            {
              "label": "Area with waste factor",
              "value": 34.353,
              "unit": "m²"
            },
            {
              "label": "Joint tape needed",
              "value": 124.3780612561225,
              "unit": "linear ft"
            },
            {
              "label": "Drywall screws needed",
              "value": 384,
              "unit": "screws"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a wide garden door taking 8 m² off a 3x3m room's walls, 2.4m high, 10% waste",
          "inputs": {
            "roomLength": 3,
            "roomWidth": 3,
            "wallHeight": 2.4,
            "doorCount": 1,
            "windowCount": 0,
            "wasteFactorPercent": 10,
            "doorArea": 8
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets (4x8 ft)",
          "confidence": "high",
          "steps": [
            {
              "label": "Gross wall area",
              "value": 28.799999999999997,
              "unit": "m²"
            },
            {
              "label": "Doors + windows area (subtracted)",
              "value": 8,
              "unit": "m²"
            },
            {
              "label": "Net wall area",
              "value": 20.799999999999997,
              "unit": "m²"
            },
            {
              "label": "Area with waste factor",
              "value": 22.88,
              "unit": "m²"
            },
            {
              "label": "Joint tape needed",
              "value": 82.83905456699802,
              "unit": "linear ft"
            },
            {
              "label": "Drywall screws needed",
              "value": 256,
              "unit": "screws"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "4x3.5m room, 2.4m walls, 1 door, 2 windows, 10% waste",
          "inputs": {
            "roomLength": 4,
            "roomWidth": 3.5,
            "wallHeight": 2.4,
            "doorCount": 1,
            "windowCount": 2,
            "wasteFactorPercent": 10
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets (4x8 ft)",
          "confidence": "high",
          "steps": [
            {
              "label": "Gross wall area",
              "value": 36,
              "unit": "m²"
            },
            {
              "label": "Doors + windows area (subtracted)",
              "value": 4.75,
              "unit": "m²"
            },
            {
              "label": "Net wall area",
              "value": 31.25,
              "unit": "m²"
            },
            {
              "label": "Area with waste factor",
              "value": 34.375,
              "unit": "m²"
            },
            {
              "label": "Joint tape needed",
              "value": 124.45771419320614,
              "unit": "linear ft"
            },
            {
              "label": "Drywall screws needed",
              "value": 384,
              "unit": "screws"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "5x4m room, 2.5m walls, no openings, 15% waste",
          "inputs": {
            "roomLength": 5,
            "roomWidth": 4,
            "wallHeight": 2.5,
            "doorCount": 0,
            "windowCount": 0,
            "wasteFactorPercent": 15
          },
          "expected": 18,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets (4x8 ft)",
          "confidence": "high",
          "steps": [
            {
              "label": "Gross wall area",
              "value": 45,
              "unit": "m²"
            },
            {
              "label": "Doors + windows area (subtracted)",
              "value": 0,
              "unit": "m²"
            },
            {
              "label": "Net wall area",
              "value": 45,
              "unit": "m²"
            },
            {
              "label": "Area with waste factor",
              "value": 51.74999999999999,
              "unit": "m²"
            },
            {
              "label": "Joint tape needed",
              "value": 179.21910843821686,
              "unit": "linear ft"
            },
            {
              "label": "Drywall screws needed",
              "value": 576,
              "unit": "screws"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "drywall-ceiling-fastening-calculator",
      "title": "Drywall Ceiling Screw Count Calculator (Fastening Schedule)",
      "url": "https://craftquantities.com/calculators/materials-quantities/drywall-ceiling-fastening-calculator/",
      "sources": [
        "Screw count = ceil(ceiling area ÷ (screw spacing)²), applying a uniform grid spacing — ceiling fastening schedules are typically tighter (commonly 12 in o.c. both ways) than wall fastening"
      ],
      "vectors": [
        {
          "name": "20m² ceiling, 0.3m grid",
          "inputs": {
            "ceilingArea": 20,
            "screwSpacing": 0.3
          },
          "expected": 223,
          "toleranceDecimalPlaces": -1,
          "unit": "screws",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30m² ceiling, 0.3m grid",
          "inputs": {
            "ceilingArea": 30,
            "screwSpacing": 0.3
          },
          "expected": 334,
          "toleranceDecimalPlaces": -1,
          "unit": "screws",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "drywall-corner-bead-calculator",
      "title": "Drywall Corner Bead Linear Footage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/drywall-corner-bead-calculator/",
      "sources": [
        "Total corner bead = total outside corner length × (1 + waste allowance), accounting for offcuts at each corner"
      ],
      "vectors": [
        {
          "name": "25m corners, 5% waste",
          "inputs": {
            "totalCornerLength": 25,
            "wastePercent": 5
          },
          "expected": 26.25,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "40m corners, 8% waste",
          "inputs": {
            "totalCornerLength": 40,
            "wastePercent": 8
          },
          "expected": 43.2,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "drywall-joint-compound-calculator",
      "title": "Drywall Joint Compound Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/drywall-joint-compound-calculator/",
      "sources": [
        "A standard 4.5-gallon box of all-purpose joint compound — 61.7 lb (28 kg) net — covers approximately 500 sq ft (46 m²) of drywall for a full 3-coat finish (embedding, fill, and finish coats), per common manufacturer spec sheets. That box is a North American product; metric markets sell ready-mixed jointing compound in tubs quoted by weight rather than in a fixed box size, so on metric the answer is given as the mass of compound required (about 0.6 kg/m²)"
      ],
      "vectors": [
        {
          "name": "40m² drywall area",
          "inputs": {
            "drywallArea": 40
          },
          "expected": 1,
          "toleranceDecimalPlaces": 0,
          "unit": "x 4.5 gal boxes",
          "confidence": "medium",
          "steps": [
            {
              "label": "Area to finish (with waste)",
              "value": 473.6120583352278,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150m² drywall area",
          "inputs": {
            "drywallArea": 150
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "x 4.5 gal boxes",
          "confidence": "medium",
          "steps": [
            {
              "label": "Area to finish (with waste)",
              "value": 1776.0452187571043,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "40m² at a 20% loss tips into a second box",
          "inputs": {
            "drywallArea": 40,
            "wastePercent": 20
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "x 4.5 gal boxes",
          "confidence": "medium",
          "steps": [
            {
              "label": "Area to finish (with waste)",
              "value": 516.6677000020666,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "drywall-joint-tape-calculator",
      "title": "Drywall Joint Tape Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/drywall-joint-tape-calculator/",
      "sources": [
        "Flat-joint length is derived, not tabulated: in a field of sheets each board contributes half its own perimeter to shared joints, so a w x l sheet gives (w + l) metres of joint per (w x l) square metres. A 1.2 x 2.4 m board therefore produces exactly 1.25 m of flat joint per square metre, a 1.2 x 3.0 m board 1.1667 m, and a 1.2 x 3.6 m board 1.1111 m",
        "Angle length — wall to ceiling, internal corners, external angles — is a property of the room rather than of the board, so it is entered separately rather than blended into a per-area rate",
        "A 10% allowance covers the overlap at tape ends, the piece cut short and thrown, and the run spoiled in bedding"
      ],
      "vectors": [
        {
          "name": "40 m² on 2.4 m board, 30 m of angles",
          "inputs": {
            "boardArea": 40,
            "sheetLength": "2.4",
            "angleLength": 30
          },
          "expected": 288.71,
          "toleranceDecimalPlaces": 1,
          "unit": "ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Flat joints from the board layout",
              "value": 164.04199475065616,
              "unit": "ft"
            },
            {
              "label": "Angles entered",
              "value": 98.42519685039369,
              "unit": "ft"
            },
            {
              "label": "Allowance at 10%",
              "value": 26.246719160104984,
              "unit": "ft"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "the same wall on 3.6 m board takes less tape",
          "inputs": {
            "boardArea": 40,
            "sheetLength": "3.6",
            "angleLength": 30
          },
          "expected": 268.66,
          "toleranceDecimalPlaces": 1,
          "unit": "ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Flat joints from the board layout",
              "value": 145.81510644502768,
              "unit": "ft"
            },
            {
              "label": "Angles entered",
              "value": 98.42519685039369,
              "unit": "ft"
            },
            {
              "label": "Allowance at 10%",
              "value": 24.424030329542134,
              "unit": "ft"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "the same 40 m² with no allowance added",
          "inputs": {
            "boardArea": 40,
            "sheetLength": "2.4",
            "angleLength": 30,
            "wastePercent": 0
          },
          "expected": 262.47,
          "toleranceDecimalPlaces": 1,
          "unit": "ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Flat joints from the board layout",
              "value": 164.04199475065616,
              "unit": "ft"
            },
            {
              "label": "Angles entered",
              "value": 98.42519685039369,
              "unit": "ft"
            },
            {
              "label": "Allowance at 0%",
              "value": 0,
              "unit": "ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "flat joints alone, no angles entered",
          "inputs": {
            "boardArea": 100,
            "sheetLength": "2.4",
            "angleLength": 0
          },
          "expected": 451.12,
          "toleranceDecimalPlaces": 1,
          "unit": "ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Flat joints from the board layout",
              "value": 410.1049868766404,
              "unit": "ft"
            },
            {
              "label": "Angles entered",
              "value": 0,
              "unit": "ft"
            },
            {
              "label": "Allowance at 10%",
              "value": 41.01049868766404,
              "unit": "ft"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "drywall-kerf-cut-calculator",
      "title": "Curved Wall Drywall Kerf Cut Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/drywall-kerf-cut-calculator/",
      "sources": [
        "Kerf cut count = ceil(sheet length ÷ kerf spacing) + 1, evenly spacing relief cuts across the back of a drywall sheet so it can flex around a curved framing radius"
      ],
      "vectors": [
        {
          "name": "2.4m sheet, 0.15m kerf spacing",
          "inputs": {
            "sheetLength": 2.4,
            "kerfSpacing": 0.15
          },
          "expected": 15,
          "toleranceDecimalPlaces": 0,
          "unit": "cuts",
          "confidence": "medium",
          "steps": [
            {
              "label": "Strips the cuts divide the sheet into",
              "value": 16
            },
            {
              "label": "Strip width between cuts",
              "value": 0.15,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1.2m sheet, 0.1m kerf spacing",
          "inputs": {
            "sheetLength": 1.2,
            "kerfSpacing": 0.1
          },
          "expected": 11,
          "toleranceDecimalPlaces": 0,
          "unit": "cuts",
          "confidence": "medium",
          "steps": [
            {
              "label": "Strips the cuts divide the sheet into",
              "value": 12
            },
            {
              "label": "Strip width between cuts",
              "value": 0.09999999999999999,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "drywall-lamination-adhesive-calculator",
      "title": "Double-Layer Drywall Lamination Adhesive Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/drywall-lamination-adhesive-calculator/",
      "sources": [
        "Laminating adhesive mass = wall/ceiling area × the adhesive's published spread rate (kg per m²)"
      ],
      "vectors": [
        {
          "name": "40m² area, 0.5 kg/m²",
          "inputs": {
            "area": 40,
            "spreadRate": 0.5
          },
          "expected": 20,
          "toleranceDecimalPlaces": 0,
          "unit": "kg",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "60m² area, 0.6 kg/m²",
          "inputs": {
            "area": 60,
            "spreadRate": 0.6
          },
          "expected": 36,
          "toleranceDecimalPlaces": 0,
          "unit": "kg",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "drywall-screw-count-calculator",
      "title": "Drywall Screw Count Calculator (Field + Perimeter Spacing)",
      "url": "https://craftquantities.com/calculators/materials-quantities/drywall-screw-count-calculator/",
      "sources": [
        "Perimeter screws per sheet = ceil(sheet perimeter ÷ perimeter spacing); field screws per sheet = ceil((sheet width − field spacing) × (sheet height − field spacing) ÷ field spacing grid area), the interior the perimeter row does not already cover; total = (perimeter + field) × sheet count"
      ],
      "vectors": [
        {
          "name": "1.2x2.4m sheet, 0.3m perimeter, 0.4m field, 20 sheets",
          "inputs": {
            "sheetWidth": 1.2,
            "sheetHeight": 2.4,
            "perimeterSpacing": 0.3,
            "fieldSpacing": 0.4,
            "sheetCount": 20
          },
          "expected": 680,
          "toleranceDecimalPlaces": 0,
          "unit": "screws",
          "confidence": "high",
          "steps": [
            {
              "label": "Screws per sheet",
              "value": 34
            },
            {
              "label": "Screw centres round the sheet edge",
              "value": 0.3,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1.2x2.4m sheet, 0.3m perimeter, 0.3m field, 18 sheets",
          "inputs": {
            "sheetWidth": 1.2,
            "sheetHeight": 2.4,
            "perimeterSpacing": 0.3,
            "fieldSpacing": 0.3,
            "sheetCount": 18
          },
          "expected": 810,
          "toleranceDecimalPlaces": 0,
          "unit": "screws",
          "confidence": "high",
          "steps": [
            {
              "label": "Screws per sheet",
              "value": 45
            },
            {
              "label": "Screw centres round the sheet edge",
              "value": 0.3,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "drywall-sheets-to-square-feet-calculator",
      "title": "Drywall Sheets to Square Feet Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/drywall-sheets-to-square-feet-calculator/",
      "sources": [
        "4 ft x 8 ft = 32 sq ft per sheet"
      ],
      "vectors": [
        {
          "name": "30 sheets converts correctly",
          "inputs": {
            "sheets": 30
          },
          "expected": 960,
          "toleranceDecimalPlaces": 6,
          "unit": "sq ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 32,
              "unit": "sq ft per sheets"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "sheets": 300
          },
          "expected": 9600,
          "toleranceDecimalPlaces": 6,
          "unit": "sq ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 32,
              "unit": "sq ft per sheets"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "drywall-stud-adhesive-calculator",
      "title": "Drywall Stud Adhesive Cartridge Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/drywall-stud-adhesive-calculator/",
      "sources": [
        "ASTM C557, Standard Specification for Adhesives for Fastening Gypsum Wallboard to Wood Framing, is the specification the adhesive itself is bought against; it defines the product rather than the quantity a wall consumes",
        "Gypsum Association GA-216, Application and Finishing of Gypsum Panel Products, covers adhesive application to framing and the fastening that goes with it — the bead size and the field fastener spacing permitted alongside adhesive come from it and from the adhesive manufacturer's printed instructions, and both are entered here",
        "Bead volume is the geometry of a cylinder: pi/4 times the bead diameter squared, times the bead length. Published coverage per cartridge always falls short of that ideal, which is what the waste allowance covers — a rule of thumb rather than a measured figure"
      ],
      "vectors": [
        {
          "name": "7.2 m wall at 2.4384 m high, studs at 406 mm, 9.525 mm bead, 858 mL tubes, 15% waste",
          "inputs": {
            "wallLength": 7.2,
            "wallHeight": 2.4384,
            "studSpacing": 0.4064,
            "beadDiameter": 0.009525,
            "cartridgeVolume": 858,
            "wasteAllowance": 15,
            "fieldFastenerSpacing": 0.6096
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "cartridges",
          "confidence": "medium",
          "steps": [
            {
              "label": "Studs receiving a bead",
              "value": 19,
              "unit": "studs"
            },
            {
              "label": "Bead applied",
              "value": 46.3296,
              "unit": "m"
            },
            {
              "label": "Adhesive volume including waste",
              "value": 3796.437381628323,
              "unit": "mL"
            },
            {
              "label": "Field fasteners into the studs",
              "value": 95,
              "unit": "fasteners"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "12 m wall at 2.7 m high, studs at 610 mm, 6.35 mm bead, 300 mL tubes, 10% waste",
          "inputs": {
            "wallLength": 12,
            "wallHeight": 2.7,
            "studSpacing": 0.6096,
            "beadDiameter": 0.00635,
            "cartridgeVolume": 300,
            "wasteAllowance": 10,
            "fieldFastenerSpacing": 0.4064
          },
          "expected": 7,
          "toleranceDecimalPlaces": 0,
          "unit": "cartridges",
          "confidence": "medium",
          "steps": [
            {
              "label": "Studs receiving a bead",
              "value": 21,
              "unit": "studs"
            },
            {
              "label": "Bead applied",
              "value": 56.7,
              "unit": "m"
            },
            {
              "label": "Adhesive volume including waste",
              "value": 1975.2090919569337,
              "unit": "mL"
            },
            {
              "label": "Field fasteners into the studs",
              "value": 147,
              "unit": "fasteners"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "drywall-texture-coverage-calculator",
      "title": "Drywall Texture Spray Material Coverage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/drywall-texture-coverage-calculator/",
      "sources": [
        "Texture material needed = area ÷ the product's rated coverage (area covered per unit volume), the same coverage-rate method used for paint and primer"
      ],
      "vectors": [
        {
          "name": "40m² area, 8m²/L coverage",
          "inputs": {
            "area": 40,
            "coverageRate": 8
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "60m² area, 10m²/L coverage",
          "inputs": {
            "area": 60,
            "coverageRate": 10
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "duct-air-velocity-calculator",
      "title": "Duct Air Velocity Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/duct-air-velocity-calculator/",
      "sources": [
        "Velocity (ft/min) = Airflow (CFM) ÷ Duct Cross-Sectional Area (ft²), the basic continuity relationship. Typical recommended duct velocity ranges (widely-cited ASHRAE/SMACNA design guidance, not a hard code limit): residential supply trunk ~700-900 fpm, residential branch ~500-700 fpm, commercial main duct ~1000-1500+ fpm — actual limits are set by noise, energy, and space constraints on each specific project."
      ],
      "vectors": [
        {
          "name": "800 CFM through 0.89 ft² duct",
          "inputs": {
            "airflow": 377.558,
            "ductCrossSectionArea": 0.082684
          },
          "expected": 898.88,
          "toleranceDecimalPlaces": 1,
          "unit": "ft/min",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1200 CFM through 1.0 ft² duct",
          "inputs": {
            "airflow": 566.3369,
            "ductCrossSectionArea": 0.092903
          },
          "expected": 1200,
          "toleranceDecimalPlaces": 0,
          "unit": "ft/min",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "duct-design-friction-rate-calculator",
      "title": "Duct Design Friction Rate Calculator (ACCA Manual D)",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/duct-design-friction-rate-calculator/",
      "sources": [
        "ACCA Manual D, Residential Duct Systems — the friction rate worksheet: available static pressure = the blower's external static pressure at the design airflow − the component pressure drops; friction rate = available static pressure × 100 ÷ total effective length",
        "Total effective length = the longest supply run plus the longest return run, each with the equivalent length of its fittings"
      ],
      "vectors": [
        {
          "name": "0.5 in. w.g. blower, 0.36 in. of components, 350 ft of effective length",
          "inputs": {
            "blowerEsp": 124.54445415,
            "coilDrop": 49.81778166000001,
            "filterDrop": 24.908890830000004,
            "supplyOutletDrop": 7.472667249000001,
            "returnGrilleDrop": 7.472667249000001,
            "otherDrop": 0,
            "supplyLength": 76.2,
            "returnLength": 30.48
          },
          "expected": 0.326888,
          "toleranceDecimalPlaces": 5,
          "unit": "Pa/m",
          "confidence": "high",
          "steps": [
            {
              "label": "The components' pressure drops together",
              "value": 89.672006988,
              "unit": "Pa"
            },
            {
              "label": "Available static pressure for the ducts",
              "value": 34.872447162,
              "unit": "Pa"
            },
            {
              "label": "Total effective length, supply plus return",
              "value": 106.68,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "0.8 in. w.g. blower, 0.46 in. of components, 300 ft",
          "inputs": {
            "blowerEsp": 199.27112664000003,
            "coilDrop": 62.272227075,
            "filterDrop": 37.363336245,
            "supplyOutletDrop": 7.472667249000001,
            "returnGrilleDrop": 7.472667249000001,
            "otherDrop": 0,
            "supplyLength": 60.96,
            "returnLength": 30.48
          },
          "expected": 0.926184,
          "toleranceDecimalPlaces": 5,
          "unit": "Pa/m",
          "confidence": "high",
          "steps": [
            {
              "label": "The components' pressure drops together",
              "value": 114.580897818,
              "unit": "Pa"
            },
            {
              "label": "Available static pressure for the ducts",
              "value": 84.69022882200004,
              "unit": "Pa"
            },
            {
              "label": "Total effective length, supply plus return",
              "value": 91.44,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Components that use up the blower leave nothing for the ducts",
          "inputs": {
            "blowerEsp": 74.72667249,
            "coilDrop": 49.81778166000001,
            "filterDrop": 37.363336245,
            "supplyOutletDrop": 7.472667249000001,
            "returnGrilleDrop": 7.472667249000001,
            "otherDrop": 0,
            "supplyLength": 76.2,
            "returnLength": 30.48
          },
          "expected": 0,
          "toleranceDecimalPlaces": 5,
          "unit": "Pa/m",
          "confidence": "high",
          "steps": [
            {
              "label": "The components' pressure drops together",
              "value": 102.126452403,
              "unit": "Pa"
            },
            {
              "label": "Available static pressure for the ducts",
              "value": -27.399779913000003,
              "unit": "Pa"
            },
            {
              "label": "Total effective length, supply plus return",
              "value": 106.68,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "duct-fitting-equivalent-length-calculator",
      "title": "HVAC Duct Fitting Equivalent Length Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/duct-fitting-equivalent-length-calculator/",
      "sources": [
        "Total equivalent length = straight duct length + Σ(fitting count × equivalent length per fitting), the standard SMACNA/ASHRAE method for estimating a duct run's total frictional resistance as a single equivalent straight-duct length. Equivalent length per fitting type/size is read from SMACNA HVAC Duct Design Manual tables or the fitting manufacturer's data — this calculator applies the per-fitting equivalent lengths you supply from that source. This is the ductwork-specific counterpart to the site's pipe-fitting-equivalent-length-calculator, which covers hydronic/plumbing pipe fittings under a different set of tables."
      ],
      "vectors": [
        {
          "name": "50ft straight, 3 elbows @15ft, 1 tee @25ft",
          "inputs": {
            "straightLength": 15.24,
            "elbow90Count": 3,
            "elbow90EqLen": 4.572,
            "teeCount": 1,
            "teeEqLen": 7.62
          },
          "expected": 36.576,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Fitting-contributed equivalent length",
              "value": 21.336000000000002,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "80ft straight, 5 elbows @12ft, 2 tees @30ft",
          "inputs": {
            "straightLength": 24.38,
            "elbow90Count": 5,
            "elbow90EqLen": 3.658,
            "teeCount": 2,
            "teeEqLen": 9.14
          },
          "expected": 60.95,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Fitting-contributed equivalent length",
              "value": 36.57,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "duct-hanger-spacing-calculator",
      "title": "HVAC Duct Hanger Support Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/duct-hanger-spacing-calculator/",
      "sources": [
        "Number of hangers = ceil(Duct Run Length ÷ Maximum Hanger Spacing) + 1, the standard support-count method applied to SMACNA HVAC Duct Construction Standards maximum hanger spacing requirements, which vary by duct size, gauge, and construction type — this is the ductwork-specific counterpart to the site's pipe-hanger-spacing-calculator, which covers hydronic/plumbing pipe under a different set of code tables."
      ],
      "vectors": [
        {
          "name": "12.19m run at 2.44m max spacing",
          "inputs": {
            "runLength": 12.19,
            "maxHangerSpacing": 2.44
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "hangers",
          "confidence": "medium",
          "steps": [
            {
              "label": "Bays along the duct run",
              "value": 5
            },
            {
              "label": "Hanger centres along the duct",
              "value": 2.4379999999999997,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "19.51m run at 3.05m max spacing",
          "inputs": {
            "runLength": 19.51,
            "maxHangerSpacing": 3.05
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "hangers",
          "confidence": "medium",
          "steps": [
            {
              "label": "Bays along the duct run",
              "value": 7
            },
            {
              "label": "Hanger centres along the duct",
              "value": 2.7871428571428574,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "duct-insulation-wrap-calculator",
      "title": "Duct Insulation Wrap Area Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/duct-insulation-wrap-calculator/",
      "sources": [
        "Wrap area = duct perimeter × duct length × (1 + waste allowance), the standard method for estimating blanket-style duct insulation wrap that covers the full outer surface of a duct run"
      ],
      "vectors": [
        {
          "name": "1.2m perimeter, 20m run, 10% waste",
          "inputs": {
            "ductPerimeter": 1.2,
            "ductLength": 20,
            "wastePercent": 10
          },
          "expected": 26.4,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1.5m perimeter, 25m run, 10% waste",
          "inputs": {
            "ductPerimeter": 1.5,
            "ductLength": 25,
            "wastePercent": 10
          },
          "expected": 41.25,
          "toleranceDecimalPlaces": 2,
          "unit": "m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "duct-leakage-class-calculator",
      "title": "SMACNA Duct Leakage Class Allowable Leakage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/duct-leakage-class-calculator/",
      "sources": [
        "Allowable leakage (CFM per 100 ft² of duct surface) = Leakage Class (CL) × (Test Pressure, in. w.g.)^0.65, per the SMACNA HVAC Air Duct Leakage Test Manual. Total allowable leakage = that rate × (total duct surface area ÷ 100). Common Leakage Class ratings range from CL 3 (very tight, e.g. hospital/cleanroom systems) to CL 24 (typical unsealed low-pressure ductwork), with CL 6 and CL 12 commonly specified for sealed low/medium pressure systems."
      ],
      "vectors": [
        {
          "name": "CL 6, 2 in. w.g., 500 ft² of duct",
          "inputs": {
            "leakageClass": 6,
            "testPressure": 2,
            "ductSurfaceArea": 46.45
          },
          "expected": 47.08,
          "toleranceDecimalPlaces": 1,
          "unit": "CFM",
          "confidence": "high",
          "steps": [
            {
              "label": "Allowable leakage rate per 100 ft² of duct surface",
              "value": 9.415009174761009,
              "unit": "CFM/100 ft²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "CL 12, 4 in. w.g., 800 ft² of duct",
          "inputs": {
            "leakageClass": 12,
            "testPressure": 4,
            "ductSurfaceArea": 74.32
          },
          "expected": 236.38,
          "toleranceDecimalPlaces": 1,
          "unit": "CFM",
          "confidence": "high",
          "steps": [
            {
              "label": "Allowable leakage rate per 100 ft² of duct surface",
              "value": 29.547465920277993,
              "unit": "CFM/100 ft²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "duct-sealing-mastic-calculator",
      "title": "Duct Sealing Mastic Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/duct-sealing-mastic-calculator/",
      "sources": [
        "Coverage derived from the applied geometry rather than quoted: a US quart is 57.75 in³, and a 2 in wide band at the ~1/16 in wet thickness duct mastic is brushed at gives about 38 linear ft per quart. A 3 in band at the same thickness gives about 26 ft",
        "The widely published '100 linear ft' coverage figure for duct mastic is per GALLON, not per quart — four quarts — which is about 26 ft per quart and consistent with a 3 in band"
      ],
      "vectors": [
        {
          "name": "15m of duct seams",
          "inputs": {
            "totalSeamLength": 15
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "quarts",
          "confidence": "medium",
          "steps": [
            {
              "label": "Seam length (with waste)",
              "value": 54.13385826771653,
              "unit": "linear ft"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "40m of duct seams",
          "inputs": {
            "totalSeamLength": 40
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "quarts",
          "confidence": "medium",
          "steps": [
            {
              "label": "Seam length (with waste)",
              "value": 144.35695538057743,
              "unit": "linear ft"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "35m of seams with no brushing allowance",
          "inputs": {
            "totalSeamLength": 35,
            "wastePercent": 0
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "quarts",
          "confidence": "medium",
          "steps": [
            {
              "label": "Seam length (with waste)",
              "value": 114.82939632545931,
              "unit": "linear ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "duct-silencer-insertion-loss-calculator",
      "title": "HVAC Duct Silencer Cumulative Insertion Loss Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/duct-silencer-insertion-loss-calculator/",
      "sources": [
        "Total system insertion loss (dB) ≈ sum of each component's manufacturer-rated insertion loss, a simplified additive estimating method commonly used for a first-pass HVAC noise control screening per ASHRAE Applications Handbook (Chapter on Noise and Vibration Control) design practice. This does not account for regenerated noise, cross-talk, or flanking, and a full multi-octave-band acoustic analysis by an acoustics engineer is required for critical noise-sensitive spaces."
      ],
      "vectors": [
        {
          "name": "12 + 8 + 5 dB components",
          "inputs": {
            "silencer1Loss": 12,
            "silencer2Loss": 8,
            "silencer3Loss": 5
          },
          "expected": 25,
          "toleranceDecimalPlaces": 0,
          "unit": "dB",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "10 + 8 + 4 dB components",
          "inputs": {
            "silencer1Loss": 10,
            "silencer2Loss": 8,
            "silencer3Loss": 4
          },
          "expected": 22,
          "toleranceDecimalPlaces": 0,
          "unit": "dB",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "duct-size-calculator",
      "title": "Duct Size Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/duct-size-calculator/",
      "sources": [
        "ACCA Manual D — residential duct design; velocity and friction-rate method",
        "ASHRAE Handbook — Fundamentals, Duct Design: recommended residential velocities of 3-5 m/s (600-900 fpm) for branches, up to 6-9 m/s (1200-1800 fpm) for trunks"
      ],
      "vectors": [
        {
          "name": "400 CFM at 700 fpm",
          "inputs": {
            "airflow": 188.779,
            "targetVelocity": 3.556,
            "shape": "round"
          },
          "expected": 10.236,
          "toleranceDecimalPlaces": 2,
          "unit": "in diameter",
          "confidence": "medium",
          "steps": [
            {
              "label": "Duct area",
              "value": 82.28572418899618,
              "unit": "in²"
            },
            {
              "label": "Diameter (mm)",
              "value": 259.9866354700721,
              "unit": "mm"
            },
            {
              "label": "Airflow in L/s",
              "value": 188.7789827199979,
              "unit": "L/s"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Doubling airflow needs √2 times the diameter",
          "inputs": {
            "airflow": 377.558,
            "targetVelocity": 3.556,
            "shape": "round"
          },
          "expected": 14.476,
          "toleranceDecimalPlaces": 2,
          "unit": "in diameter",
          "confidence": "medium",
          "steps": [
            {
              "label": "Duct area",
              "value": 164.57144837799237,
              "unit": "in²"
            },
            {
              "label": "Diameter (mm)",
              "value": 367.67662591752594,
              "unit": "mm"
            },
            {
              "label": "Airflow in L/s",
              "value": 377.5579654399958,
              "unit": "L/s"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A faster velocity allows a smaller duct",
          "inputs": {
            "airflow": 188.779,
            "targetVelocity": 6.096,
            "shape": "round"
          },
          "expected": 7.818,
          "toleranceDecimalPlaces": 2,
          "unit": "in diameter",
          "confidence": "medium",
          "steps": [
            {
              "label": "Duct area",
              "value": 48.00000577691444,
              "unit": "in²"
            },
            {
              "label": "Diameter (mm)",
              "value": 198.56807278641608,
              "unit": "mm"
            },
            {
              "label": "Airflow in L/s",
              "value": 188.7789827199979,
              "unit": "L/s"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "100 CFM branch at 600 fpm",
          "inputs": {
            "airflow": 47.1947,
            "targetVelocity": 3.048,
            "shape": "round"
          },
          "expected": 5.53,
          "toleranceDecimalPlaces": 1,
          "unit": "in diameter",
          "confidence": "medium",
          "steps": [
            {
              "label": "Duct area",
              "value": 23.999977461897178,
              "unit": "in²"
            },
            {
              "label": "Diameter (mm)",
              "value": 140.408756417042,
              "unit": "mm"
            },
            {
              "label": "Airflow in L/s",
              "value": 47.19469568000405,
              "unit": "L/s"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "dumpster-rental-cost-calculator",
      "title": "Dumpster/Container Rental Duration Cost Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/dumpster-rental-cost-calculator/",
      "sources": [
        "Total rental cost = (Daily Rate × Rental Days) + Delivery/Haul Fee — the standard cost structure quoted by most US roll-off dumpster rental haulers, separate from any per-ton or overage disposal fees charged at the landfill (see the related Landfill Tipping Fee calculator for that separate cost)."
      ],
      "vectors": [
        {
          "name": "$15/day, 10 days, $350 haul fee",
          "inputs": {
            "dailyRate": 15,
            "rentalDays": 10,
            "haulFee": 350
          },
          "expected": 500,
          "toleranceDecimalPlaces": 0,
          "unit": "$",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rental days cost",
              "value": 150,
              "unit": "$"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "$20/day, 14 days, $450 haul fee",
          "inputs": {
            "dailyRate": 20,
            "rentalDays": 14,
            "haulFee": 450
          },
          "expected": 730,
          "toleranceDecimalPlaces": 0,
          "unit": "$",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rental days cost",
              "value": 280,
              "unit": "$"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "dumpster-size-selector-calculator",
      "title": "Dumpster/Skip Container Size Selector",
      "url": "https://craftquantities.com/calculators/materials-quantities/dumpster-size-selector-calculator/",
      "sources": [
        "Required capacity = Estimated debris volume ÷ Packing Efficiency (irregular demolition/construction debris does not pack solidly, leaving air gaps — a packing efficiency of roughly 70-80% is a common construction-industry estimating rule of thumb). The calculator then selects the smallest standard US dumpster/skip size (10, 15, 20, 30, or 40 cubic yards — the standard sizes offered by nearly all US roll-off haulers) that meets or exceeds that required capacity."
      ],
      "vectors": [
        {
          "name": "15 yd³ (11,468 L) debris, 75% packing efficiency",
          "inputs": {
            "debrisVolume": 11468.32286976,
            "packingEfficiency": 75
          },
          "expected": 20,
          "toleranceDecimalPlaces": 0,
          "unit": "cubic yards",
          "confidence": "medium",
          "steps": [
            {
              "label": "Required capacity accounting for packing",
              "value": 20,
              "unit": "cubic yards"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "22 yd³ (16,820 L) debris, 75% packing efficiency",
          "inputs": {
            "debrisVolume": 16820.206875648,
            "packingEfficiency": 75
          },
          "expected": 30,
          "toleranceDecimalPlaces": 0,
          "unit": "cubic yards",
          "confidence": "medium",
          "steps": [
            {
              "label": "Required capacity accounting for packing",
              "value": 29.333333333333332,
              "unit": "cubic yards"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "dust-suppression-water-calculator",
      "title": "Jobsite Dust Suppression Water Truck Application Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/dust-suppression-water-calculator/",
      "sources": [
        "Total water needed = Application Rate × Area to be Treated; Truck loads needed = ceil(Total Water ÷ Truck Tank Capacity). Dust suppression application rates vary with soil type, moisture content, wind, and site conditions — the specific rate should come from your site's dust control plan or environmental compliance requirements, not a single universal constant."
      ],
      "vectors": [
        {
          "name": "5,000 m² at 2 L/m², 7,570.8 L truck",
          "inputs": {
            "applicationRate": 2,
            "treatmentArea": 5000,
            "truckCapacity": 7570.8
          },
          "expected": 10000,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Water truck loads needed",
              "value": 2,
              "unit": "loads"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "10,000 m² at 1.5 L/m², 10,000 L truck",
          "inputs": {
            "applicationRate": 1.5,
            "treatmentArea": 10000,
            "truckCapacity": 10000
          },
          "expected": 15000,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Water truck loads needed",
              "value": 2,
              "unit": "loads"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "earned-value-management-calculator",
      "title": "Earned Value Management (EVM) Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/earned-value-management-calculator/",
      "sources": [
        "PMBOK earned value definitions: CV = EV − AC; SV = EV − PV; CPI = EV ÷ AC; SPI = EV ÷ PV",
        "EAC = BAC ÷ CPI where current cost performance is expected to continue; the most commonly used of several sanctioned formulas"
      ],
      "vectors": [
        {
          "name": "Over budget and behind schedule",
          "inputs": {
            "bac": 1000000,
            "pv": 400000,
            "ev": 360000,
            "ac": 420000
          },
          "expected": 1166666.67,
          "toleranceDecimalPlaces": -4,
          "unit": "currency",
          "confidence": "high",
          "steps": [
            {
              "label": "Cost performance index (CPI)",
              "value": 0.8571428571428571
            },
            {
              "label": "Schedule performance index (SPI)",
              "value": 0.9
            },
            {
              "label": "Cost variance (CV)",
              "value": -60000,
              "unit": "currency"
            },
            {
              "label": "Schedule variance (SV)",
              "value": -40000,
              "unit": "currency"
            },
            {
              "label": "Variance at completion (VAC)",
              "value": -166666.66666666674,
              "unit": "currency"
            },
            {
              "label": "Estimate to complete (ETC)",
              "value": 746666.6666666667,
              "unit": "currency"
            },
            {
              "label": "To-complete performance index (TCPI)",
              "value": 1.103448275862069
            },
            {
              "label": "Percent complete",
              "value": 36,
              "unit": "%"
            },
            {
              "label": "Percent spent",
              "value": 42,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Exactly on plan gives EAC equal to BAC",
          "inputs": {
            "bac": 1000000,
            "pv": 400000,
            "ev": 400000,
            "ac": 400000
          },
          "expected": 1000000,
          "toleranceDecimalPlaces": -4,
          "unit": "currency",
          "confidence": "high",
          "steps": [
            {
              "label": "Cost performance index (CPI)",
              "value": 1
            },
            {
              "label": "Schedule performance index (SPI)",
              "value": 1
            },
            {
              "label": "Cost variance (CV)",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Schedule variance (SV)",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Variance at completion (VAC)",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Estimate to complete (ETC)",
              "value": 600000,
              "unit": "currency"
            },
            {
              "label": "To-complete performance index (TCPI)",
              "value": 1
            },
            {
              "label": "Percent complete",
              "value": 40,
              "unit": "%"
            },
            {
              "label": "Percent spent",
              "value": 40,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Running under cost forecasts a saving",
          "inputs": {
            "bac": 1000000,
            "pv": 400000,
            "ev": 400000,
            "ac": 350000
          },
          "expected": 875000,
          "toleranceDecimalPlaces": -4,
          "unit": "currency",
          "confidence": "high",
          "steps": [
            {
              "label": "Cost performance index (CPI)",
              "value": 1.1428571428571428
            },
            {
              "label": "Schedule performance index (SPI)",
              "value": 1
            },
            {
              "label": "Cost variance (CV)",
              "value": 50000,
              "unit": "currency"
            },
            {
              "label": "Schedule variance (SV)",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Variance at completion (VAC)",
              "value": 125000,
              "unit": "currency"
            },
            {
              "label": "Estimate to complete (ETC)",
              "value": 525000,
              "unit": "currency"
            },
            {
              "label": "To-complete performance index (TCPI)",
              "value": 0.9230769230769231
            },
            {
              "label": "Percent complete",
              "value": 40,
              "unit": "%"
            },
            {
              "label": "Percent spent",
              "value": 35,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Severe overrun",
          "inputs": {
            "bac": 1000000,
            "pv": 500000,
            "ev": 300000,
            "ac": 600000
          },
          "expected": 2000000,
          "toleranceDecimalPlaces": -4,
          "unit": "currency",
          "confidence": "high",
          "steps": [
            {
              "label": "Cost performance index (CPI)",
              "value": 0.5
            },
            {
              "label": "Schedule performance index (SPI)",
              "value": 0.6
            },
            {
              "label": "Cost variance (CV)",
              "value": -300000,
              "unit": "currency"
            },
            {
              "label": "Schedule variance (SV)",
              "value": -200000,
              "unit": "currency"
            },
            {
              "label": "Variance at completion (VAC)",
              "value": -1000000,
              "unit": "currency"
            },
            {
              "label": "Estimate to complete (ETC)",
              "value": 1400000,
              "unit": "currency"
            },
            {
              "label": "To-complete performance index (TCPI)",
              "value": 1.75
            },
            {
              "label": "Percent complete",
              "value": 30,
              "unit": "%"
            },
            {
              "label": "Percent spent",
              "value": 60,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "edge-trim-linear-footage-calculator",
      "title": "Drywall J-Bead/L-Bead Edge Trim Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/edge-trim-linear-footage-calculator/",
      "sources": [
        "Total edge trim = total exposed edge length × (1 + waste allowance), accounting for offcuts and overlaps at each piece"
      ],
      "vectors": [
        {
          "name": "30m edge, 5% waste",
          "inputs": {
            "totalEdgeLength": 30,
            "wastePercent": 5
          },
          "expected": 31.5,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "45m edge, 10% waste",
          "inputs": {
            "totalEdgeLength": 45,
            "wastePercent": 10
          },
          "expected": 49.5,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "eifs-finish-coat-coverage-calculator",
      "title": "EIFS Finish and Primer Pail Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/eifs-finish-coat-coverage-calculator/",
      "sources": [
        "ASTM C1397, Standard Practice for Application of Class PB Exterior Insulation and Finish Systems (EIFS) and EIFS with Drainage — establishes that finish and primer are applied as a system to the manufacturer's stated rates; the rates themselves are product data, not standard figures",
        "Material volume = (net area + added detail area) × (1 + waste allowance) ÷ coverage rate; pails = that volume divided by the container size, rounded up to a whole container"
      ],
      "vectors": [
        {
          "name": "120 m² elevation with 8 m² of detailing, 10% waste, fine texture",
          "inputs": {
            "elevationArea": 120,
            "addedDetailArea": 8,
            "finishCoverageRate": 0.6,
            "primerCoverageRate": 5,
            "wasteAllowance": 10,
            "pailVolume": 18.927
          },
          "expected": 13,
          "toleranceDecimalPlaces": 0,
          "unit": "pails",
          "confidence": "medium",
          "steps": [
            {
              "label": "Finish material required",
              "value": 234.66666666666669,
              "unit": "L"
            },
            {
              "label": "Primer material required",
              "value": 28.160000000000004,
              "unit": "L"
            },
            {
              "label": "Pails of primer",
              "value": 2,
              "unit": "pails"
            },
            {
              "label": "Elevation surface including detailing and waste",
              "value": 140.8,
              "unit": "m²"
            }
          ],
          "includesAllowance": {
            "label": "Waste allowance applied to the finished area",
            "percent": 10
          },
          "basis": "ambiguous"
        },
        {
          "name": "60 m² plain elevation, no waste allowance, coarser coverage",
          "inputs": {
            "elevationArea": 60,
            "addedDetailArea": 0,
            "finishCoverageRate": 0.75,
            "primerCoverageRate": 5,
            "wasteAllowance": 0,
            "pailVolume": 18.927
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "pails",
          "confidence": "medium",
          "steps": [
            {
              "label": "Finish material required",
              "value": 80,
              "unit": "L"
            },
            {
              "label": "Primer material required",
              "value": 12,
              "unit": "L"
            },
            {
              "label": "Pails of primer",
              "value": 1,
              "unit": "pails"
            },
            {
              "label": "Elevation surface including detailing and waste",
              "value": 60,
              "unit": "m²"
            }
          ],
          "includesAllowance": {
            "label": "Waste allowance applied to the finished area",
            "percent": 0
          },
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "eifs-foam-adhesive-calculator",
      "title": "EIFS Foam Board Adhesive Coverage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/eifs-foam-adhesive-calculator/",
      "sources": [
        "Adhesive mass = wall area × the adhesive product's rated spread rate (kg per m²), the standard coverage-rate method used for construction adhesives"
      ],
      "vectors": [
        {
          "name": "100m² wall, 3 kg/m² spread rate",
          "inputs": {
            "wallArea": 100,
            "spreadRate": 3
          },
          "expected": 300,
          "toleranceDecimalPlaces": 0,
          "unit": "kg",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150m² wall, 3.5 kg/m² spread rate",
          "inputs": {
            "wallArea": 150,
            "spreadRate": 3.5
          },
          "expected": 525,
          "toleranceDecimalPlaces": 0,
          "unit": "kg",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "eifs-impact-mesh-zone-calculator",
      "title": "EIFS Impact-Resistant Mesh Reinforcement Zone Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/eifs-impact-mesh-zone-calculator/",
      "sources": [
        "Impact zone area = wall perimeter × the reinforcement zone height, since EIFS systems commonly require heavier-weight impact-resistant mesh in a strip zone near grade (commonly the first 2 m / 6-8 ft above grade) where impact damage is most likely"
      ],
      "vectors": [
        {
          "name": "50m perimeter, 2m zone height",
          "inputs": {
            "wallPerimeter": 50,
            "zoneHeight": 2
          },
          "expected": 100,
          "toleranceDecimalPlaces": 0,
          "unit": "m²",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "70m perimeter, 1.8m zone height",
          "inputs": {
            "wallPerimeter": 70,
            "zoneHeight": 1.8
          },
          "expected": 126,
          "toleranceDecimalPlaces": 0,
          "unit": "m²",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "eifs-insulation-thickness-calculator",
      "title": "EIFS Insulation Board Thickness Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/eifs-insulation-thickness-calculator/",
      "sources": [
        "Required thickness = target R-value ÷ the foam board's rated R-value per inch (commonly ~4.5-5.0 for EPS/XPS insulation board)"
      ],
      "vectors": [
        {
          "name": "R-15 target, 4.5 R/in board",
          "inputs": {
            "targetRValue": 15,
            "rValuePerInch": 4.5
          },
          "expected": 3.33,
          "toleranceDecimalPlaces": 1,
          "unit": "in",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "R-20 target, 5.0 R/in board",
          "inputs": {
            "targetRValue": 20,
            "rValuePerInch": 5
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "in",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "eifs-mesh-consumption-calculator",
      "title": "EIFS Base Coat Reinforcing Mesh Consumption Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/eifs-mesh-consumption-calculator/",
      "sources": [
        "Mesh area needed = wall area × (1 + overlap allowance), since adjoining mesh strips require a minimum overlap (commonly 2.5 in / 65 mm, roughly 8-15% depending on mesh width) at every seam"
      ],
      "vectors": [
        {
          "name": "100m² wall, 10% overlap",
          "inputs": {
            "wallArea": 100,
            "overlapPercent": 10
          },
          "expected": 110,
          "toleranceDecimalPlaces": 0,
          "unit": "m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150m² wall, 15% overlap",
          "inputs": {
            "wallArea": 150,
            "overlapPercent": 15
          },
          "expected": 172.5,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "eifs-mesh-roll-calculator",
      "title": "EIFS Reinforcing Mesh Roll Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/eifs-mesh-roll-calculator/",
      "sources": [
        "Roll count = ceil((wall area × (1 + overlap allowance)) ÷ roll coverage area), the standard method for estimating rolled reinforcing mesh material"
      ],
      "vectors": [
        {
          "name": "100m² wall, 10% overlap, 46.5m² roll",
          "inputs": {
            "wallArea": 100,
            "overlapPercent": 10,
            "rollCoverageArea": 46.5
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150m² wall, 15% overlap, 46.5m² roll",
          "inputs": {
            "wallArea": 150,
            "overlapPercent": 15,
            "rollCoverageArea": 46.5
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "electrical-load-calculator",
      "title": "Electrical Circuit Load Calculator",
      "url": "https://craftquantities.com/calculators/electrical/electrical-load-calculator/",
      "sources": [
        "NEC 210.19(A)(1) and 210.20(A): branch circuit conductors and overcurrent protection must be sized so continuous loads (3+ hours) don't exceed 80% of the breaker's rating (equivalently, the 125% sizing rule)"
      ],
      "vectors": [
        {
          "name": "20A/120V breaker, 1200W connected",
          "inputs": {
            "breakerAmps": "20",
            "circuitVoltage": "120",
            "totalConnectedWatts": 1200
          },
          "expected": 10,
          "toleranceDecimalPlaces": 1,
          "unit": "A",
          "confidence": "high",
          "steps": [
            {
              "label": "Total connected load",
              "value": 1200,
              "unit": "W"
            },
            {
              "label": "Safe continuous limit (80% rule)",
              "value": 16,
              "unit": "A"
            },
            {
              "label": "Safe continuous limit",
              "value": 1920,
              "unit": "W"
            },
            {
              "label": "% of safe continuous capacity used",
              "value": 62.5,
              "unit": "%"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15A/120V breaker, 1800W connected (at full breaker rating)",
          "inputs": {
            "breakerAmps": "15",
            "circuitVoltage": "120",
            "totalConnectedWatts": 1800
          },
          "expected": 15,
          "toleranceDecimalPlaces": 1,
          "unit": "A",
          "confidence": "low",
          "steps": [
            {
              "label": "Total connected load",
              "value": 1800,
              "unit": "W"
            },
            {
              "label": "Safe continuous limit (80% rule)",
              "value": 12,
              "unit": "A"
            },
            {
              "label": "Safe continuous limit",
              "value": 1440,
              "unit": "W"
            },
            {
              "label": "% of safe continuous capacity used",
              "value": 125,
              "unit": "%"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "electrical-panel-load-calculator",
      "title": "Electrical Panel Load Calculator (NEC Service Sizing)",
      "url": "https://craftquantities.com/calculators/electrical/electrical-panel-load-calculator/",
      "sources": [
        "NEC 220.12 and Table 220.12: dwelling general lighting and general-use receptacle load at 3 VA per square foot of floor area",
        "NEC 220.52: 1,500 VA for each 2-wire small-appliance branch circuit and 1,500 VA for the laundry branch circuit",
        "NEC Table 220.42: demand factors for lighting and receptacle loads — first 3,000 VA at 100%, 3,001 to 120,000 VA at 35%, remainder at 25%",
        "NEC Table 220.55, Column C, Note 1: one household range of 12 kW or less has a demand of 8 kW, increased 5% per additional kW or major fraction above 12 kW",
        "NEC 220.54: household clothes dryer at 5,000 VA or the nameplate rating, whichever is larger",
        "NEC 220.53: four or more fastened-in-place appliances (other than ranges, dryers, space heating and air conditioning) may be taken at a 75% demand factor",
        "NEC 220.60: noncoincident loads — where heating and cooling cannot operate together, only the larger is included",
        "NEC 220.82: optional calculation for a dwelling on a 100 A or larger 120/240 V service — first 10 kVA of general load at 100%, remainder at 40%, plus the largest of the 220.82(C) heating and cooling figures",
        "NEC 220.57 (2020 and 2023 editions): electric-vehicle supply equipment at the nameplate rating or 7,200 VA, whichever is larger. Under the 2017 edition the nameplate rating applies, treated as a continuous load under 625.41",
        "NEC 240.6(A) standard overcurrent device ratings: 100, 125, 150, 175, 200, 225, 250, 300, 350, 400 A"
      ],
      "vectors": [
        {
          "name": "2,000 sq ft house with an EV charger, standard method",
          "inputs": {
            "calcMethod": "standard",
            "codeEdition": "2023",
            "floorArea": 185.80608,
            "smallApplianceCircuits": 2,
            "hasLaundry": "yes",
            "rangeKw": 12,
            "dryerVa": 5000,
            "fixedApplianceVa": 6000,
            "fixedApplianceCount": 4,
            "hvacVa": 5000,
            "evVa": 7200
          },
          "expected": 154.69,
          "toleranceDecimalPlaces": 1,
          "unit": "A",
          "confidence": "medium",
          "steps": [
            {
              "label": "Recommended service rating",
              "value": 175,
              "unit": "A"
            },
            {
              "label": "Standard calculation (Part III)",
              "value": 154.6875,
              "unit": "A"
            },
            {
              "label": "Optional calculation (220.82)",
              "value": 116.66666666666667,
              "unit": "A"
            },
            {
              "label": "Headline load in volt-amperes",
              "value": 37125,
              "unit": "VA"
            },
            {
              "label": "General lighting at 3 VA per sq ft",
              "value": 6000,
              "unit": "VA"
            },
            {
              "label": "Lighting group after Table 220.42 demand",
              "value": 5625,
              "unit": "VA"
            },
            {
              "label": "Range demand, Table 220.55 Column C",
              "value": 8000,
              "unit": "VA"
            },
            {
              "label": "Dryer, 5,000 VA minimum",
              "value": 5000,
              "unit": "VA"
            },
            {
              "label": "Fixed appliances at 75%",
              "value": 4500,
              "unit": "VA"
            },
            {
              "label": "EV supply equipment at 125%",
              "value": 9000,
              "unit": "VA"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "The same house by the optional method lands lower",
          "inputs": {
            "calcMethod": "optional",
            "codeEdition": "2023",
            "floorArea": 185.80608,
            "smallApplianceCircuits": 2,
            "hasLaundry": "yes",
            "rangeKw": 12,
            "dryerVa": 5000,
            "fixedApplianceVa": 6000,
            "fixedApplianceCount": 4,
            "hvacVa": 5000,
            "evVa": 7200
          },
          "expected": 116.67,
          "toleranceDecimalPlaces": 1,
          "unit": "A",
          "confidence": "medium",
          "steps": [
            {
              "label": "Recommended service rating",
              "value": 125,
              "unit": "A"
            },
            {
              "label": "Standard calculation (Part III)",
              "value": 154.6875,
              "unit": "A"
            },
            {
              "label": "Optional calculation (220.82)",
              "value": 116.66666666666667,
              "unit": "A"
            },
            {
              "label": "Headline load in volt-amperes",
              "value": 28000,
              "unit": "VA"
            },
            {
              "label": "General lighting at 3 VA per sq ft",
              "value": 6000,
              "unit": "VA"
            },
            {
              "label": "Lighting group after Table 220.42 demand",
              "value": 5625,
              "unit": "VA"
            },
            {
              "label": "Range demand, Table 220.55 Column C",
              "value": 8000,
              "unit": "VA"
            },
            {
              "label": "Dryer, 5,000 VA minimum",
              "value": 5000,
              "unit": "VA"
            },
            {
              "label": "Fixed appliances at 75%",
              "value": 4500,
              "unit": "VA"
            },
            {
              "label": "EV supply equipment at 125%",
              "value": 9000,
              "unit": "VA"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Small all-gas dwelling, lighting and receptacles only",
          "inputs": {
            "calcMethod": "standard",
            "codeEdition": "2020",
            "floorArea": 92.90304,
            "smallApplianceCircuits": 2,
            "hasLaundry": "yes",
            "rangeKw": 0,
            "dryerVa": 0,
            "fixedApplianceVa": 0,
            "fixedApplianceCount": 0,
            "hvacVa": 0,
            "evVa": 0
          },
          "expected": 19.06,
          "toleranceDecimalPlaces": 1,
          "unit": "A",
          "confidence": "medium",
          "steps": [
            {
              "label": "Recommended service rating",
              "value": 100,
              "unit": "A"
            },
            {
              "label": "Standard calculation (Part III)",
              "value": 19.0625,
              "unit": "A"
            },
            {
              "label": "Optional calculation (220.82)",
              "value": 31.25,
              "unit": "A"
            },
            {
              "label": "Headline load in volt-amperes",
              "value": 4575,
              "unit": "VA"
            },
            {
              "label": "General lighting at 3 VA per sq ft",
              "value": 3000,
              "unit": "VA"
            },
            {
              "label": "Lighting group after Table 220.42 demand",
              "value": 4575,
              "unit": "VA"
            },
            {
              "label": "Range demand, Table 220.55 Column C",
              "value": 0,
              "unit": "VA"
            },
            {
              "label": "Dryer, 5,000 VA minimum",
              "value": 0,
              "unit": "VA"
            },
            {
              "label": "Fixed appliances at full nameplate",
              "value": 0,
              "unit": "VA"
            },
            {
              "label": "EV supply equipment at 125%",
              "value": 0,
              "unit": "VA"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A 16 kW range takes the Column C increase of 5% per kW",
          "inputs": {
            "calcMethod": "standard",
            "codeEdition": "2020",
            "floorArea": 92.90304,
            "smallApplianceCircuits": 2,
            "hasLaundry": "yes",
            "rangeKw": 16,
            "dryerVa": 0,
            "fixedApplianceVa": 0,
            "fixedApplianceCount": 0,
            "hvacVa": 0,
            "evVa": 0
          },
          "expected": 59.06,
          "toleranceDecimalPlaces": 1,
          "unit": "A",
          "confidence": "medium",
          "steps": [
            {
              "label": "Recommended service rating",
              "value": 100,
              "unit": "A"
            },
            {
              "label": "Standard calculation (Part III)",
              "value": 59.0625,
              "unit": "A"
            },
            {
              "label": "Optional calculation (220.82)",
              "value": 64.16666666666667,
              "unit": "A"
            },
            {
              "label": "Headline load in volt-amperes",
              "value": 14175,
              "unit": "VA"
            },
            {
              "label": "General lighting at 3 VA per sq ft",
              "value": 3000,
              "unit": "VA"
            },
            {
              "label": "Lighting group after Table 220.42 demand",
              "value": 4575,
              "unit": "VA"
            },
            {
              "label": "Range demand, Table 220.55 Column C",
              "value": 9600,
              "unit": "VA"
            },
            {
              "label": "Dryer, 5,000 VA minimum",
              "value": 0,
              "unit": "VA"
            },
            {
              "label": "Fixed appliances at full nameplate",
              "value": 0,
              "unit": "VA"
            },
            {
              "label": "EV supply equipment at 125%",
              "value": 0,
              "unit": "VA"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Under the 2017 edition a small charger carries no 7,200 VA floor",
          "inputs": {
            "calcMethod": "standard",
            "codeEdition": "2017",
            "floorArea": 92.90304,
            "smallApplianceCircuits": 2,
            "hasLaundry": "yes",
            "rangeKw": 0,
            "dryerVa": 0,
            "fixedApplianceVa": 0,
            "fixedApplianceCount": 0,
            "hvacVa": 0,
            "evVa": 3840
          },
          "expected": 39.06,
          "toleranceDecimalPlaces": 1,
          "unit": "A",
          "confidence": "medium",
          "steps": [
            {
              "label": "Recommended service rating",
              "value": 100,
              "unit": "A"
            },
            {
              "label": "Standard calculation (Part III)",
              "value": 39.0625,
              "unit": "A"
            },
            {
              "label": "Optional calculation (220.82)",
              "value": 45.5,
              "unit": "A"
            },
            {
              "label": "Headline load in volt-amperes",
              "value": 9375,
              "unit": "VA"
            },
            {
              "label": "General lighting at 3 VA per sq ft",
              "value": 3000,
              "unit": "VA"
            },
            {
              "label": "Lighting group after Table 220.42 demand",
              "value": 4575,
              "unit": "VA"
            },
            {
              "label": "Range demand, Table 220.55 Column C",
              "value": 0,
              "unit": "VA"
            },
            {
              "label": "Dryer, 5,000 VA minimum",
              "value": 0,
              "unit": "VA"
            },
            {
              "label": "Fixed appliances at full nameplate",
              "value": 0,
              "unit": "VA"
            },
            {
              "label": "EV supply equipment at 125%",
              "value": 4800,
              "unit": "VA"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "electrical-room-heat-load-calculator",
      "title": "Electrical Room Transformer Heat Load Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/electrical-room-heat-load-calculator/",
      "sources": [
        "Transformer heat dissipation ≈ transformer kVA rating × 1000 × total loss percentage, where total loss percentage (no-load + load losses) is commonly 1-2% for modern dry-type distribution transformers per typical manufacturer efficiency data — used as an input to electrical room HVAC/ventilation sizing"
      ],
      "vectors": [
        {
          "name": "500 kVA dry-type transformer, 1.5% loss",
          "inputs": {
            "transformerKVA": 500,
            "lossPercent": 1.5
          },
          "expected": 25590,
          "toleranceDecimalPlaces": -1,
          "unit": "BTU/hr",
          "confidence": "medium",
          "steps": [
            {
              "label": "Heat load in watts",
              "value": 7500,
              "unit": "W"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1000 kVA dry-type transformer, 1.2% loss",
          "inputs": {
            "transformerKVA": 1000,
            "lossPercent": 1.2
          },
          "expected": 40944,
          "toleranceDecimalPlaces": -1,
          "unit": "BTU/hr",
          "confidence": "medium",
          "steps": [
            {
              "label": "Heat load in watts",
              "value": 12000,
              "unit": "W"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "electrical-working-clearance-calculator",
      "title": "Electrical Equipment Working Clearance Space Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/electrical-working-clearance-calculator/",
      "sources": [
        "NEC 110.26(A) requires a minimum clear working space in front of electrical equipment, with depth determined by voltage-to-ground and condition (typically 900 mm/3 ft, 1.07 m/3.5 ft, or 1.22 m/4 ft, which are the table's own paired figures rather than conversions of each other), and width the greater of the equipment width or 750mm/2.5ft"
      ],
      "vectors": [
        {
          "name": "0.6m wide equipment, 900mm depth (width floored to 750mm)",
          "inputs": {
            "equipmentWidth": 0.6,
            "requiredDepth": 0.9
          },
          "expected": 0.675,
          "toleranceDecimalPlaces": 2,
          "unit": "m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Clear width used (NEC 110.26(A)(2) floor: 750 mm / 30 in)",
              "value": 30,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1.0m wide equipment, 1.05m depth",
          "inputs": {
            "equipmentWidth": 1,
            "requiredDepth": 1.05
          },
          "expected": 1.05,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Clear width used",
              "value": 1000,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "elevator-hoistway-sizing-calculator",
      "title": "Elevator Hoistway Shaft Sizing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/elevator-hoistway-sizing-calculator/",
      "sources": [
        "Hoistway width = Car Width + Additional Width Clearance; Hoistway depth = Car Depth + Additional Depth Clearance — hoistway clearances (for guide rails, counterweight assembly, and running clearance) are always specified by the elevator manufacturer for the specific model and capacity, per ASME A17.1; this calculator applies the clearance allowances you supply from the manufacturer's shaft layout drawing, not an assumed value."
      ],
      "vectors": [
        {
          "name": "1.6x1.4m car, 0.3m/0.5m clearances",
          "inputs": {
            "carWidth": 1.6,
            "carDepth": 1.4,
            "additionalWidthClearance": 0.3,
            "additionalDepthClearance": 0.5
          },
          "expected": 3.61,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Hoistway width",
              "value": 1.9000000000000001,
              "unit": "m"
            },
            {
              "label": "Hoistway depth",
              "value": 1.9,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2.0x1.8m car, 0.35m/0.6m clearances",
          "inputs": {
            "carWidth": 2,
            "carDepth": 1.8,
            "additionalWidthClearance": 0.35,
            "additionalDepthClearance": 0.6
          },
          "expected": 5.64,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Hoistway width",
              "value": 2.35,
              "unit": "m"
            },
            {
              "label": "Hoistway depth",
              "value": 2.4,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "embodied-carbon-comparison-calculator",
      "title": "Structural Material Carbon Comparison Calculator",
      "url": "https://craftquantities.com/calculators/sustainability-compliance/embodied-carbon-comparison-calculator/",
      "sources": [
        "EN 15804 A1-A3 cradle-to-gate boundary applied consistently to both options",
        "Biogenic carbon in timber is reported separately under EN 15804+A2 and is not netted off the fossil figure here"
      ],
      "vectors": [
        {
          "name": "Steel against timber",
          "inputs": {
            "massA": 12000,
            "factorA": 1.99,
            "massB": 28000,
            "factorB": 0.45
          },
          "expected": 11280,
          "toleranceDecimalPlaces": 2,
          "unit": "kgCO₂e",
          "confidence": "low",
          "steps": [
            {
              "label": "Option A total",
              "value": 23880,
              "unit": "kgCO₂e"
            },
            {
              "label": "Option B total",
              "value": 12600,
              "unit": "kgCO₂e"
            },
            {
              "label": "Lower option",
              "value": 2,
              "unit": "(B is lower)"
            },
            {
              "label": "Difference in tonnes",
              "value": 11.28,
              "unit": "tCO₂e"
            },
            {
              "label": "B as a percentage of A",
              "value": 52.76381909547738,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Identical options differ by nothing",
          "inputs": {
            "massA": 10000,
            "factorA": 1,
            "massB": 10000,
            "factorB": 1
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "kgCO₂e",
          "confidence": "low",
          "steps": [
            {
              "label": "Option A total",
              "value": 10000,
              "unit": "kgCO₂e"
            },
            {
              "label": "Option B total",
              "value": 10000,
              "unit": "kgCO₂e"
            },
            {
              "label": "Lower option",
              "value": 0,
              "unit": "(equal)"
            },
            {
              "label": "Difference in tonnes",
              "value": 0,
              "unit": "tCO₂e"
            },
            {
              "label": "B as a percentage of A",
              "value": 100,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "The result is the absolute difference either way",
          "inputs": {
            "massA": 5000,
            "factorA": 0.5,
            "massB": 20000,
            "factorB": 1
          },
          "expected": 17500,
          "toleranceDecimalPlaces": 2,
          "unit": "kgCO₂e",
          "confidence": "low",
          "steps": [
            {
              "label": "Option A total",
              "value": 2500,
              "unit": "kgCO₂e"
            },
            {
              "label": "Option B total",
              "value": 20000,
              "unit": "kgCO₂e"
            },
            {
              "label": "Lower option",
              "value": 1,
              "unit": "(A is lower)"
            },
            {
              "label": "Difference in tonnes",
              "value": 17.5,
              "unit": "tCO₂e"
            },
            {
              "label": "B as a percentage of A",
              "value": 800,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Zero mass in both is zero",
          "inputs": {
            "massA": 0,
            "factorA": 1.99,
            "massB": 0,
            "factorB": 0.45
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "kgCO₂e",
          "confidence": "low",
          "steps": [
            {
              "label": "Option A total",
              "value": 0,
              "unit": "kgCO₂e"
            },
            {
              "label": "Option B total",
              "value": 0,
              "unit": "kgCO₂e"
            },
            {
              "label": "Lower option",
              "value": 0,
              "unit": "(equal)"
            },
            {
              "label": "Difference in tonnes",
              "value": 0,
              "unit": "tCO₂e"
            },
            {
              "label": "B as a percentage of A",
              "value": 0,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "embodied-carbon-concrete-calculator",
      "title": "Embodied Carbon in Concrete Calculator",
      "url": "https://craftquantities.com/calculators/sustainability-compliance/embodied-carbon-concrete-calculator/",
      "sources": [
        "EN 15804 modules A1-A3 define cradle-to-gate: raw material supply, transport to the plant, and manufacturing",
        "Typical GWP ranges for structural concrete are drawn from published EPDs and the ICE database; product-specific EPDs vary widely around them",
        "Cement clinker is the dominant contributor — roughly 90% of a plain concrete's A1-A3 figure comes from the Portland cement fraction"
      ],
      "vectors": [
        {
          "name": "50 m³ of plain C30/37 with 100 kg/m³ rebar",
          "inputs": {
            "volume": 50000,
            "mix": "cemI",
            "customFactor": 0,
            "rebarKgPerM3": 100,
            "rebarFactor": 0.76
          },
          "expected": 18800,
          "toleranceDecimalPlaces": 2,
          "unit": "kgCO₂e",
          "confidence": "low",
          "steps": [
            {
              "label": "Tonnes CO₂e",
              "value": 18.8,
              "unit": "tCO₂e"
            },
            {
              "label": "Concrete",
              "value": 15000,
              "unit": "kgCO₂e"
            },
            {
              "label": "Reinforcement",
              "value": 3800,
              "unit": "kgCO₂e"
            },
            {
              "label": "Reinforcement share",
              "value": 20.212765957446805,
              "unit": "%"
            },
            {
              "label": "Per m³ of element",
              "value": 376,
              "unit": "kgCO₂e/m³"
            },
            {
              "label": "Saving against 100% Portland",
              "value": 0,
              "unit": "kgCO₂e"
            },
            {
              "label": "Reinforcement mass",
              "value": 5000,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "50% GGBS cuts the concrete share",
          "inputs": {
            "volume": 50000,
            "mix": "ggbs50",
            "customFactor": 0,
            "rebarKgPerM3": 100,
            "rebarFactor": 0.76
          },
          "expected": 13300,
          "toleranceDecimalPlaces": 2,
          "unit": "kgCO₂e",
          "confidence": "low",
          "steps": [
            {
              "label": "Tonnes CO₂e",
              "value": 13.3,
              "unit": "tCO₂e"
            },
            {
              "label": "Concrete",
              "value": 9500,
              "unit": "kgCO₂e"
            },
            {
              "label": "Reinforcement",
              "value": 3800,
              "unit": "kgCO₂e"
            },
            {
              "label": "Reinforcement share",
              "value": 28.57142857142857,
              "unit": "%"
            },
            {
              "label": "Per m³ of element",
              "value": 266,
              "unit": "kgCO₂e/m³"
            },
            {
              "label": "Saving against 100% Portland",
              "value": 5500,
              "unit": "kgCO₂e"
            },
            {
              "label": "Reinforcement mass",
              "value": 5000,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Unreinforced concrete",
          "inputs": {
            "volume": 50000,
            "mix": "cemI",
            "customFactor": 0,
            "rebarKgPerM3": 0,
            "rebarFactor": 0.76
          },
          "expected": 15000,
          "toleranceDecimalPlaces": 2,
          "unit": "kgCO₂e",
          "confidence": "low",
          "steps": [
            {
              "label": "Tonnes CO₂e",
              "value": 15,
              "unit": "tCO₂e"
            },
            {
              "label": "Concrete",
              "value": 15000,
              "unit": "kgCO₂e"
            },
            {
              "label": "Reinforcement",
              "value": 0,
              "unit": "kgCO₂e"
            },
            {
              "label": "Reinforcement share",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Per m³ of element",
              "value": 300,
              "unit": "kgCO₂e/m³"
            },
            {
              "label": "Saving against 100% Portland",
              "value": 0,
              "unit": "kgCO₂e"
            },
            {
              "label": "Reinforcement mass",
              "value": 0,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A custom EPD figure is used directly",
          "inputs": {
            "volume": 50000,
            "mix": "custom",
            "customFactor": 215,
            "rebarKgPerM3": 100,
            "rebarFactor": 0.76
          },
          "expected": 14550,
          "toleranceDecimalPlaces": 2,
          "unit": "kgCO₂e",
          "confidence": "low",
          "steps": [
            {
              "label": "Tonnes CO₂e",
              "value": 14.55,
              "unit": "tCO₂e"
            },
            {
              "label": "Concrete",
              "value": 10750,
              "unit": "kgCO₂e"
            },
            {
              "label": "Reinforcement",
              "value": 3800,
              "unit": "kgCO₂e"
            },
            {
              "label": "Reinforcement share",
              "value": 26.11683848797251,
              "unit": "%"
            },
            {
              "label": "Per m³ of element",
              "value": 291,
              "unit": "kgCO₂e/m³"
            },
            {
              "label": "Saving against 100% Portland",
              "value": 4250,
              "unit": "kgCO₂e"
            },
            {
              "label": "Reinforcement mass",
              "value": 5000,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Zero volume is zero carbon",
          "inputs": {
            "volume": 0,
            "mix": "cemI",
            "customFactor": 0,
            "rebarKgPerM3": 100,
            "rebarFactor": 0.76
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "kgCO₂e",
          "confidence": "low",
          "steps": [
            {
              "label": "Tonnes CO₂e",
              "value": 0,
              "unit": "tCO₂e"
            },
            {
              "label": "Concrete",
              "value": 0,
              "unit": "kgCO₂e"
            },
            {
              "label": "Reinforcement",
              "value": 0,
              "unit": "kgCO₂e"
            },
            {
              "label": "Reinforcement share",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Per m³ of element",
              "value": 0,
              "unit": "kgCO₂e/m³"
            },
            {
              "label": "Saving against 100% Portland",
              "value": 0,
              "unit": "kgCO₂e"
            },
            {
              "label": "Reinforcement mass",
              "value": 0,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "emergency-lighting-spacing-calculator",
      "title": "Emergency Escape Lighting Spacing Calculator",
      "url": "https://craftquantities.com/calculators/electrical/emergency-lighting-spacing-calculator/",
      "sources": [
        "EN 1838 / BS 5266-7, Lighting applications — emergency lighting: escape routes up to 2 m wide require a minimum of 1 lux on the centre line, with uniformity along that line no worse than 40:1",
        "BS 5266-1, Code of practice for the emergency escape lighting of premises: a luminaire is required at each exit door, at each stair flight so every flight receives direct light, at every change of direction and change of level, at intersections of corridors, outside each final exit, and at fire alarm call points and firefighting equipment — conventionally within 2 m horizontally of each",
        "Spacing is taken as the mounting height multiplied by the luminaire's published spacing-to-height ratio for the target illuminance; that ratio comes from the manufacturer's photometric data and is specific to the fitting"
      ],
      "vectors": [
        {
          "name": "30 m corridor, 2.5 m mounting, ratio 4, three points of emphasis",
          "inputs": {
            "routeLength": 30,
            "mountingHeight": 2.5,
            "spacingRatio": 4,
            "pointsOfEmphasis": 3
          },
          "expected": 7,
          "toleranceDecimalPlaces": 0,
          "unit": "luminaires",
          "confidence": "medium",
          "steps": [
            {
              "label": "Maximum spacing at this height and ratio",
              "value": 10,
              "unit": "m"
            },
            {
              "label": "Actual spacing once the run is divided evenly",
              "value": 10,
              "unit": "m"
            },
            {
              "label": "Luminaires from spacing alone",
              "value": 4,
              "unit": "fittings"
            },
            {
              "label": "Added for points of emphasis",
              "value": 3,
              "unit": "fittings"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A shorter route still needs both ends",
          "inputs": {
            "routeLength": 8,
            "mountingHeight": 2.5,
            "spacingRatio": 4,
            "pointsOfEmphasis": 0
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "luminaires",
          "confidence": "medium",
          "steps": [
            {
              "label": "Maximum spacing at this height and ratio",
              "value": 10,
              "unit": "m"
            },
            {
              "label": "Actual spacing once the run is divided evenly",
              "value": 8,
              "unit": "m"
            },
            {
              "label": "Luminaires from spacing alone",
              "value": 2,
              "unit": "fittings"
            },
            {
              "label": "Added for points of emphasis",
              "value": 0,
              "unit": "fittings"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A lower spacing ratio tightens the run",
          "inputs": {
            "routeLength": 30,
            "mountingHeight": 2.5,
            "spacingRatio": 2,
            "pointsOfEmphasis": 0
          },
          "expected": 7,
          "toleranceDecimalPlaces": 0,
          "unit": "luminaires",
          "confidence": "medium",
          "steps": [
            {
              "label": "Maximum spacing at this height and ratio",
              "value": 5,
              "unit": "m"
            },
            {
              "label": "Actual spacing once the run is divided evenly",
              "value": 5,
              "unit": "m"
            },
            {
              "label": "Luminaires from spacing alone",
              "value": 7,
              "unit": "fittings"
            },
            {
              "label": "Added for points of emphasis",
              "value": 0,
              "unit": "fittings"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Mounting height drives spacing too",
          "inputs": {
            "routeLength": 30,
            "mountingHeight": 5,
            "spacingRatio": 4,
            "pointsOfEmphasis": 0
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "luminaires",
          "confidence": "medium",
          "steps": [
            {
              "label": "Maximum spacing at this height and ratio",
              "value": 20,
              "unit": "m"
            },
            {
              "label": "Actual spacing once the run is divided evenly",
              "value": 15,
              "unit": "m"
            },
            {
              "label": "Luminaires from spacing alone",
              "value": 3,
              "unit": "fittings"
            },
            {
              "label": "Added for points of emphasis",
              "value": 0,
              "unit": "fittings"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Points of emphasis add rather than absorb",
          "inputs": {
            "routeLength": 30,
            "mountingHeight": 2.5,
            "spacingRatio": 4,
            "pointsOfEmphasis": 6
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "luminaires",
          "confidence": "medium",
          "steps": [
            {
              "label": "Maximum spacing at this height and ratio",
              "value": 10,
              "unit": "m"
            },
            {
              "label": "Actual spacing once the run is divided evenly",
              "value": 10,
              "unit": "m"
            },
            {
              "label": "Luminaires from spacing alone",
              "value": 4,
              "unit": "fittings"
            },
            {
              "label": "Added for points of emphasis",
              "value": 6,
              "unit": "fittings"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "epdm-roll-area-calculator",
      "title": "EPDM Single-Ply Roofing Roll Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/epdm-roll-area-calculator/",
      "sources": [
        "Roll count = ceil(roof area ÷ roll coverage area), the standard method for estimating rolled single-ply roofing membrane material"
      ],
      "vectors": [
        {
          "name": "200m² roof, 46.5m² rolls",
          "inputs": {
            "roofArea": 200,
            "rollCoverageArea": 46.5
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "350m² roof, 46.5m² rolls",
          "inputs": {
            "roofArea": 350,
            "rollCoverageArea": 46.5
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "epdm-seam-tape-calculator",
      "title": "EPDM Seam Adhesive/Tape Linear Footage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/epdm-seam-tape-calculator/",
      "sources": [
        "Total seam tape = total seam length × (1 + waste allowance), the standard method for estimating continuous seam tape/adhesive along membrane seams"
      ],
      "vectors": [
        {
          "name": "80m seam, 5% waste",
          "inputs": {
            "seamLength": 80,
            "wastePercent": 5
          },
          "expected": 84,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "110m seam, 8% waste",
          "inputs": {
            "seamLength": 110,
            "wastePercent": 8
          },
          "expected": 118.8,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "epoxy-floor-coating-calculator",
      "title": "Epoxy Floor Coating Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/epoxy-floor-coating-calculator/",
      "sources": [
        "A typical DIY 2-part epoxy floor kit covers approximately 250 sq ft (23 m²) for a standard 2-coat application; kit count scales with area and number of coats"
      ],
      "vectors": [
        {
          "name": "40m² floor, 2 coats",
          "inputs": {
            "floorArea": 40,
            "coats": 2
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "x 250 sq ft kits",
          "confidence": "medium",
          "steps": [
            {
              "label": "Area to coat",
              "value": 430.55641666838886,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "20m² floor, 1 coat",
          "inputs": {
            "floorArea": 20,
            "coats": 1
          },
          "expected": 1,
          "toleranceDecimalPlaces": 0,
          "unit": "x 250 sq ft kits",
          "confidence": "medium",
          "steps": [
            {
              "label": "Area to coat",
              "value": 215.27820833419443,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "epoxy-flooring-coverage-calculator",
      "title": "Epoxy Flooring Coating Coverage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/epoxy-flooring-coverage-calculator/",
      "sources": [
        "Material needed = (area ÷ coverage rate per coat) × number of coats, the standard method for multi-coat floor coating estimates"
      ],
      "vectors": [
        {
          "name": "40m² area, 8m²/L coverage, 2 coats",
          "inputs": {
            "area": 40,
            "coverageRate": 8,
            "numberOfCoats": 2
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "60m² area, 10m²/L coverage, 2 coats",
          "inputs": {
            "area": 60,
            "coverageRate": 10,
            "numberOfCoats": 2
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "epoxy-primer-profile-coverage-calculator",
      "title": "Epoxy Primer Coverage Over a Profiled Slab Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/epoxy-primer-profile-coverage-calculator/",
      "sources": [
        "ICRI Guideline 310.2R, Selecting and Specifying Concrete Surface Preparation — defines concrete surface profiles CSP 1 to 10 as physical replicas of increasing roughness, and is how a specification names the profile this calculation asks for",
        "Effective coverage = published rate ÷ profile factor; volume = area ÷ effective rate × (1 + absorbency allowance). The profile factors offered here are rules of thumb, NOT published coefficients — ICRI defines the profiles and does not attach a coverage number to any of them"
      ],
      "vectors": [
        {
          "name": "60 m² at 5 m²/L published, ordinary grind (CSP 4–5), no extra",
          "inputs": {
            "floorArea": 60,
            "datasheetRate": 5,
            "surfaceProfile": "1.4",
            "absorbencyAllowance": 0,
            "kitSize": 10
          },
          "expected": 16.8,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Kits to order",
              "value": 2,
              "unit": "kits"
            },
            {
              "label": "Effective coverage on this profile",
              "value": 3.5714285714285716,
              "unit": "m²/L"
            },
            {
              "label": "What the data sheet rate alone would have ordered",
              "value": 12,
              "unit": "L"
            },
            {
              "label": "Extra the profile and absorbency account for",
              "value": 4.800000000000001,
              "unit": "L"
            }
          ],
          "includesAllowance": {
            "label": "Profile and absorbency allowance",
            "percent": 40
          },
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "80 m² at 4 m²/L, light shotblast (CSP 3)",
          "inputs": {
            "floorArea": 80,
            "datasheetRate": 4,
            "surfaceProfile": "1.2",
            "absorbencyAllowance": 0,
            "kitSize": 10
          },
          "expected": 24,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Kits to order",
              "value": 3,
              "unit": "kits"
            },
            {
              "label": "Effective coverage on this profile",
              "value": 3.3333333333333335,
              "unit": "m²/L"
            },
            {
              "label": "What the data sheet rate alone would have ordered",
              "value": 20,
              "unit": "L"
            },
            {
              "label": "Extra the profile and absorbency account for",
              "value": 4,
              "unit": "L"
            }
          ],
          "includesAllowance": {
            "label": "Profile and absorbency allowance",
            "percent": 20
          },
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "50 m² at 5 m²/L, aggressive shotblast (CSP 6–7)",
          "inputs": {
            "floorArea": 50,
            "datasheetRate": 5,
            "surfaceProfile": "1.7",
            "absorbencyAllowance": 0,
            "kitSize": 10
          },
          "expected": 17,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Kits to order",
              "value": 2,
              "unit": "kits"
            },
            {
              "label": "Effective coverage on this profile",
              "value": 2.9411764705882355,
              "unit": "m²/L"
            },
            {
              "label": "What the data sheet rate alone would have ordered",
              "value": 10,
              "unit": "L"
            },
            {
              "label": "Extra the profile and absorbency account for",
              "value": 7,
              "unit": "L"
            }
          ],
          "includesAllowance": {
            "label": "Profile and absorbency allowance",
            "percent": 70
          },
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "45 m² at 6 m²/L, scabbled open aggregate (CSP 8–9), thirsty at 10%",
          "inputs": {
            "floorArea": 45,
            "datasheetRate": 6,
            "surfaceProfile": "2",
            "absorbencyAllowance": 10,
            "kitSize": 10
          },
          "expected": 16.5,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Kits to order",
              "value": 2,
              "unit": "kits"
            },
            {
              "label": "Effective coverage on this profile",
              "value": 3,
              "unit": "m²/L"
            },
            {
              "label": "What the data sheet rate alone would have ordered",
              "value": 7.5,
              "unit": "L"
            },
            {
              "label": "Extra the profile and absorbency account for",
              "value": 9,
              "unit": "L"
            }
          ],
          "includesAllowance": {
            "label": "Profile and absorbency allowance",
            "percent": 110
          },
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "100 m² at 6 m²/L, light etch, thirsty slab at 15%",
          "inputs": {
            "floorArea": 100,
            "datasheetRate": 6,
            "surfaceProfile": "1.05",
            "absorbencyAllowance": 15,
            "kitSize": 10
          },
          "expected": 20.125,
          "toleranceDecimalPlaces": 3,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Kits to order",
              "value": 3,
              "unit": "kits"
            },
            {
              "label": "Effective coverage on this profile",
              "value": 5.714285714285714,
              "unit": "m²/L"
            },
            {
              "label": "What the data sheet rate alone would have ordered",
              "value": 16.666666666666668,
              "unit": "L"
            },
            {
              "label": "Extra the profile and absorbency account for",
              "value": 3.458333333333332,
              "unit": "L"
            }
          ],
          "includesAllowance": {
            "label": "Profile and absorbency allowance",
            "percent": 20
          },
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "equal-spacing-calculator",
      "title": "Equal Spacing Calculator (Balusters or Spindles, Posts, Battens)",
      "url": "https://craftquantities.com/calculators/measurements-conversions/equal-spacing-calculator/",
      "sources": [
        "International Residential Code R312.1.3 — openings in a required guard must not allow passage of a 4 in (101.6 mm) diameter sphere; one example of the maximum a reader enters",
        "Approved Document K (2013 edition), Section 3 — guarding in a building likely to be used by children under five should not have openings that allow passage of a 100 mm (3.94 in) sphere; the metric example",
        "NIST Handbook 44 (2026 edition), Appendix C: 12 inches = 1 foot and 1 inch = 2.54 centimetres exactly, the basis of the tape readings and of the millimetres a metric reader is shown"
      ],
      "vectors": [
        {
          "name": "2.4 m between posts, 41 mm spindles, gaps at most 100 mm: 17 spindles",
          "inputs": {
            "runLength": 2.4,
            "itemWidth": 0.041,
            "endCondition": "gaps",
            "solveFor": "limit",
            "limitApplies": "gap",
            "maxSpacing": 0.1,
            "itemCount": 10,
            "markAt": "centre"
          },
          "expected": 17,
          "toleranceDecimalPlaces": 0,
          "unit": "items",
          "confidence": "high",
          "steps": [
            {
              "label": "Clear gap between items",
              "value": 3.7248468941382327,
              "unit": "in (3 3/4 in)"
            },
            {
              "label": "Centre-to-centre spacing",
              "value": 5.339020122484689,
              "unit": "in (5 5/16 in)"
            },
            {
              "label": "Equal spaces across the run",
              "value": 18,
              "unit": "spaces"
            },
            {
              "label": "Largest gap allowed",
              "value": 3.937007874015748,
              "unit": "in (3 15/16 in)"
            },
            {
              "label": "Item 1, centre from the start",
              "value": 4.531933508311461,
              "unit": "in (4 9/16 in)"
            },
            {
              "label": "Item 2, centre from the start",
              "value": 9.870953630796151,
              "unit": "in (9 7/8 in)"
            },
            {
              "label": "Item 3, centre from the start",
              "value": 15.209973753280842,
              "unit": "in (1 ft 3 3/16 in)"
            },
            {
              "label": "Item 4, centre from the start",
              "value": 20.548993875765525,
              "unit": "in (1 ft 8 9/16 in)"
            },
            {
              "label": "Item 5, centre from the start",
              "value": 25.888013998250216,
              "unit": "in (2 ft 1 7/8 in)"
            },
            {
              "label": "Item 6, centre from the start",
              "value": 31.227034120734906,
              "unit": "in (2 ft 7 1/4 in)"
            },
            {
              "label": "Item 7, centre from the start",
              "value": 36.5660542432196,
              "unit": "in (3 ft 0 9/16 in)"
            },
            {
              "label": "Item 8, centre from the start",
              "value": 41.90507436570429,
              "unit": "in (3 ft 5 7/8 in)"
            },
            {
              "label": "Item 9, centre from the start",
              "value": 47.24409448818898,
              "unit": "in (3 ft 11 1/4 in)"
            },
            {
              "label": "Item 10, centre from the start",
              "value": 52.583114610673654,
              "unit": "in (4 ft 4 9/16 in)"
            },
            {
              "label": "Item 11, centre from the start",
              "value": 57.92213473315836,
              "unit": "in (4 ft 9 15/16 in)"
            },
            {
              "label": "Item 12, centre from the start",
              "value": 63.26115485564305,
              "unit": "in (5 ft 3 1/4 in)"
            },
            {
              "label": "Item 13, centre from the start",
              "value": 68.60017497812773,
              "unit": "in (5 ft 8 5/8 in)"
            },
            {
              "label": "Item 14, centre from the start",
              "value": 73.93919510061242,
              "unit": "in (6 ft 1 15/16 in)"
            },
            {
              "label": "Item 15, centre from the start",
              "value": 79.2782152230971,
              "unit": "in (6 ft 7 1/4 in)"
            },
            {
              "label": "Item 16, centre from the start",
              "value": 84.6172353455818,
              "unit": "in (7 ft 0 5/8 in)"
            },
            {
              "label": "Item 17, centre from the start",
              "value": 89.9562554680665,
              "unit": "in (7 ft 5 15/16 in)"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "8 ft between posts, 1.5 in balusters, gaps at most 4 in: 17 balusters",
          "inputs": {
            "runLength": 2.4384,
            "itemWidth": 0.0381,
            "endCondition": "gaps",
            "solveFor": "limit",
            "limitApplies": "gap",
            "maxSpacing": 0.1016,
            "itemCount": 10,
            "markAt": "centre"
          },
          "expected": 17,
          "toleranceDecimalPlaces": 0,
          "unit": "items",
          "confidence": "high",
          "steps": [
            {
              "label": "Clear gap between items",
              "value": 3.916666666666667,
              "unit": "in (3 15/16 in)"
            },
            {
              "label": "Centre-to-centre spacing",
              "value": 5.416666666666667,
              "unit": "in (5 7/16 in)"
            },
            {
              "label": "Equal spaces across the run",
              "value": 18,
              "unit": "spaces"
            },
            {
              "label": "Largest gap allowed",
              "value": 4,
              "unit": "in"
            },
            {
              "label": "Item 1, centre from the start",
              "value": 4.666666666666667,
              "unit": "in (4 11/16 in)"
            },
            {
              "label": "Item 2, centre from the start",
              "value": 10.083333333333334,
              "unit": "in (10 1/16 in)"
            },
            {
              "label": "Item 3, centre from the start",
              "value": 15.5,
              "unit": "in (1 ft 3 1/2 in)"
            },
            {
              "label": "Item 4, centre from the start",
              "value": 20.916666666666668,
              "unit": "in (1 ft 8 15/16 in)"
            },
            {
              "label": "Item 5, centre from the start",
              "value": 26.333333333333336,
              "unit": "in (2 ft 2 5/16 in)"
            },
            {
              "label": "Item 6, centre from the start",
              "value": 31.75,
              "unit": "in (2 ft 7 3/4 in)"
            },
            {
              "label": "Item 7, centre from the start",
              "value": 37.16666666666667,
              "unit": "in (3 ft 1 3/16 in)"
            },
            {
              "label": "Item 8, centre from the start",
              "value": 42.583333333333336,
              "unit": "in (3 ft 6 9/16 in)"
            },
            {
              "label": "Item 9, centre from the start",
              "value": 48.00000000000001,
              "unit": "in (4 ft 0 in)"
            },
            {
              "label": "Item 10, centre from the start",
              "value": 53.41666666666667,
              "unit": "in (4 ft 5 7/16 in)"
            },
            {
              "label": "Item 11, centre from the start",
              "value": 58.83333333333334,
              "unit": "in (4 ft 10 13/16 in)"
            },
            {
              "label": "Item 12, centre from the start",
              "value": 64.25,
              "unit": "in (5 ft 4 1/4 in)"
            },
            {
              "label": "Item 13, centre from the start",
              "value": 69.66666666666667,
              "unit": "in (5 ft 9 11/16 in)"
            },
            {
              "label": "Item 14, centre from the start",
              "value": 75.08333333333334,
              "unit": "in (6 ft 3 1/16 in)"
            },
            {
              "label": "Item 15, centre from the start",
              "value": 80.50000000000001,
              "unit": "in (6 ft 8 1/2 in)"
            },
            {
              "label": "Item 16, centre from the start",
              "value": 85.91666666666667,
              "unit": "in (7 ft 1 15/16 in)"
            },
            {
              "label": "Item 17, centre from the start",
              "value": 91.33333333333334,
              "unit": "in (7 ft 7 5/16 in)"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A 30 m fence line of 100 mm posts at no more than 2.4 m centres takes 14 posts",
          "inputs": {
            "runLength": 30,
            "itemWidth": 0.1,
            "endCondition": "items",
            "solveFor": "limit",
            "limitApplies": "centres",
            "maxSpacing": 2.4,
            "itemCount": 10,
            "markAt": "centre"
          },
          "expected": 14,
          "toleranceDecimalPlaces": 0,
          "unit": "items",
          "confidence": "high",
          "steps": [
            {
              "label": "Clear gap between items",
              "value": 86.61417322834646,
              "unit": "in (7 ft 2 5/8 in)"
            },
            {
              "label": "Centre-to-centre spacing",
              "value": 90.55118110236222,
              "unit": "in (7 ft 6 9/16 in)"
            },
            {
              "label": "Equal spaces across the run",
              "value": 13,
              "unit": "spaces"
            },
            {
              "label": "Largest centres allowed",
              "value": 94.48818897637796,
              "unit": "in (7 ft 10 1/2 in)"
            },
            {
              "label": "Item 1, centre from the start",
              "value": 1.968503937007874,
              "unit": "in (1 15/16 in)"
            },
            {
              "label": "Item 2, centre from the start",
              "value": 92.51968503937009,
              "unit": "in (7 ft 8 1/2 in)"
            },
            {
              "label": "Item 3, centre from the start",
              "value": 183.0708661417323,
              "unit": "in (15 ft 3 1/16 in)"
            },
            {
              "label": "Item 4, centre from the start",
              "value": 273.6220472440945,
              "unit": "in (22 ft 9 5/8 in)"
            },
            {
              "label": "Item 5, centre from the start",
              "value": 364.17322834645677,
              "unit": "in (30 ft 4 3/16 in)"
            },
            {
              "label": "Item 6, centre from the start",
              "value": 454.724409448819,
              "unit": "in (37 ft 10 3/4 in)"
            },
            {
              "label": "Item 7, centre from the start",
              "value": 545.2755905511812,
              "unit": "in (45 ft 5 1/4 in)"
            },
            {
              "label": "Item 8, centre from the start",
              "value": 635.8267716535435,
              "unit": "in (52 ft 11 13/16 in)"
            },
            {
              "label": "Item 9, centre from the start",
              "value": 726.3779527559057,
              "unit": "in (60 ft 6 3/8 in)"
            },
            {
              "label": "Item 10, centre from the start",
              "value": 816.9291338582678,
              "unit": "in (68 ft 0 15/16 in)"
            },
            {
              "label": "Item 11, centre from the start",
              "value": 907.4803149606302,
              "unit": "in (75 ft 7 1/2 in)"
            },
            {
              "label": "Item 12, centre from the start",
              "value": 998.0314960629923,
              "unit": "in (83 ft 2 1/16 in)"
            },
            {
              "label": "Item 13, centre from the start",
              "value": 1088.5826771653544,
              "unit": "in (90 ft 8 9/16 in)"
            },
            {
              "label": "Item 14, centre from the start",
              "value": 1179.1338582677167,
              "unit": "in (98 ft 3 1/8 in)"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "660 mm at 40 mm spindles lands exactly on the 100 mm limit with 4 spindles",
          "inputs": {
            "runLength": 0.66,
            "itemWidth": 0.04,
            "endCondition": "gaps",
            "solveFor": "limit",
            "limitApplies": "gap",
            "maxSpacing": 0.1,
            "itemCount": 10,
            "markAt": "centre"
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "items",
          "confidence": "high",
          "steps": [
            {
              "label": "Clear gap between items",
              "value": 3.937007874015748,
              "unit": "in (3 15/16 in)"
            },
            {
              "label": "Centre-to-centre spacing",
              "value": 5.511811023622048,
              "unit": "in (5 1/2 in)"
            },
            {
              "label": "Equal spaces across the run",
              "value": 5,
              "unit": "spaces"
            },
            {
              "label": "Largest gap allowed",
              "value": 3.937007874015748,
              "unit": "in (3 15/16 in)"
            },
            {
              "label": "Item 1, centre from the start",
              "value": 4.724409448818898,
              "unit": "in (4 3/4 in)"
            },
            {
              "label": "Item 2, centre from the start",
              "value": 10.236220472440946,
              "unit": "in (10 1/4 in)"
            },
            {
              "label": "Item 3, centre from the start",
              "value": 15.748031496062996,
              "unit": "in (1 ft 3 3/4 in)"
            },
            {
              "label": "Item 4, centre from the start",
              "value": 21.25984251968504,
              "unit": "in (1 ft 9 1/4 in)"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Ten 50 mm battens across 3 m, one at each end, are 277.8 mm apart in the clear",
          "inputs": {
            "runLength": 3,
            "itemWidth": 0.05,
            "endCondition": "items",
            "solveFor": "count",
            "limitApplies": "gap",
            "maxSpacing": 0.1,
            "itemCount": 10,
            "markAt": "nearEdge"
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "items",
          "confidence": "high",
          "steps": [
            {
              "label": "Clear gap between items",
              "value": 10.936132983377078,
              "unit": "in (10 15/16 in)"
            },
            {
              "label": "Centre-to-centre spacing",
              "value": 12.904636920384952,
              "unit": "in (1 ft 0 7/8 in)"
            },
            {
              "label": "Equal spaces across the run",
              "value": 9,
              "unit": "spaces"
            },
            {
              "label": "Item 1, near edge from the start",
              "value": 0,
              "unit": "in"
            },
            {
              "label": "Item 2, near edge from the start",
              "value": 12.904636920384952,
              "unit": "in (1 ft 0 7/8 in)"
            },
            {
              "label": "Item 3, near edge from the start",
              "value": 25.809273840769904,
              "unit": "in (2 ft 1 13/16 in)"
            },
            {
              "label": "Item 4, near edge from the start",
              "value": 38.71391076115486,
              "unit": "in (3 ft 2 11/16 in)"
            },
            {
              "label": "Item 5, near edge from the start",
              "value": 51.61854768153981,
              "unit": "in (4 ft 3 5/8 in)"
            },
            {
              "label": "Item 6, near edge from the start",
              "value": 64.52318460192475,
              "unit": "in (5 ft 4 1/2 in)"
            },
            {
              "label": "Item 7, near edge from the start",
              "value": 77.42782152230971,
              "unit": "in (6 ft 5 7/16 in)"
            },
            {
              "label": "Item 8, near edge from the start",
              "value": 90.33245844269466,
              "unit": "in (7 ft 6 5/16 in)"
            },
            {
              "label": "Item 9, near edge from the start",
              "value": 103.23709536307962,
              "unit": "in (8 ft 7 1/4 in)"
            },
            {
              "label": "Item 10, near edge from the start",
              "value": 116.14173228346458,
              "unit": "in (9 ft 8 1/8 in)"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "equipment-rental-vs-buy-calculator",
      "title": "Equipment Rental vs. Buy Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/equipment-rental-vs-buy-calculator/",
      "sources": [
        "Break-even days = purchase price (net of any resale) / daily rental rate — beyond this many rental days, buying costs less overall",
        "A hire is billed the CHEAPEST of three ways: every day at the day rate, the whole hire rounded up to complete weeks, or complete weeks plus the remaining days at the day rate. A weekly rate is commonly three to four days' money rather than seven, so the third is often the lowest and the day rate alone puts the threshold in the wrong place"
      ],
      "vectors": [
        {
          "name": "$1200 purchase, $75/day rental",
          "inputs": {
            "purchasePrice": 1200,
            "dailyRentalRate": 75
          },
          "expected": 16,
          "toleranceDecimalPlaces": 0,
          "unit": "rental days",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cost to rent for this job",
              "value": 75,
              "unit": "$"
            },
            {
              "label": "Cost to own, net of resale",
              "value": 1200,
              "unit": "$"
            },
            {
              "label": "Renting saves",
              "value": 1125,
              "unit": "$"
            },
            {
              "label": "Effective day rate once billed",
              "value": 75,
              "unit": "$"
            },
            {
              "label": "Break-even at the effective rate",
              "value": 16,
              "unit": "rental days"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "$2500 purchase, $100/day rental",
          "inputs": {
            "purchasePrice": 2500,
            "dailyRentalRate": 100
          },
          "expected": 25,
          "toleranceDecimalPlaces": 0,
          "unit": "rental days",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cost to rent for this job",
              "value": 100,
              "unit": "$"
            },
            {
              "label": "Cost to own, net of resale",
              "value": 2500,
              "unit": "$"
            },
            {
              "label": "Renting saves",
              "value": 2400,
              "unit": "$"
            },
            {
              "label": "Effective day rate once billed",
              "value": 100,
              "unit": "$"
            },
            {
              "label": "Break-even at the effective rate",
              "value": 25,
              "unit": "rental days"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "resale value lowers the threshold",
          "inputs": {
            "purchasePrice": 1200,
            "dailyRentalRate": 75,
            "weeklyRentalRate": 0,
            "jobDays": 10,
            "resaleValue": 400
          },
          "expected": 11,
          "toleranceDecimalPlaces": 0,
          "unit": "rental days",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cost to rent for this job",
              "value": 750,
              "unit": "$"
            },
            {
              "label": "Cost to own, net of resale",
              "value": 800,
              "unit": "$"
            },
            {
              "label": "Renting saves",
              "value": 50,
              "unit": "$"
            },
            {
              "label": "Effective day rate once billed",
              "value": 75,
              "unit": "$"
            },
            {
              "label": "Break-even at the effective rate",
              "value": 11,
              "unit": "rental days"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "a weekly rate does not move the day-rate headline",
          "inputs": {
            "purchasePrice": 1200,
            "dailyRentalRate": 75,
            "weeklyRentalRate": 300,
            "jobDays": 10,
            "resaleValue": 0
          },
          "expected": 16,
          "toleranceDecimalPlaces": 0,
          "unit": "rental days",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cost to rent for this job",
              "value": 525,
              "unit": "$"
            },
            {
              "label": "Cost to own, net of resale",
              "value": 1200,
              "unit": "$"
            },
            {
              "label": "Renting saves",
              "value": 675,
              "unit": "$"
            },
            {
              "label": "Effective day rate once billed",
              "value": 52.5,
              "unit": "$"
            },
            {
              "label": "Break-even at the effective rate",
              "value": 23,
              "unit": "rental days"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "equivalent-round-duct-diameter-calculator",
      "title": "Rectangular-to-Round Equivalent Duct Diameter Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/equivalent-round-duct-diameter-calculator/",
      "sources": [
        "Huebscher equivalent diameter equation: De = 1.30 × (a×b)^0.625 ÷ (a+b)^0.25, where a and b are the rectangular duct's side lengths (inches) and De is the equivalent round duct diameter (inches) — the standard ASHRAE-cited method for converting between rectangular and round duct sizes at equal airflow and friction loss."
      ],
      "vectors": [
        {
          "name": "12in x 8in rectangular duct",
          "inputs": {
            "sideA": 0.3048,
            "sideB": 0.2032
          },
          "expected": 10.66,
          "toleranceDecimalPlaces": 1,
          "unit": "in",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "20in x 10in rectangular duct",
          "inputs": {
            "sideA": 0.508,
            "sideB": 0.254
          },
          "expected": 15.23,
          "toleranceDecimalPlaces": 1,
          "unit": "in",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "erosion-control-blanket-calculator",
      "title": "Erosion Control Blanket Roll and Staple Calculator",
      "url": "https://craftquantities.com/calculators/heavy-civil/erosion-control-blanket-calculator/",
      "sources": [
        "ASTM D6459 Standard Test Method for Determination of Rolled Erosion Control Product Performance in Protecting Hillslopes from Rainfall-Induced Erosion — the hillslope test a product's slope rating comes from",
        "ASTM D6460 Standard Test Method for Determination of Rolled Erosion Control Product Performance in Protecting Earthen Channels from Stormwater-Induced Erosion — the channel counterpart, which governs blanket in a ditch rather than on a face",
        "Staple density is taken from the product's own staple pattern chart, which is why it is selected rather than derived. The densities offered are the per-square-yard patterns those charts are printed in",
        "Face area = plan distance x sqrt(1 + (1/n)²) for a slope of n horizontal to 1 vertical — plain geometry, not a published coefficient, and the reason a plan take-off under-orders blanket"
      ],
      "vectors": [
        {
          "name": "18 m plan run on a 3:1 face, 40 m wide, 2.44 x 33.5 m rolls",
          "inputs": {
            "planRun": 18,
            "slopeRatio": 3,
            "slopeWidth": 40,
            "rollWidth": 2.44,
            "rollLength": 33.5,
            "sideOverlap": 0.1,
            "endOverlap": 0.3,
            "anchorTrenchAllowance": 0.9,
            "stapleDensity": "2.392"
          },
          "expected": 18,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "medium",
          "steps": [
            {
              "label": "Slope face length",
              "value": 18.973665961010276,
              "unit": "m"
            },
            {
              "label": "Slope face area",
              "value": 758.9466384404111,
              "unit": "m²"
            },
            {
              "label": "Plan area of the same slope",
              "value": 720,
              "unit": "m²"
            },
            {
              "label": "Strips across the face",
              "value": 18,
              "unit": "strips"
            },
            {
              "label": "Rolls per strip",
              "value": 1,
              "unit": "rolls"
            },
            {
              "label": "Staples required",
              "value": 1816,
              "unit": "staples"
            },
            {
              "label": "Material purchased",
              "value": 1471.3200000000002,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "40 m plan run on a 2:1 face, 60 m wide — two rolls per strip",
          "inputs": {
            "planRun": 40,
            "slopeRatio": 2,
            "slopeWidth": 60,
            "rollWidth": 2.44,
            "rollLength": 33.5,
            "sideOverlap": 0.1,
            "endOverlap": 0.3,
            "anchorTrenchAllowance": 0.9,
            "stapleDensity": "2.392"
          },
          "expected": 52,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "medium",
          "steps": [
            {
              "label": "Slope face length",
              "value": 44.721359549995796,
              "unit": "m"
            },
            {
              "label": "Slope face area",
              "value": 2683.281572999748,
              "unit": "m²"
            },
            {
              "label": "Plan area of the same slope",
              "value": 2400,
              "unit": "m²"
            },
            {
              "label": "Strips across the face",
              "value": 26,
              "unit": "strips"
            },
            {
              "label": "Rolls per strip",
              "value": 2,
              "unit": "rolls"
            },
            {
              "label": "Staples required",
              "value": 6419,
              "unit": "staples"
            },
            {
              "label": "Material purchased",
              "value": 4250.48,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "erv-hrv-sizing-calculator",
      "title": "ERV/HRV Sizing Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/erv-hrv-sizing-calculator/",
      "sources": [
        "ASHRAE 62.2 whole-house mechanical ventilation formula: required CFM = 0.03 x floor area (sq ft) + 7.5 x (number of bedrooms + 1)"
      ],
      "vectors": [
        {
          "name": "150m² home, 3 bedrooms",
          "inputs": {
            "houseArea": 150,
            "occupants": 3
          },
          "expected": 78.44,
          "toleranceDecimalPlaces": 2,
          "unit": "CFM (continuous)",
          "confidence": "high",
          "steps": [
            {
              "label": "House area",
              "value": 1614.5865625064582,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "200m² home, 4 bedrooms",
          "inputs": {
            "houseArea": 200,
            "occupants": 4
          },
          "expected": 102.08,
          "toleranceDecimalPlaces": 2,
          "unit": "CFM (continuous)",
          "confidence": "high",
          "steps": [
            {
              "label": "House area",
              "value": 2152.782083341944,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "erv-sensible-recovery-calculator",
      "title": "ERV/HRV Sensible Energy Recovery Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/erv-sensible-recovery-calculator/",
      "sources": [
        "Recovered sensible energy (BTU/hr) = 1.08 × Airflow (CFM) × Temperature Difference (°F) × Sensible Recovery Effectiveness (%), extending the standard ASHRAE sensible heat formula with the unit's AHRI 1060-certified Sensible Recovery Effectiveness (SRE) rating, which represents the fraction of available sensible energy difference the unit actually transfers between airstreams."
      ],
      "vectors": [
        {
          "name": "500 CFM, 40°F difference, 70% SRE",
          "inputs": {
            "airflow": 235.9737,
            "tempDelta": 22.2222222,
            "sensibleRecoveryEffectiveness": 70
          },
          "expected": 15120,
          "toleranceDecimalPlaces": 1,
          "unit": "BTU/hr",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "800 CFM, 35°F difference, 65% SRE",
          "inputs": {
            "airflow": 377.558,
            "tempDelta": 19.4444444,
            "sensibleRecoveryEffectiveness": 65
          },
          "expected": 19656,
          "toleranceDecimalPlaces": 1,
          "unit": "BTU/hr",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "escalator-wellway-opening-calculator",
      "title": "Escalator Wellway Floor Opening Length Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/escalator-wellway-opening-calculator/",
      "sources": [
        "Inclined truss length = Vertical Rise ÷ sin(incline angle); horizontal run = Vertical Rise ÷ tan(incline angle); total wellway floor opening length = horizontal run + flat entry/exit landing allowance at each end. Escalators are commonly built at a 30° or 35° incline angle (widely cited industry-standard values associated with ASME A17.1, though the specific clause was not independently re-fetched this session — the geometric relationship itself is basic trigonometry, not something fabricated). This is a GEOMETRY-ONLY calculator — it does not calculate truss structural capacity, support reactions, or anchor loads, which are always manufacturer-engineered per the specific escalator model and ASME A17.1."
      ],
      "vectors": [
        {
          "name": "5m rise, 30° incline, 0.9m flat step allowance",
          "inputs": {
            "verticalRise": 5,
            "inclineAngle": "30",
            "flatStepAllowance": 0.9
          },
          "expected": 10.46,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Inclined truss length",
              "value": 10.000000000000002,
              "unit": "m"
            },
            {
              "label": "Horizontal run (excluding flat steps)",
              "value": 8.660254037844387,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "6m rise, 35° incline, 1.0m flat step allowance",
          "inputs": {
            "verticalRise": 6,
            "inclineAngle": "35",
            "flatStepAllowance": 1
          },
          "expected": 10.57,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Inclined truss length",
              "value": 10.460680773726589,
              "unit": "m"
            },
            {
              "label": "Horizontal run (excluding flat steps)",
              "value": 8.568888040452688,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "escape-route-width-calculator",
      "title": "Occupant Load and Escape Route Width Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/escape-route-width-calculator/",
      "sources": [
        "Occupant load is the floor area served divided by the area per person for the use — a density figure published per building type, not a headcount anyone takes on the day",
        "Escape route width is the occupant load multiplied by a width per person, subject to a minimum width that applies however few people are served",
        "The largest escape route is discounted and the remaining routes sized for the whole occupant load, because a fire can block any single exit — the same reasoning that puts two ways out of a room in the first place"
      ],
      "vectors": [
        {
          "name": "500 m² office, two routes — the minimum governs",
          "inputs": {
            "floorArea": 500,
            "areaPerPerson": 6,
            "routesProvided": 2,
            "widthPerPerson": 0.005,
            "minimumWidth": 0.85
          },
          "expected": 33.465,
          "toleranceDecimalPlaces": 2,
          "unit": "in",
          "confidence": "medium",
          "steps": [
            {
              "label": "Occupants served",
              "value": 84,
              "unit": "people"
            },
            {
              "label": "Routes counted after the discount",
              "value": 1,
              "unit": "routes"
            },
            {
              "label": "People per remaining route",
              "value": 84,
              "unit": "people"
            },
            {
              "label": "Width the occupant load alone asks for",
              "value": 16.53543307086614,
              "unit": "in"
            },
            {
              "label": "Minimum width that applies",
              "value": 33.46456692913386,
              "unit": "in"
            },
            {
              "label": "Total clear width across the remaining routes",
              "value": 33.46456692913386,
              "unit": "in"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A dense assembly floor, where the load takes over",
          "inputs": {
            "floorArea": 500,
            "areaPerPerson": 0.5,
            "routesProvided": 3,
            "widthPerPerson": 0.005,
            "minimumWidth": 0.85
          },
          "expected": 98.425,
          "toleranceDecimalPlaces": 2,
          "unit": "in",
          "confidence": "medium",
          "steps": [
            {
              "label": "Occupants served",
              "value": 1000,
              "unit": "people"
            },
            {
              "label": "Routes counted after the discount",
              "value": 2,
              "unit": "routes"
            },
            {
              "label": "People per remaining route",
              "value": 500,
              "unit": "people"
            },
            {
              "label": "Width the occupant load alone asks for",
              "value": 98.4251968503937,
              "unit": "in"
            },
            {
              "label": "Minimum width that applies",
              "value": 33.46456692913386,
              "unit": "in"
            },
            {
              "label": "Total clear width across the remaining routes",
              "value": 196.8503937007874,
              "unit": "in"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The same floor with one more way out",
          "inputs": {
            "floorArea": 500,
            "areaPerPerson": 0.5,
            "routesProvided": 4,
            "widthPerPerson": 0.005,
            "minimumWidth": 0.85
          },
          "expected": 65.617,
          "toleranceDecimalPlaces": 2,
          "unit": "in",
          "confidence": "medium",
          "steps": [
            {
              "label": "Occupants served",
              "value": 1000,
              "unit": "people"
            },
            {
              "label": "Routes counted after the discount",
              "value": 3,
              "unit": "routes"
            },
            {
              "label": "People per remaining route",
              "value": 333.3333333333333,
              "unit": "people"
            },
            {
              "label": "Width the occupant load alone asks for",
              "value": 65.61679790026247,
              "unit": "in"
            },
            {
              "label": "Minimum width that applies",
              "value": 33.46456692913386,
              "unit": "in"
            },
            {
              "label": "Total clear width across the remaining routes",
              "value": 196.8503937007874,
              "unit": "in"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "ev-charger-circuit-calculator",
      "title": "EV Charger Circuit Calculator",
      "url": "https://craftquantities.com/calculators/electrical/ev-charger-circuit-calculator/",
      "sources": [
        "NEC 210.19(A)(1) and 210.20(A): EV charging is a continuous load (runs 3+ hours), so the circuit must be sized at 125% of the charger's rated continuous amps",
        "Standard residential breaker sizes: 15, 20, 30, 40, 50, 60, 70, 80, 90, 100, 125, 150 A"
      ],
      "vectors": [
        {
          "name": "32A charger (common Level 2 home charger)",
          "inputs": {
            "chargerContinuousAmps": 32
          },
          "expected": 40,
          "toleranceDecimalPlaces": 0,
          "unit": "A breaker",
          "confidence": "medium",
          "steps": [
            {
              "label": "Minimum required (125% rule)",
              "value": 40,
              "unit": "A"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "48A charger (higher-output Level 2)",
          "inputs": {
            "chargerContinuousAmps": 48
          },
          "expected": 60,
          "toleranceDecimalPlaces": 0,
          "unit": "A breaker",
          "confidence": "medium",
          "steps": [
            {
              "label": "Minimum required (125% rule)",
              "value": 60,
              "unit": "A"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "ev-charging-cost-calculator",
      "title": "EV Home Charging Cost Calculator",
      "url": "https://craftquantities.com/calculators/electrical/ev-charging-cost-calculator/",
      "sources": [
        "Cost per full charge = battery capacity (kWh) x electricity rate ($/kWh); cost per mile = cost per full charge / miles of range per charge"
      ],
      "vectors": [
        {
          "name": "75kWh battery, $0.15/kWh, 250mi range",
          "inputs": {
            "batteryCapacityKwh": 75,
            "costPerKwh": 0.15,
            "milesPerCharge": 250
          },
          "expected": 11.25,
          "toleranceDecimalPlaces": 2,
          "unit": "currency per full charge",
          "confidence": "medium",
          "steps": [
            {
              "label": "Energy per full charge",
              "value": 75,
              "unit": "kWh"
            },
            {
              "label": "Cost per 100 miles",
              "value": 4.5,
              "unit": "currency/100 miles"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "60kWh battery, $0.12/kWh, 200mi range",
          "inputs": {
            "batteryCapacityKwh": 60,
            "costPerKwh": 0.12,
            "milesPerCharge": 200
          },
          "expected": 7.2,
          "toleranceDecimalPlaces": 1,
          "unit": "currency per full charge",
          "confidence": "medium",
          "steps": [
            {
              "label": "Energy per full charge",
              "value": 60,
              "unit": "kWh"
            },
            {
              "label": "Cost per 100 miles",
              "value": 3.5999999999999996,
              "unit": "currency/100 miles"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "excavation-sloping-setback-calculator",
      "title": "Excavation Sloping/Benching Setback Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/excavation-sloping-setback-calculator/",
      "sources": [
        "Per OSHA 29 CFR 1926 Subpart P, Appendix B (verified against the regulatory text), for excavations 20 feet or less in depth using a simple slope configuration, the maximum allowable slope ratios (horizontal:vertical) are: Type A soil 3/4:1 (0.75), Type B soil 1:1 (1.0), Type C soil 1 1/2:1 (1.5). Type A soil has a further exception allowing 1/2:1 for short-term excavations of 12 feet or less, not implemented in this simplified tool. Required horizontal setback = Excavation Depth × Slope Ratio."
      ],
      "vectors": [
        {
          "name": "3m depth, Type B soil",
          "inputs": {
            "excavationDepth": 3,
            "soilType": "B"
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Slope ratio used (horizontal:vertical)",
              "value": 1,
              "unit": ":1"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "4m depth, Type C soil",
          "inputs": {
            "excavationDepth": 4,
            "soilType": "C"
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Slope ratio used (horizontal:vertical)",
              "value": 1.5,
              "unit": ":1"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "excavation-strut-load-calculator",
      "title": "Excavation Bracing Strut Load Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/excavation-strut-load-calculator/",
      "sources": [
        "Standard tributary-area method for braced excavation strut loads: strut load = design apparent lateral pressure x tributary height x horizontal strut spacing"
      ],
      "vectors": [
        {
          "name": "40kPa pressure, 3m tributary height, 4m spacing",
          "inputs": {
            "apparentPressure": 40000,
            "tributaryHeight": 3,
            "strutSpacing": 4
          },
          "expected": 480,
          "toleranceDecimalPlaces": 0,
          "unit": "kN",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "55kPa pressure, 2.5m tributary height, 3.5m spacing",
          "inputs": {
            "apparentPressure": 55000,
            "tributaryHeight": 2.5,
            "strutSpacing": 3.5
          },
          "expected": 481.25,
          "toleranceDecimalPlaces": 2,
          "unit": "kN",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "expansion-joint-filler-calculator",
      "title": "Concrete Expansion Joint Filler Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/expansion-joint-filler-calculator/",
      "sources": [
        "Joint filler volume = joint length x joint width x joint depth, the standard geometric formula for a continuous sealed joint"
      ],
      "vectors": [
        {
          "name": "20m joint, 20mm wide, 20mm deep",
          "inputs": {
            "jointLength": 20,
            "jointWidth": 0.02,
            "jointDepth": 0.02
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "35m joint, 15mm wide, 40mm deep",
          "inputs": {
            "jointLength": 35,
            "jointWidth": 0.015,
            "jointDepth": 0.04
          },
          "expected": 21,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "expansion-tank-sizing-calculator",
      "title": "Thermal Expansion Tank Sizing Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/expansion-tank-sizing-calculator/",
      "sources": [
        "Water expands roughly 2% in volume when heated from typical cold-supply temperature to a standard 120-140°F water heater setpoint; a closed system (with a check valve, backflow preventer, or pressure-reducing valve) needs an expansion tank sized to accept this volume"
      ],
      "vectors": [
        {
          "name": "189 L (50 gal) water heater, 2% expansion",
          "inputs": {
            "heaterVolume": 189,
            "expansionPercent": 2
          },
          "expected": 3.78,
          "toleranceDecimalPlaces": 1,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "80 gallon water heater, 2.5% expansion",
          "inputs": {
            "heaterVolume": 302.8,
            "expansionPercent": 2.5
          },
          "expected": 7.57,
          "toleranceDecimalPlaces": 1,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "extension-cord-gauge-calculator",
      "title": "Extension Cord Gauge Calculator",
      "url": "https://craftquantities.com/calculators/electrical/extension-cord-gauge-calculator/",
      "sources": [
        "Standard single-phase voltage drop formula: Vdrop = (2 x K x length in ft x amps) / circular mils, K=12.9 for copper — the same physics used to size branch-circuit wiring, applied here to cord length",
        "3% voltage drop is a widely used comfort threshold for extension cords to avoid overheating and underpowered tools",
        "NEC Table 400.5(A)(1), allowable ampacity for flexible cords with 2 current-carrying conductors: 16 AWG 13 A, 14 AWG 18 A, 12 AWG 25 A, 10 AWG 30 A — the safety limit, checked before voltage drop"
      ],
      "vectors": [
        {
          "name": "15m cord, 10A, 120V",
          "inputs": {
            "cordLength": 15,
            "currentAmps": 10,
            "circuitVoltage": "120"
          },
          "expected": 14,
          "toleranceDecimalPlaces": 0,
          "unit": "AWG",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop at recommended gauge",
              "value": 2.574381669444604,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "30m cord, 13A, 120V",
          "inputs": {
            "cordLength": 30,
            "currentAmps": 13,
            "circuitVoltage": "120"
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "AWG",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop at recommended gauge",
              "value": 2.650273845827075,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "3m cord, 20A — ampacity governs, not voltage drop",
          "inputs": {
            "cordLength": 3,
            "currentAmps": 20,
            "circuitVoltage": "120"
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "AWG",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop at recommended gauge",
              "value": 0.6481291676212755,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "15ft cord, 15A — 14 AWG is the thinnest rated for it",
          "inputs": {
            "cordLength": 4.572,
            "currentAmps": 15,
            "circuitVoltage": "120"
          },
          "expected": 14,
          "toleranceDecimalPlaces": 0,
          "unit": "AWG",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop at recommended gauge",
              "value": 1.177007299270073,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "3m cord, 10A — a light load still gets the thin cord",
          "inputs": {
            "cordLength": 3,
            "currentAmps": 10,
            "circuitVoltage": "120"
          },
          "expected": 16,
          "toleranceDecimalPlaces": 0,
          "unit": "AWG",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop at recommended gauge",
              "value": 0.8202099737532809,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "extension-ladder-height-calculator",
      "title": "Extension Ladder Size Calculator",
      "url": "https://craftquantities.com/calculators/auto-utility/extension-ladder-height-calculator/",
      "sources": [
        "OSHA 29 CFR 1926.1053(b)(5)(i): \"Non-self-supporting ladders shall be used at an angle such that the horizontal distance from the top support to the foot of the ladder is approximately one-quarter of the working length of the ladder (the distance along the ladder between the foot and the top support)\" — about 75.5° from the ground; 1926.1053(b)(1): when portable ladders are used for access to an upper landing surface, the side rails shall extend at least 3 feet (0.9 m) above it"
      ],
      "vectors": [
        {
          "name": "3.6m height",
          "inputs": {
            "heightNeeded": 3.6
          },
          "expected": 15.198,
          "toleranceDecimalPlaces": 2,
          "unit": "ft (minimum ladder length)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Height to reach",
              "value": 11.811023622047244,
              "unit": "ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "6m height",
          "inputs": {
            "heightNeeded": 6
          },
          "expected": 23.331,
          "toleranceDecimalPlaces": 2,
          "unit": "ft (minimum ladder length)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Height to reach",
              "value": 19.68503937007874,
              "unit": "ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "exterior-paint-calculator",
      "title": "Exterior Paint Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/exterior-paint-calculator/",
      "sources": [
        "Exterior paint typically covers about 250-350 sq ft per gallon per coat, lower than interior drywall's ~350-400 sq ft due to siding texture and porosity"
      ],
      "vectors": [
        {
          "name": "100m² area, 2 coats",
          "inputs": {
            "wallArea": 100,
            "coats": 2
          },
          "expected": 7.5,
          "toleranceDecimalPlaces": 1,
          "unit": "gallons",
          "confidence": "medium",
          "steps": [
            {
              "label": "Area to cover (all coats)",
              "value": 2152.782083341944,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "50m² area, 1 coat",
          "inputs": {
            "wallArea": 50,
            "coats": 1
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "gallons",
          "confidence": "medium",
          "steps": [
            {
              "label": "Area to cover (all coats)",
              "value": 538.195520835486,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "external-stepped-access-calculator",
      "title": "External Stepped Access Calculator (Approved Document M)",
      "url": "https://craftquantities.com/calculators/materials-quantities/external-stepped-access-calculator/",
      "sources": [
        "Approved Document M Volume 2, para 1.33: the rise of each step between 150 mm and 170 mm and the going between 280 mm and 425 mm, consistent throughout a flight; no more than 12 risers in a flight for a going under 350 mm and no more than 18 for a going of 350 mm or more; a level landing at the top and bottom of each flight at least 1200 mm long; no single steps; flights at least 1.2 m wide; no open risers; contrasting nosings 55 mm wide; handrails on both sides"
      ],
      "vectors": [
        {
          "name": "The defaults: 900 mm in steps of at most 160 mm",
          "inputs": {
            "totalRise": 0.9,
            "maxRise": 0.16,
            "going": 0.3
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "risers",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rise of each step",
              "value": 150,
              "unit": "mm"
            },
            {
              "label": "Lowest rise Approved Document M gives for external steps",
              "value": 150,
              "unit": "mm"
            },
            {
              "label": "Highest rise it gives",
              "value": 170,
              "unit": "mm"
            },
            {
              "label": "Going of each step",
              "value": 300,
              "unit": "mm"
            },
            {
              "label": "Most risers in one flight at this going",
              "value": 12,
              "unit": "risers"
            },
            {
              "label": "Flights",
              "value": 1,
              "unit": "flights"
            },
            {
              "label": "Treads",
              "value": 5,
              "unit": "treads"
            },
            {
              "label": "Level landings, top, bottom and between",
              "value": 2,
              "unit": "landings"
            },
            {
              "label": "Each landing, at least",
              "value": 1.2,
              "unit": "m"
            },
            {
              "label": "Horizontal length, landings included",
              "value": 3.9,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Fifteen risers split into two flights at a 300 mm going",
          "inputs": {
            "totalRise": 2.4,
            "maxRise": 0.17,
            "going": 0.3
          },
          "expected": 15,
          "toleranceDecimalPlaces": 0,
          "unit": "risers",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rise of each step",
              "value": 160,
              "unit": "mm"
            },
            {
              "label": "Lowest rise Approved Document M gives for external steps",
              "value": 150,
              "unit": "mm"
            },
            {
              "label": "Highest rise it gives",
              "value": 170,
              "unit": "mm"
            },
            {
              "label": "Going of each step",
              "value": 300,
              "unit": "mm"
            },
            {
              "label": "Most risers in one flight at this going",
              "value": 12,
              "unit": "risers"
            },
            {
              "label": "Flights",
              "value": 2,
              "unit": "flights"
            },
            {
              "label": "Treads",
              "value": 13,
              "unit": "treads"
            },
            {
              "label": "Level landings, top, bottom and between",
              "value": 3,
              "unit": "landings"
            },
            {
              "label": "Each landing, at least",
              "value": 1.2,
              "unit": "m"
            },
            {
              "label": "Horizontal length, landings included",
              "value": 7.5,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Sixteen risers fit one flight at a 400 mm going",
          "inputs": {
            "totalRise": 2.4,
            "maxRise": 0.15,
            "going": 0.4
          },
          "expected": 16,
          "toleranceDecimalPlaces": 0,
          "unit": "risers",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rise of each step",
              "value": 150,
              "unit": "mm"
            },
            {
              "label": "Lowest rise Approved Document M gives for external steps",
              "value": 150,
              "unit": "mm"
            },
            {
              "label": "Highest rise it gives",
              "value": 170,
              "unit": "mm"
            },
            {
              "label": "Going of each step",
              "value": 400,
              "unit": "mm"
            },
            {
              "label": "Most risers in one flight at this going",
              "value": 18,
              "unit": "risers"
            },
            {
              "label": "Flights",
              "value": 1,
              "unit": "flights"
            },
            {
              "label": "Treads",
              "value": 15,
              "unit": "treads"
            },
            {
              "label": "Level landings, top, bottom and between",
              "value": 2,
              "unit": "landings"
            },
            {
              "label": "Each landing, at least",
              "value": 1.2,
              "unit": "m"
            },
            {
              "label": "Horizontal length, landings included",
              "value": 8.4,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A single step",
          "inputs": {
            "totalRise": 0.17,
            "maxRise": 0.17,
            "going": 0.3
          },
          "expected": 1,
          "toleranceDecimalPlaces": 0,
          "unit": "risers",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rise of each step",
              "value": 170,
              "unit": "mm"
            },
            {
              "label": "Lowest rise Approved Document M gives for external steps",
              "value": 150,
              "unit": "mm"
            },
            {
              "label": "Highest rise it gives",
              "value": 170,
              "unit": "mm"
            },
            {
              "label": "Going of each step",
              "value": 300,
              "unit": "mm"
            },
            {
              "label": "Most risers in one flight at this going",
              "value": 12,
              "unit": "risers"
            },
            {
              "label": "Flights",
              "value": 1,
              "unit": "flights"
            },
            {
              "label": "Treads",
              "value": 0,
              "unit": "treads"
            },
            {
              "label": "Level landings, top, bottom and between",
              "value": 2,
              "unit": "landings"
            },
            {
              "label": "Each landing, at least",
              "value": 1.2,
              "unit": "m"
            },
            {
              "label": "Horizontal length, landings included",
              "value": 2.4,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A going below the range",
          "inputs": {
            "totalRise": 1.2,
            "maxRise": 0.16,
            "going": 0.25
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "risers",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rise of each step",
              "value": 150,
              "unit": "mm"
            },
            {
              "label": "Lowest rise Approved Document M gives for external steps",
              "value": 150,
              "unit": "mm"
            },
            {
              "label": "Highest rise it gives",
              "value": 170,
              "unit": "mm"
            },
            {
              "label": "Going of each step",
              "value": 250,
              "unit": "mm"
            },
            {
              "label": "Most risers in one flight at this going",
              "value": 12,
              "unit": "risers"
            },
            {
              "label": "Flights",
              "value": 1,
              "unit": "flights"
            },
            {
              "label": "Treads",
              "value": 7,
              "unit": "treads"
            },
            {
              "label": "Level landings, top, bottom and between",
              "value": 2,
              "unit": "landings"
            },
            {
              "label": "Each landing, at least",
              "value": 1.2,
              "unit": "m"
            },
            {
              "label": "Horizontal length, landings included",
              "value": 4.15,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Twenty-four risers at a 350 mm going",
          "inputs": {
            "totalRise": 3.6,
            "maxRise": 0.15,
            "going": 0.35
          },
          "expected": 24,
          "toleranceDecimalPlaces": 0,
          "unit": "risers",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rise of each step",
              "value": 150,
              "unit": "mm"
            },
            {
              "label": "Lowest rise Approved Document M gives for external steps",
              "value": 150,
              "unit": "mm"
            },
            {
              "label": "Highest rise it gives",
              "value": 170,
              "unit": "mm"
            },
            {
              "label": "Going of each step",
              "value": 350,
              "unit": "mm"
            },
            {
              "label": "Most risers in one flight at this going",
              "value": 18,
              "unit": "risers"
            },
            {
              "label": "Flights",
              "value": 2,
              "unit": "flights"
            },
            {
              "label": "Treads",
              "value": 22,
              "unit": "treads"
            },
            {
              "label": "Level landings, top, bottom and between",
              "value": 3,
              "unit": "landings"
            },
            {
              "label": "Each landing, at least",
              "value": 1.2,
              "unit": "m"
            },
            {
              "label": "Horizontal length, landings included",
              "value": 11.299999999999999,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "fahrenheit-to-celsius-calculator",
      "title": "Fahrenheit to Celsius Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/fahrenheit-to-celsius-calculator/",
      "sources": [
        "Celsius = (Fahrenheit - 32) x 5/9; the scales share a value at -40 degrees"
      ],
      "vectors": [
        {
          "name": "70 °F converts correctly",
          "inputs": {
            "fahrenheit": 70
          },
          "expected": 21.11111111111111,
          "toleranceDecimalPlaces": 6,
          "unit": "°C",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "fahrenheit": 700
          },
          "expected": 371.1111111111111,
          "toleranceDecimalPlaces": 6,
          "unit": "°C",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "fascia-board-calculator",
      "title": "Fascia Board Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/fascia-board-calculator/",
      "sources": [
        "Fascia board is commonly stocked in 12, 16, and 20 ft lengths where timber is sold by the foot, and in the matching 3.6, 4.8 and 6 m lengths where it is sold by the metre; board count = eave length / stock length, rounded up with a waste allowance"
      ],
      "vectors": [
        {
          "name": "15m eave, 12ft boards",
          "inputs": {
            "eaveLength": 15,
            "boardLengthFt": "12"
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "x 12 ft boards",
          "confidence": "high",
          "steps": [
            {
              "label": "Eave length (with waste)",
              "value": 54.13385826771653,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30m eave, 16ft boards",
          "inputs": {
            "eaveLength": 30,
            "boardLengthFt": "16"
          },
          "expected": 7,
          "toleranceDecimalPlaces": 0,
          "unit": "x 16 ft boards",
          "confidence": "high",
          "steps": [
            {
              "label": "Eave length (with waste)",
              "value": 108.26771653543307,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "20m eave, 12ft boards, no allowance",
          "inputs": {
            "eaveLength": 20,
            "boardLengthFt": "12",
            "wastePercent": 0
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "x 12 ft boards",
          "confidence": "high",
          "steps": [
            {
              "label": "Eave length (with waste)",
              "value": 65.61679790026247,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "feet-and-inches-calculator",
      "title": "Feet and Inches Calculator (Add, Subtract, Multiply, Divide)",
      "url": "https://craftquantities.com/calculators/measurements-conversions/feet-and-inches-calculator/",
      "sources": [
        "NIST Handbook 44 (2026 edition), Appendix C, General Tables of Units of Measurement: 12 inches = 1 foot; 1 inch = 2.54 centimetres exactly and 1 foot = 0.3048 metre exactly, per the Federal Register of 1 July 1959 (24 FR 5348); and, on converting, that rounding should be the last step and performed only once",
        "NIST Handbook 44 (2026 edition), Section 5.52 Linear Measures: S.1, a linear measure may be subdivided in inches and binary submultiples of the inch; Table 2, maintenance and acceptance tolerances for metal tapes of 1/32 in up to 6 ft and 1/16 in from 7 to 30 ft"
      ],
      "vectors": [
        {
          "name": "8 ft 3 1/2 in plus 2 ft 8 3/4 in is 11 ft 0 1/4 in",
          "inputs": {
            "firstFeet": 8,
            "firstInches": 3,
            "firstTop": 1,
            "firstBottom": "2",
            "secondValue": "length",
            "lengthOperation": "add",
            "secondFeet": 2,
            "secondInches": 8,
            "secondTop": 3,
            "secondBottom": "4",
            "numberOperation": "multiply",
            "factor": 3,
            "precision": "16"
          },
          "expected": 132.25,
          "toleranceDecimalPlaces": 6,
          "unit": "in (11 ft 0 1/4 in)",
          "confidence": "high",
          "steps": [
            {
              "label": "Decimal feet",
              "value": 11.020833333333334,
              "unit": "ft"
            },
            {
              "label": "Millimetres",
              "value": 3359.1499999999996,
              "unit": "mm"
            },
            {
              "label": "Tape mark minus the exact answer, in millimetres",
              "value": 0,
              "unit": "mm"
            },
            {
              "label": "First length, in inches",
              "value": 99.5,
              "unit": "in (8 ft 3 1/2 in)"
            },
            {
              "label": "Second length, in inches",
              "value": 32.75,
              "unit": "in (2 ft 8 3/4 in)"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "2 ft 8 3/4 in taken off 8 ft 3 1/2 in leaves 5 ft 6 3/4 in",
          "inputs": {
            "firstFeet": 8,
            "firstInches": 3,
            "firstTop": 1,
            "firstBottom": "2",
            "secondValue": "length",
            "lengthOperation": "subtract",
            "secondFeet": 2,
            "secondInches": 8,
            "secondTop": 3,
            "secondBottom": "4",
            "numberOperation": "multiply",
            "factor": 3,
            "precision": "16"
          },
          "expected": 66.75,
          "toleranceDecimalPlaces": 6,
          "unit": "in (5 ft 6 3/4 in)",
          "confidence": "high",
          "steps": [
            {
              "label": "Decimal feet",
              "value": 5.5625,
              "unit": "ft"
            },
            {
              "label": "Millimetres",
              "value": 1695.4499999999998,
              "unit": "mm"
            },
            {
              "label": "Tape mark minus the exact answer, in millimetres",
              "value": 0,
              "unit": "mm"
            },
            {
              "label": "First length, in inches",
              "value": 99.5,
              "unit": "in (8 ft 3 1/2 in)"
            },
            {
              "label": "Second length, in inches",
              "value": 32.75,
              "unit": "in (2 ft 8 3/4 in)"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Taking the longer from the shorter gives the shortfall with a minus sign",
          "inputs": {
            "firstFeet": 2,
            "firstInches": 8,
            "firstTop": 3,
            "firstBottom": "4",
            "secondValue": "length",
            "lengthOperation": "subtract",
            "secondFeet": 8,
            "secondInches": 3,
            "secondTop": 1,
            "secondBottom": "2",
            "numberOperation": "multiply",
            "factor": 3,
            "precision": "16"
          },
          "expected": -66.75,
          "toleranceDecimalPlaces": 6,
          "unit": "in (-5 ft 6 3/4 in)",
          "confidence": "high",
          "steps": [
            {
              "label": "Decimal feet",
              "value": -5.5625,
              "unit": "ft"
            },
            {
              "label": "Millimetres",
              "value": -1695.4499999999998,
              "unit": "mm"
            },
            {
              "label": "Tape mark minus the exact answer, in millimetres",
              "value": 0,
              "unit": "mm"
            },
            {
              "label": "First length, in inches",
              "value": 32.75,
              "unit": "in (2 ft 8 3/4 in)"
            },
            {
              "label": "Second length, in inches",
              "value": 99.5,
              "unit": "in (8 ft 3 1/2 in)"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Three lengths of 8 ft 3 1/2 in come to 24 ft 10 1/2 in",
          "inputs": {
            "firstFeet": 8,
            "firstInches": 3,
            "firstTop": 1,
            "firstBottom": "2",
            "secondValue": "number",
            "lengthOperation": "add",
            "secondFeet": 2,
            "secondInches": 8,
            "secondTop": 3,
            "secondBottom": "4",
            "numberOperation": "multiply",
            "factor": 3,
            "precision": "16"
          },
          "expected": 298.5,
          "toleranceDecimalPlaces": 6,
          "unit": "in (24 ft 10 1/2 in)",
          "confidence": "high",
          "steps": [
            {
              "label": "Decimal feet",
              "value": 24.875,
              "unit": "ft"
            },
            {
              "label": "Millimetres",
              "value": 7581.9,
              "unit": "mm"
            },
            {
              "label": "Tape mark minus the exact answer, in millimetres",
              "value": 0,
              "unit": "mm"
            },
            {
              "label": "First length, in inches",
              "value": 99.5,
              "unit": "in (8 ft 3 1/2 in)"
            },
            {
              "label": "Multiplied by",
              "value": 3
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "8 ft 3 1/2 in shared into three is 33.167 in, marked at 2 ft 9 3/16 in",
          "inputs": {
            "firstFeet": 8,
            "firstInches": 3,
            "firstTop": 1,
            "firstBottom": "2",
            "secondValue": "number",
            "lengthOperation": "add",
            "secondFeet": 2,
            "secondInches": 8,
            "secondTop": 3,
            "secondBottom": "4",
            "numberOperation": "divide",
            "factor": 3,
            "precision": "16"
          },
          "expected": 33.166667,
          "toleranceDecimalPlaces": 5,
          "unit": "in (2 ft 9 3/16 in)",
          "confidence": "high",
          "steps": [
            {
              "label": "Decimal feet",
              "value": 2.763888888888889,
              "unit": "ft"
            },
            {
              "label": "Millimetres",
              "value": 842.4333333333333,
              "unit": "mm"
            },
            {
              "label": "Tape mark minus the exact answer, in millimetres",
              "value": 0.53,
              "unit": "mm"
            },
            {
              "label": "First length, in inches",
              "value": 99.5,
              "unit": "in (8 ft 3 1/2 in)"
            },
            {
              "label": "Divided by",
              "value": 3
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "5 ft 7 3/8 in plus 1 ft 4 5/16 in is 6 ft 11 11/16 in, read to the nearest eighth",
          "inputs": {
            "firstFeet": 5,
            "firstInches": 7,
            "firstTop": 3,
            "firstBottom": "8",
            "secondValue": "length",
            "lengthOperation": "add",
            "secondFeet": 1,
            "secondInches": 4,
            "secondTop": 5,
            "secondBottom": "16",
            "numberOperation": "multiply",
            "factor": 3,
            "precision": "8"
          },
          "expected": 83.6875,
          "toleranceDecimalPlaces": 6,
          "unit": "in (6 ft 11 3/4 in)",
          "confidence": "high",
          "steps": [
            {
              "label": "Decimal feet",
              "value": 6.973958333333333,
              "unit": "ft"
            },
            {
              "label": "Millimetres",
              "value": 2125.6625,
              "unit": "mm"
            },
            {
              "label": "Tape mark minus the exact answer, in millimetres",
              "value": 1.59,
              "unit": "mm"
            },
            {
              "label": "First length, in inches",
              "value": 67.375,
              "unit": "in (5 ft 7 3/8 in)"
            },
            {
              "label": "Second length, in inches",
              "value": 16.3125,
              "unit": "in (1 ft 4 5/16 in)"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1 3/8 in off 2 ft 0 7/16 in leaves 1 ft 11 1/16 in, read to the nearest thirty-second",
          "inputs": {
            "firstFeet": 2,
            "firstInches": 0,
            "firstTop": 7,
            "firstBottom": "16",
            "secondValue": "length",
            "lengthOperation": "subtract",
            "secondFeet": 0,
            "secondInches": 1,
            "secondTop": 3,
            "secondBottom": "8",
            "numberOperation": "multiply",
            "factor": 3,
            "precision": "32"
          },
          "expected": 23.0625,
          "toleranceDecimalPlaces": 6,
          "unit": "in (1 ft 11 1/16 in)",
          "confidence": "high",
          "steps": [
            {
              "label": "Decimal feet",
              "value": 1.921875,
              "unit": "ft"
            },
            {
              "label": "Millimetres",
              "value": 585.7875,
              "unit": "mm"
            },
            {
              "label": "Tape mark minus the exact answer, in millimetres",
              "value": 0,
              "unit": "mm"
            },
            {
              "label": "First length, in inches",
              "value": 24.4375,
              "unit": "in (2 ft 0 7/16 in)"
            },
            {
              "label": "Second length, in inches",
              "value": 1.375,
              "unit": "in (1 3/8 in)"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1 1/32 in plus 1/64 in is 1 3/64 in, read to the nearest sixty-fourth",
          "inputs": {
            "firstFeet": 0,
            "firstInches": 1,
            "firstTop": 1,
            "firstBottom": "32",
            "secondValue": "length",
            "lengthOperation": "add",
            "secondFeet": 0,
            "secondInches": 0,
            "secondTop": 1,
            "secondBottom": "64",
            "numberOperation": "multiply",
            "factor": 3,
            "precision": "64"
          },
          "expected": 1.046875,
          "toleranceDecimalPlaces": 6,
          "unit": "in (1 3/64 in)",
          "confidence": "high",
          "steps": [
            {
              "label": "Decimal feet",
              "value": 0.08723958333333333,
              "unit": "ft"
            },
            {
              "label": "Millimetres",
              "value": 26.590625,
              "unit": "mm"
            },
            {
              "label": "Tape mark minus the exact answer, in millimetres",
              "value": 0,
              "unit": "mm"
            },
            {
              "label": "First length, in inches",
              "value": 1.03125,
              "unit": "in (1 1/32 in)"
            },
            {
              "label": "Second length, in inches",
              "value": 0.015625,
              "unit": "in (1/64 in)"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "63/64 in plus 1/32 in is 1 1/64 in",
          "inputs": {
            "firstFeet": 0,
            "firstInches": 0,
            "firstTop": 63,
            "firstBottom": "64",
            "secondValue": "length",
            "lengthOperation": "add",
            "secondFeet": 0,
            "secondInches": 0,
            "secondTop": 1,
            "secondBottom": "32",
            "numberOperation": "multiply",
            "factor": 3,
            "precision": "16"
          },
          "expected": 1.015625,
          "toleranceDecimalPlaces": 6,
          "unit": "in (1 in)",
          "confidence": "high",
          "steps": [
            {
              "label": "Decimal feet",
              "value": 0.08463541666666667,
              "unit": "ft"
            },
            {
              "label": "Millimetres",
              "value": 25.796875,
              "unit": "mm"
            },
            {
              "label": "Tape mark minus the exact answer, in millimetres",
              "value": -0.4,
              "unit": "mm"
            },
            {
              "label": "First length, in inches",
              "value": 0.984375,
              "unit": "in (63/64 in)"
            },
            {
              "label": "Second length, in inches",
              "value": 0.03125,
              "unit": "in (1/32 in)"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "feet-of-head-to-psi-calculator",
      "title": "Feet of Head to PSI Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/feet-of-head-to-psi-calculator/",
      "sources": [
        "Water density 62.428 lb/ft³ at 4 °C — NIST/CRC standard reference",
        "Hydrostatic pressure p = ρgh; 1 psi ≈ 2.31 ft of water column"
      ],
      "vectors": [
        {
          "name": "100 ft of head is 43.35 psi",
          "inputs": {
            "feetOfHead": 100
          },
          "expected": 43.353,
          "toleranceDecimalPlaces": 3,
          "unit": "psi",
          "confidence": "high",
          "steps": [
            {
              "label": "Head entered",
              "value": 100,
              "unit": "ft"
            },
            {
              "label": "Pressure",
              "value": 43.352777777777774,
              "unit": "psi"
            },
            {
              "label": "Metric equivalent",
              "value": 298.90688076242486,
              "unit": "kPa"
            },
            {
              "label": "Bar",
              "value": 2.9890699811111108,
              "unit": "bar"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "2.31 ft is 1 psi",
          "inputs": {
            "feetOfHead": 2.31
          },
          "expected": 1.0014,
          "toleranceDecimalPlaces": 1,
          "unit": "psi",
          "confidence": "high",
          "steps": [
            {
              "label": "Head entered",
              "value": 2.31,
              "unit": "ft"
            },
            {
              "label": "Pressure",
              "value": 1.0014491666666665,
              "unit": "psi"
            },
            {
              "label": "Metric equivalent",
              "value": 6.904748945612014,
              "unit": "kPa"
            },
            {
              "label": "Bar",
              "value": 0.06904751656366666,
              "unit": "bar"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A 30 ft domestic lift",
          "inputs": {
            "feetOfHead": 30
          },
          "expected": 13.006,
          "toleranceDecimalPlaces": 3,
          "unit": "psi",
          "confidence": "high",
          "steps": [
            {
              "label": "Head entered",
              "value": 30,
              "unit": "ft"
            },
            {
              "label": "Pressure",
              "value": 13.005833333333332,
              "unit": "psi"
            },
            {
              "label": "Metric equivalent",
              "value": 89.67206422872746,
              "unit": "kPa"
            },
            {
              "label": "Bar",
              "value": 0.8967209943333332,
              "unit": "bar"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Zero head is zero pressure",
          "inputs": {
            "feetOfHead": 0
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "psi",
          "confidence": "high",
          "steps": [
            {
              "label": "Head entered",
              "value": 0,
              "unit": "ft"
            },
            {
              "label": "Pressure",
              "value": 0,
              "unit": "psi"
            },
            {
              "label": "Metric equivalent",
              "value": 0,
              "unit": "kPa"
            },
            {
              "label": "Bar",
              "value": 0,
              "unit": "bar"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "feet-per-minute-to-meters-per-second-calculator",
      "title": "Feet per Minute to Metres per Second Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/feet-per-minute-to-meters-per-second-calculator/",
      "sources": [
        "Exact and terminating. 1 ft = 0.3048 m exactly and there are 60 s in a minute, so 1 ft/min = 0.3048 ÷ 60 = 0.00508 m/s with no rounding whatsoever — every digit beyond the eight is a zero."
      ],
      "vectors": [
        {
          "name": "1600 ft/min converts correctly",
          "inputs": {
            "feetPerMinute": 1600
          },
          "expected": 8.128,
          "toleranceDecimalPlaces": 6,
          "unit": "m/s",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.00508,
              "unit": "m/s per ft/min"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "feetPerMinute": 16000
          },
          "expected": 81.28,
          "toleranceDecimalPlaces": 6,
          "unit": "m/s",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.00508,
              "unit": "m/s per ft/min"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "feet-to-inches-calculator",
      "title": "Feet to Inches Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/feet-to-inches-calculator/",
      "sources": [
        "12 inches to the foot — NIST Handbook 44, Appendix C (units of length)",
        "International yard and pound agreement, 1959 — the foot is exactly 0.3048 m"
      ],
      "vectors": [
        {
          "name": "8 feet is 96 inches",
          "inputs": {
            "feet": 8
          },
          "expected": 96,
          "toleranceDecimalPlaces": 8,
          "unit": "in",
          "confidence": "high",
          "steps": [
            {
              "label": "Feet entered",
              "value": 8,
              "unit": "ft"
            },
            {
              "label": "Inches",
              "value": 96,
              "unit": "in"
            },
            {
              "label": "Metres",
              "value": 2.4384,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "1 foot is 12 inches",
          "inputs": {
            "feet": 1
          },
          "expected": 12,
          "toleranceDecimalPlaces": 8,
          "unit": "in",
          "confidence": "high",
          "steps": [
            {
              "label": "Feet entered",
              "value": 1,
              "unit": "ft"
            },
            {
              "label": "Inches",
              "value": 12,
              "unit": "in"
            },
            {
              "label": "Metres",
              "value": 0.3048,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Half a foot is 6 inches",
          "inputs": {
            "feet": 0.5
          },
          "expected": 6,
          "toleranceDecimalPlaces": 8,
          "unit": "in",
          "confidence": "high",
          "steps": [
            {
              "label": "Feet entered",
              "value": 0.5,
              "unit": "ft"
            },
            {
              "label": "Inches",
              "value": 6,
              "unit": "in"
            },
            {
              "label": "Metres",
              "value": 0.1524,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "100 feet is 1200 inches",
          "inputs": {
            "feet": 100
          },
          "expected": 1200,
          "toleranceDecimalPlaces": 6,
          "unit": "in",
          "confidence": "high",
          "steps": [
            {
              "label": "Feet entered",
              "value": 100,
              "unit": "ft"
            },
            {
              "label": "Inches",
              "value": 1200,
              "unit": "in"
            },
            {
              "label": "Metres",
              "value": 30.48,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "feet-to-meters-calculator",
      "title": "Feet to Metres Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/feet-to-meters-calculator/",
      "sources": [
        "1 ft = 12 in = 304.8 mm = 0.3048 m exactly"
      ],
      "vectors": [
        {
          "name": "20 ft converts correctly",
          "inputs": {
            "feet": 20
          },
          "expected": 6.096,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.3048,
              "unit": "m per ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "feet": 200
          },
          "expected": 60.96,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.3048,
              "unit": "m per ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "fence-calculator",
      "title": "Fence Calculator",
      "url": "https://craftquantities.com/calculators/auto-utility/fence-calculator/",
      "sources": [
        "Post count = (fence length / post spacing) + 1; typical post spacing is 6-8 ft for wood fencing",
        "Recommended rails: 2 for fences under 5 ft, 3 for 5-7 ft, 4 for 8 ft fences"
      ],
      "vectors": [
        {
          "name": "30m fence, 8ft spacing, 5-7ft height",
          "inputs": {
            "fenceLength": 30,
            "postSpacingFt": 8,
            "fenceHeightFt": 6
          },
          "expected": 14,
          "toleranceDecimalPlaces": 0,
          "unit": "posts",
          "confidence": "high",
          "steps": [
            {
              "label": "Fence length",
              "value": 98.42519685039369,
              "unit": "ft"
            },
            {
              "label": "Sections",
              "value": 13,
              "unit": "sections"
            },
            {
              "label": "Section width, as set out",
              "value": 7.571168988491822,
              "unit": "ft"
            },
            {
              "label": "Rails needed",
              "value": 39,
              "unit": "rails"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "20m fence, 6ft spacing, under 5ft height",
          "inputs": {
            "fenceLength": 20,
            "postSpacingFt": 6,
            "fenceHeightFt": 4
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "posts",
          "confidence": "high",
          "steps": [
            {
              "label": "Fence length",
              "value": 65.61679790026247,
              "unit": "ft"
            },
            {
              "label": "Sections",
              "value": 11,
              "unit": "sections"
            },
            {
              "label": "Section width, as set out",
              "value": 5.965163445478407,
              "unit": "ft"
            },
            {
              "label": "Rails needed",
              "value": 22,
              "unit": "rails"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "fence-panel-calculator",
      "title": "Fence Panel and Post Calculator (Lap, Closeboard and Privacy Panels)",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/fence-panel-calculator/",
      "sources": [
        "Grange Fencing, How To Put Up A Fence (installation guide): the set-out drawing runs standard 1.83 m wide × 1.8 m high panels between 75 mm posts, 1.980 m for one panel and 3.885, 5.790, 7.695, 9.600, 11.505, 13.410 and 15.315 m for two to eight, a reduced panel where the run falls short; a quarter of the post's total length below ground; panels hung on Metclips nailed to the posts; timber panels kept off the ground by gravel boards fixed with Metpost gravel board clips; a cap or finial on each post",
        "Grange Fencing product data: Professional Lap Panel, 90, 120, 150 and 180 cm high × 183 cm wide; timber fence posts 75 mm and 100 mm square; timber gravel board 15 × 182.8 × 2.2 cm",
        "Freedom Outdoor Living (Barrette Outdoor Living), Brighton 6x6 Privacy Panel installation instructions: the on-centre post spacing is the panel width plus 3/8 in for brackets plus the post width; holes 10 in across for 5 × 5 in posts and 8 in for 4 × 4 in, dug to the frost line over gravel (a 36 in frost line takes 12 in of gravel and 24 in of post in concrete), concrete mixed to the maker's instruction and filled to the top of the hole; a bracket slid onto each rail of the panel; post tops glued on",
        "Freedom Outdoor Living, Brighton 6x6 project planning sheet: panel actual size 68 in high × 65.5 in wide; 5 × 5 × 96 in posts, post tops and two-packs of Set & Secure brackets; posts are one a panel plus one end post to end each run, and one more for each gate; line, corner and end posts",
        "Tarmac Blue Circle, How to build a fence (2024): dig each hole to at least one third of the height of the post and about 3 to 4 times as wide, half fill it with water and pour in Postcrete round the post; it sets in 5 to 10 minutes; 20 kg bags",
        "Tarmac, Postcrete Product Data Sheet (April 2014, © 2016 Tarmac Trading Limited, the copy Wickes hosts): ready to use, no mixing; dig the hole to the depth and width the table gives for the post, fill it with water to a third of its depth and pour in Postcrete until the powder covers the water; 20 kg bags; the number of bags required by post size and hole size (width × depth), from 1/4 bag for a 10 cm (3¾\") square post in a 15 × 45 cm (6 × 18\") hole to 3¾ bags for a 7.5 cm (3\") post in a 30 × 75 cm (12 × 30\") hole, and 2 bags for a 7.5 cm post in a 25 × 60 cm (10 × 24\") hole; no yield is stated",
        "Quikrete Fast-Setting Concrete Mix (No. 1004) data sheet, revised November 2025: 50 lb and 60 lb bags, and 25 kg and 30 kg in Canada, yielding about 0.375, 0.45, 0.41 and 0.5 cu ft (10.6, 12.7, 11.6 and 14 L) a bag; two 50 lb bags set a 3 in (75 mm) square post in a 9 in (225 mm) diameter hole 30 in (0.75 m) deep; dig the hole about 3 times the post's diameter and a third of its overall height deep, pour the dry mix to 3 to 4 in from the top and fill the rest with soil"
      ],
      "vectors": [
        {
          "name": "Grange's own drawing: eight 1.83 m panels on 75 mm posts in 15.315 m",
          "inputs": {
            "fenceLength": 15.315,
            "corners": 0,
            "runs": 1,
            "panelWidth": 1.83,
            "postWidth": 0.075,
            "fixingGap": 0,
            "fixingsPerSide": 3,
            "panelHeight": 1.8,
            "postDepth": 0.6,
            "gravelBoards": "none",
            "gravelBoardHeight": 0.15,
            "holeWidth": 0.25,
            "postFix": "postcrete"
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "high",
          "steps": [
            {
              "label": "Post centres, panel plus gap plus post",
              "value": 1.905,
              "unit": "m"
            },
            {
              "label": "Panels",
              "value": 8,
              "unit": "panels"
            },
            {
              "label": "Cut panel at the end, the whole length as one straight",
              "value": 1.8299999999999983,
              "unit": "m"
            },
            {
              "label": "Posts in all",
              "value": 9,
              "unit": "posts"
            },
            {
              "label": "End posts",
              "value": 2,
              "unit": "posts"
            },
            {
              "label": "Corner posts",
              "value": 0,
              "unit": "posts"
            },
            {
              "label": "Line posts",
              "value": 7,
              "unit": "posts"
            },
            {
              "label": "Post caps",
              "value": 9,
              "unit": "caps"
            },
            {
              "label": "Panel fixings, at both sides of every panel",
              "value": 48,
              "unit": "fixings"
            },
            {
              "label": "Gravel boards",
              "value": 0,
              "unit": "boards"
            },
            {
              "label": "Gravel board clips",
              "value": 0,
              "unit": "clips"
            },
            {
              "label": "Shortest post: depth, gravel board and panel",
              "value": 2.4,
              "unit": "m"
            },
            {
              "label": "Post-fix bags a post",
              "value": 2,
              "unit": "bags"
            },
            {
              "label": "Bags of post-fix mix",
              "value": 18,
              "unit": "bags"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The metric opening: 15 m of Grange lap panels, eight with the last cut",
          "inputs": {
            "fenceLength": 15,
            "corners": 0,
            "runs": 1,
            "panelWidth": 1.83,
            "postWidth": 0.075,
            "fixingGap": 0,
            "fixingsPerSide": 3,
            "panelHeight": 1.8,
            "postDepth": 0.6,
            "gravelBoards": "none",
            "gravelBoardHeight": 0.15,
            "holeWidth": 0.25,
            "postFix": "quikrete-50lb"
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "high",
          "steps": [
            {
              "label": "Post centres, panel plus gap plus post",
              "value": 1.905,
              "unit": "m"
            },
            {
              "label": "Panels",
              "value": 8,
              "unit": "panels"
            },
            {
              "label": "Cut panel at the end, the whole length as one straight",
              "value": 1.5149999999999988,
              "unit": "m"
            },
            {
              "label": "Posts in all",
              "value": 9,
              "unit": "posts"
            },
            {
              "label": "End posts",
              "value": 2,
              "unit": "posts"
            },
            {
              "label": "Corner posts",
              "value": 0,
              "unit": "posts"
            },
            {
              "label": "Line posts",
              "value": 7,
              "unit": "posts"
            },
            {
              "label": "Post caps",
              "value": 9,
              "unit": "caps"
            },
            {
              "label": "Panel fixings, at both sides of every panel",
              "value": 48,
              "unit": "fixings"
            },
            {
              "label": "Gravel boards",
              "value": 0,
              "unit": "boards"
            },
            {
              "label": "Gravel board clips",
              "value": 0,
              "unit": "clips"
            },
            {
              "label": "Shortest post: depth, gravel board and panel",
              "value": 2.4,
              "unit": "m"
            },
            {
              "label": "Hole round each post, less the post",
              "value": 0.9209157892168557,
              "unit": "ft³"
            },
            {
              "label": "Post-fix bags a post",
              "value": 2.455775437911615,
              "unit": "bags"
            },
            {
              "label": "Bags of post-fix mix",
              "value": 23,
              "unit": "bags"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "100 ft of Freedom Brighton panels on 5 in posts at 70.875 in centres, in Quikrete's 60 lb bags",
          "inputs": {
            "fenceLength": 30.48,
            "corners": 0,
            "runs": 1,
            "panelWidth": 1.6637,
            "postWidth": 0.127,
            "fixingGap": 0.009525,
            "fixingsPerSide": 3,
            "panelHeight": 1.7272,
            "postDepth": 0.6096,
            "gravelBoards": "none",
            "gravelBoardHeight": 0.15,
            "holeWidth": 0.254,
            "postFix": "quikrete-60lb"
          },
          "expected": 17,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "high",
          "steps": [
            {
              "label": "Post centres, panel plus gap plus post",
              "value": 1.800225,
              "unit": "m"
            },
            {
              "label": "Panels",
              "value": 17,
              "unit": "panels"
            },
            {
              "label": "Cut panel at the end, the whole length as one straight",
              "value": 1.4128749999999997,
              "unit": "m"
            },
            {
              "label": "Posts in all",
              "value": 18,
              "unit": "posts"
            },
            {
              "label": "End posts",
              "value": 2,
              "unit": "posts"
            },
            {
              "label": "Corner posts",
              "value": 0,
              "unit": "posts"
            },
            {
              "label": "Line posts",
              "value": 16,
              "unit": "posts"
            },
            {
              "label": "Post caps",
              "value": 18,
              "unit": "caps"
            },
            {
              "label": "Panel fixings, at both sides of every panel",
              "value": 102,
              "unit": "fixings"
            },
            {
              "label": "Gravel boards",
              "value": 0,
              "unit": "boards"
            },
            {
              "label": "Gravel board clips",
              "value": 0,
              "unit": "clips"
            },
            {
              "label": "Shortest post: depth, gravel board and panel",
              "value": 2.3368,
              "unit": "m"
            },
            {
              "label": "Hole round each post, less the post",
              "value": 0.7436085602742337,
              "unit": "ft³"
            },
            {
              "label": "Post-fix bags a post",
              "value": 1.652463467276075,
              "unit": "bags"
            },
            {
              "label": "Bags of post-fix mix",
              "value": 30,
              "unit": "bags"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "A U-shaped garden: 25 m with two corners, 100 mm posts at 1.93 m, in Canada's 25 kg bags",
          "inputs": {
            "fenceLength": 25,
            "corners": 2,
            "runs": 1,
            "panelWidth": 1.83,
            "postWidth": 0.1,
            "fixingGap": 0,
            "fixingsPerSide": 3,
            "panelHeight": 1.8,
            "postDepth": 0.6,
            "gravelBoards": "under-every-panel",
            "gravelBoardHeight": 0.15,
            "holeWidth": 0.3,
            "postFix": "quikrete-25kg"
          },
          "expected": 15,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "high",
          "steps": [
            {
              "label": "Post centres, panel plus gap plus post",
              "value": 1.9300000000000002,
              "unit": "m"
            },
            {
              "label": "Panels",
              "value": 15,
              "unit": "panels"
            },
            {
              "label": "Cut panel at the end, the whole length as one straight",
              "value": 1.6400000000000006,
              "unit": "m"
            },
            {
              "label": "Posts in all",
              "value": 16,
              "unit": "posts"
            },
            {
              "label": "End posts",
              "value": 2,
              "unit": "posts"
            },
            {
              "label": "Corner posts",
              "value": 2,
              "unit": "posts"
            },
            {
              "label": "Line posts",
              "value": 12,
              "unit": "posts"
            },
            {
              "label": "Post caps",
              "value": 16,
              "unit": "caps"
            },
            {
              "label": "Panel fixings, at both sides of every panel",
              "value": 90,
              "unit": "fixings"
            },
            {
              "label": "Gravel boards",
              "value": 15,
              "unit": "boards"
            },
            {
              "label": "Gravel board clips",
              "value": 30,
              "unit": "clips"
            },
            {
              "label": "Shortest post: depth, gravel board and panel",
              "value": 2.55,
              "unit": "m"
            },
            {
              "label": "Hole round each post, less the post",
              "value": 1.285860016409775,
              "unit": "ft³"
            },
            {
              "label": "Post-fix bags a post",
              "value": 3.1362439424628663,
              "unit": "bags"
            },
            {
              "label": "Bags of post-fix mix",
              "value": 51,
              "unit": "bags"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A 15 m run in Quikrete's 30 kg bags: still eight panels",
          "inputs": {
            "fenceLength": 15,
            "corners": 0,
            "runs": 1,
            "panelWidth": 1.83,
            "postWidth": 0.075,
            "fixingGap": 0,
            "fixingsPerSide": 3,
            "panelHeight": 1.8,
            "postDepth": 0.6,
            "gravelBoards": "none",
            "gravelBoardHeight": 0.15,
            "holeWidth": 0.25,
            "postFix": "quikrete-30kg"
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "high",
          "steps": [
            {
              "label": "Post centres, panel plus gap plus post",
              "value": 1.905,
              "unit": "m"
            },
            {
              "label": "Panels",
              "value": 8,
              "unit": "panels"
            },
            {
              "label": "Cut panel at the end, the whole length as one straight",
              "value": 1.5149999999999988,
              "unit": "m"
            },
            {
              "label": "Posts in all",
              "value": 9,
              "unit": "posts"
            },
            {
              "label": "End posts",
              "value": 2,
              "unit": "posts"
            },
            {
              "label": "Corner posts",
              "value": 0,
              "unit": "posts"
            },
            {
              "label": "Line posts",
              "value": 7,
              "unit": "posts"
            },
            {
              "label": "Post caps",
              "value": 9,
              "unit": "caps"
            },
            {
              "label": "Panel fixings, at both sides of every panel",
              "value": 48,
              "unit": "fixings"
            },
            {
              "label": "Gravel boards",
              "value": 0,
              "unit": "boards"
            },
            {
              "label": "Gravel board clips",
              "value": 0,
              "unit": "clips"
            },
            {
              "label": "Shortest post: depth, gravel board and panel",
              "value": 2.4,
              "unit": "m"
            },
            {
              "label": "Hole round each post, less the post",
              "value": 0.9209157892168557,
              "unit": "ft³"
            },
            {
              "label": "Post-fix bags a post",
              "value": 1.8418315784337114,
              "unit": "bags"
            },
            {
              "label": "Bags of post-fix mix",
              "value": 17,
              "unit": "bags"
            }
          ],
          "basis": "cited",
          "sourceIndex": 6
        }
      ]
    },
    {
      "slug": "fence-picket-calculator",
      "title": "Fence Picket Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/fence-picket-calculator/",
      "sources": [
        "Picket count = fence length / (picket width + gap width), rounded up with a waste allowance"
      ],
      "vectors": [
        {
          "name": "15m fence, 5.5in pickets, 0.25in gap",
          "inputs": {
            "fenceLength": 15,
            "picketWidth": 0.1397,
            "gapWidth": 0.00635
          },
          "expected": 108,
          "toleranceDecimalPlaces": 1,
          "unit": "pickets",
          "confidence": "high",
          "steps": [
            {
              "label": "Pickets before waste allowance",
              "value": 102.70455323519343,
              "unit": "pickets"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30m fence, 6in pickets, 0.5in gap",
          "inputs": {
            "fenceLength": 30,
            "picketWidth": 0.1524,
            "gapWidth": 0.0127
          },
          "expected": 191,
          "toleranceDecimalPlaces": 1,
          "unit": "pickets",
          "confidence": "high",
          "steps": [
            {
              "label": "Pickets before waste allowance",
              "value": 181.70805572380374,
              "unit": "pickets"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15m fence with no allowance",
          "inputs": {
            "fenceLength": 15,
            "picketWidth": 0.1397,
            "gapWidth": 0.00635,
            "wastePercent": 0
          },
          "expected": 103,
          "toleranceDecimalPlaces": 1,
          "unit": "pickets",
          "confidence": "high",
          "steps": [
            {
              "label": "Pickets before waste allowance",
              "value": 102.70455323519343,
              "unit": "pickets"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "fenestration-rough-opening-calculator",
      "title": "Fenestration Rough Opening Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/fenestration-rough-opening-calculator/",
      "sources": [
        "Width = unit width + two jamb shim spaces + the out-of-square allowance. Height = unit height + the head clearance + sill pan thickness + any sub-sill build-up + the out-of-square allowance.",
        "ASTM E2112, Standard Practice for Installation of Exterior Windows, Doors and Skylights — the practice the shim space and pan sequence follow",
        "AAMA/WDMA/CSA 101/I.S.2/A440, North American Fenestration Standard — the specification a unit's declared size and installation instructions are written against"
      ],
      "vectors": [
        {
          "name": "900 by 1200 unit, 9.5 mm jambs, 6 mm pan",
          "inputs": {
            "unitWidth": 0.9,
            "unitHeight": 1.2,
            "jambShim": 0.0095,
            "headShim": 0.0127,
            "sillPanThickness": 0.006,
            "subSillBuildUp": 0,
            "outOfSquareAllowance": 0.006
          },
          "expected": 925,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Rough opening height",
              "value": 1224.6999999999998,
              "unit": "mm"
            },
            {
              "label": "Shim stack at each jamb",
              "value": 9.5,
              "unit": "mm"
            },
            {
              "label": "Clear space at the head",
              "value": 12.7,
              "unit": "mm"
            },
            {
              "label": "Build-up under the sill",
              "value": 6,
              "unit": "mm"
            },
            {
              "label": "Rough opening area",
              "value": 1.1328475,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "1500 wide unit with a sloped sub-sill packer",
          "inputs": {
            "unitWidth": 1.5,
            "unitHeight": 1.5,
            "jambShim": 0.0127,
            "headShim": 0.0127,
            "sillPanThickness": 0.009,
            "subSillBuildUp": 0.019,
            "outOfSquareAllowance": 0.0095
          },
          "expected": 1534.9,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Rough opening height",
              "value": 1550.2,
              "unit": "mm"
            },
            {
              "label": "Shim stack at each jamb",
              "value": 12.7,
              "unit": "mm"
            },
            {
              "label": "Clear space at the head",
              "value": 12.7,
              "unit": "mm"
            },
            {
              "label": "Build-up under the sill",
              "value": 27.999999999999996,
              "unit": "mm"
            },
            {
              "label": "Rough opening area",
              "value": 2.3794019800000004,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Tight-tolerance opening, minimum shims, no pan",
          "inputs": {
            "unitWidth": 0.6,
            "unitHeight": 0.6,
            "jambShim": 0.003,
            "headShim": 0.003,
            "sillPanThickness": 0,
            "subSillBuildUp": 0,
            "outOfSquareAllowance": 0
          },
          "expected": 606,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Rough opening height",
              "value": 603,
              "unit": "mm"
            },
            {
              "label": "Shim stack at each jamb",
              "value": 3,
              "unit": "mm"
            },
            {
              "label": "Clear space at the head",
              "value": 3,
              "unit": "mm"
            },
            {
              "label": "Build-up under the sill",
              "value": 0,
              "unit": "mm"
            },
            {
              "label": "Rough opening area",
              "value": 0.36541799999999997,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "fiber-cement-caulk-volume-calculator",
      "title": "Fiber-Cement Siding Caulk Joint Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/fiber-cement-caulk-volume-calculator/",
      "sources": [
        "Caulk volume = total joint length × joint width × joint depth, the standard method for estimating a continuous sealant bead"
      ],
      "vectors": [
        {
          "name": "40m joints, 6mm x 6mm",
          "inputs": {
            "totalJointLength": 40,
            "jointWidth": 0.006,
            "jointDepth": 0.006
          },
          "expected": 1.44,
          "toleranceDecimalPlaces": 1,
          "unit": "L",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "55m joints, 8mm x 8mm",
          "inputs": {
            "totalJointLength": 55,
            "jointWidth": 0.008,
            "jointDepth": 0.008
          },
          "expected": 3.52,
          "toleranceDecimalPlaces": 1,
          "unit": "L",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "fiber-cement-corner-post-calculator",
      "title": "Fiber-Cement Siding Corner Post Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/fiber-cement-corner-post-calculator/",
      "sources": [
        "Total corner post length = number of corners × wall height × (1 + waste allowance), since each corner needs a full-height post piece"
      ],
      "vectors": [
        {
          "name": "4 corners, 3m wall, 5% waste",
          "inputs": {
            "cornerCount": 4,
            "wallHeight": 3,
            "wastePercent": 5
          },
          "expected": 12.6,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "6 corners, 2.7m wall, 8% waste",
          "inputs": {
            "cornerCount": 6,
            "wallHeight": 2.7,
            "wastePercent": 8
          },
          "expected": 17.496,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "fiber-cement-cutting-waste-calculator",
      "title": "Fiber-Cement Siding Cutting Waste Factor Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/fiber-cement-cutting-waste-calculator/",
      "sources": [
        "Material needed = area × (1 + waste allowance); fiber-cement siding typically carries a higher cutting waste factor than vinyl or wood siding due to the material's brittleness and the precision required for clean diamond-blade cuts"
      ],
      "vectors": [
        {
          "name": "60m² area, 12% cutting waste",
          "inputs": {
            "area": 60,
            "wastePercent": 12
          },
          "expected": 67.2,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "80m² area, 15% cutting waste",
          "inputs": {
            "area": 80,
            "wastePercent": 15
          },
          "expected": 92,
          "toleranceDecimalPlaces": 0,
          "unit": "m²",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "fiber-cement-reveal-calculator",
      "title": "Fiber-Cement Siding Plank Reveal & Course Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/fiber-cement-reveal-calculator/",
      "sources": [
        "Course count = ceil(wall height ÷ plank reveal), where reveal is the exposed (non-overlapped) height of each installed course — a standard fiber-cement plank has a fixed board width, but only the reveal portion shows once overlapped by the course above"
      ],
      "vectors": [
        {
          "name": "3m wall height, 0.178m reveal",
          "inputs": {
            "wallHeight": 3,
            "reveal": 0.178
          },
          "expected": 17,
          "toleranceDecimalPlaces": 0,
          "unit": "courses",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2.7m wall height, 0.152m reveal",
          "inputs": {
            "wallHeight": 2.7,
            "reveal": 0.152
          },
          "expected": 18,
          "toleranceDecimalPlaces": 0,
          "unit": "courses",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "fill-dirt-cubic-yards-to-tons-calculator",
      "title": "Fill Dirt Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/fill-dirt-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 1.25 short tons per cubic yard",
        "Density varies with moisture, compaction and composition — the supplier's ticket weight governs"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 12.5,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.25,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 125,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.25,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "fill-dirt-tons-to-cubic-yards-calculator",
      "title": "Fill Dirt Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/fill-dirt-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 1.25 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 8,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.8,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 80,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.8,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "finish-level-compound-calculator",
      "title": "Drywall Finish Level Compound Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/finish-level-compound-calculator/",
      "sources": [
        "GA-214 Recommended Levels of Finish for Gypsum Board — the coat counts applied here. Level 1 beds the tape only; Level 2 adds one coat on fastener heads and accessories; Level 3 adds one separate coat over joints and angles and two over heads and accessories; Level 4 puts two separate coats over flat joints, one over interior angles and three over heads and accessories; Level 5 repeats Level 4 and adds a skim coat over the entire surface",
        "ASTM C840 Standard Specification for Application and Finishing of Gypsum Board — joint treatment, the requirement that each coat extend beyond the one below it, and the surface preparation the levels describe",
        "Compound per metre of joint per coat is a RULE OF THUMB, given here as the bead it stands for: a flat joint at 0.06 L/m (a 120 mm band averaging 0.5 mm), a butt joint at 0.12 L/m floated about twice as wide, an interior angle at 0.045 L/m, a fastener head at 0.6 mL and an accessory leg at 0.10 L/m",
        "The Level 5 skim allowance of 0.35 L/m² is also a RULE OF THUMB — roughly one extra 4.5 gal (17 L) box per 500 sq ft (46 m²) of skimmed surface, which is a 0.35 mm average film once the skim has been knifed back",
        "Weight is restated from the published net weight of a 4.5 gal box of all-purpose ready-mixed compound, 61.7 lb over 17.03 L, giving about 1.64 kg per litre"
      ],
      "vectors": [
        {
          "name": "Level 4 on 120 m² with 90 m of flats and 20 m of butts",
          "inputs": {
            "grossArea": 120,
            "flatJointLength": 90,
            "buttJointLength": 20,
            "interiorAngleLength": 60,
            "fastenerCount": 900,
            "accessoryLength": 25,
            "finishLevel": "4",
            "wasteAllowance": 15
          },
          "expected": 43.608,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Before the waste allowance",
              "value": 37.92,
              "unit": "L"
            },
            {
              "label": "Coats over flat and butt joints",
              "value": 3,
              "unit": "coats"
            },
            {
              "label": "Coats over interior angles",
              "value": 2,
              "unit": "coats"
            },
            {
              "label": "Coats over fastener heads and accessories",
              "value": 3,
              "unit": "coats"
            },
            {
              "label": "Skim over the whole surface",
              "value": 0,
              "unit": "L"
            },
            {
              "label": "Seam and joint work alone",
              "value": 37.92,
              "unit": "L"
            },
            {
              "label": "Surface to sand",
              "value": 54.25,
              "unit": "m²"
            },
            {
              "label": "Ready-mixed compound by weight",
              "value": 71.647944,
              "unit": "kg"
            }
          ],
          "includesAllowance": {
            "label": "Waste and sanding loss",
            "percent": 15
          },
          "basis": "ambiguous"
        },
        {
          "name": "Same room at Level 5, skim carried over the gross area",
          "inputs": {
            "grossArea": 120,
            "flatJointLength": 90,
            "buttJointLength": 20,
            "interiorAngleLength": 60,
            "fastenerCount": 900,
            "accessoryLength": 25,
            "finishLevel": "5",
            "wasteAllowance": 15
          },
          "expected": 91.908,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Before the waste allowance",
              "value": 79.92,
              "unit": "L"
            },
            {
              "label": "Coats over flat and butt joints",
              "value": 3,
              "unit": "coats"
            },
            {
              "label": "Coats over interior angles",
              "value": 2,
              "unit": "coats"
            },
            {
              "label": "Coats over fastener heads and accessories",
              "value": 3,
              "unit": "coats"
            },
            {
              "label": "Skim over the whole surface",
              "value": 42,
              "unit": "L"
            },
            {
              "label": "Seam and joint work alone",
              "value": 37.92,
              "unit": "L"
            },
            {
              "label": "Surface to sand",
              "value": 120,
              "unit": "m²"
            },
            {
              "label": "Ready-mixed compound by weight",
              "value": 151.004844,
              "unit": "kg"
            }
          ],
          "includesAllowance": {
            "label": "Waste and sanding loss",
            "percent": 15
          },
          "basis": "ambiguous"
        },
        {
          "name": "Same room at Level 2, one coat everywhere",
          "inputs": {
            "grossArea": 120,
            "flatJointLength": 90,
            "buttJointLength": 20,
            "interiorAngleLength": 60,
            "fastenerCount": 900,
            "accessoryLength": 25,
            "finishLevel": "2",
            "wasteAllowance": 15
          },
          "expected": 15.571,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Before the waste allowance",
              "value": 13.539999999999997,
              "unit": "L"
            },
            {
              "label": "Coats over flat and butt joints",
              "value": 1,
              "unit": "coats"
            },
            {
              "label": "Coats over interior angles",
              "value": 1,
              "unit": "coats"
            },
            {
              "label": "Coats over fastener heads and accessories",
              "value": 1,
              "unit": "coats"
            },
            {
              "label": "Skim over the whole surface",
              "value": 0,
              "unit": "L"
            },
            {
              "label": "Seam and joint work alone",
              "value": 13.539999999999997,
              "unit": "L"
            },
            {
              "label": "Surface to sand",
              "value": 54.25,
              "unit": "m²"
            },
            {
              "label": "Ready-mixed compound by weight",
              "value": 25.583152999999992,
              "unit": "kg"
            }
          ],
          "includesAllowance": {
            "label": "Waste and sanding loss",
            "percent": 15
          },
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "fire-extinguisher-count-calculator",
      "title": "Fire Extinguisher Count and Travel Distance Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/fire-extinguisher-count-calculator/",
      "sources": [
        "NFPA 10 gives a maximum floor area per unit of A by hazard class — 3,000 ft² light, 1,500 ft² ordinary, 1,000 ft² extra — with 11,250 ft² the most any single extinguisher may cover whatever its rating",
        "Maximum travel distance to a Class A extinguisher is 75 ft (about 23 m). On a square grid walked along its axes the worst case is half the spacing in each direction, so one extinguisher covers at most the travel distance squared",
        "BS 5306-8 works to a comparable figure — a 30 m travel distance and a minimum of two extinguishers per floor — which is why the minimum-per-floor field exists"
      ],
      "vectors": [
        {
          "name": "1,000 m² of ordinary hazard, 2-A, 22.86 m travel",
          "inputs": {
            "floorArea": 1000,
            "hazard": "ordinary",
            "ratingA": 2,
            "travelDistance": 22.86,
            "minimumPerFloor": 2
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "extinguishers",
          "confidence": "medium",
          "steps": [
            {
              "label": "By the area rule",
              "value": 4,
              "unit": "extinguishers"
            },
            {
              "label": "By the travel rule",
              "value": 2,
              "unit": "extinguishers"
            },
            {
              "label": "Area one extinguisher covers, area rule",
              "value": 3000.0000000000005,
              "unit": "sq ft"
            },
            {
              "label": "Area one extinguisher covers, travel rule",
              "value": 5625,
              "unit": "sq ft"
            },
            {
              "label": "Grid spacing the travel rule allows",
              "value": 75,
              "unit": "ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Light hazard, where travel governs instead",
          "inputs": {
            "floorArea": 1000,
            "hazard": "light",
            "ratingA": 2,
            "travelDistance": 22.86,
            "minimumPerFloor": 2
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "extinguishers",
          "confidence": "medium",
          "steps": [
            {
              "label": "By the area rule",
              "value": 2,
              "unit": "extinguishers"
            },
            {
              "label": "By the travel rule",
              "value": 2,
              "unit": "extinguishers"
            },
            {
              "label": "Area one extinguisher covers, area rule",
              "value": 6000.000000000001,
              "unit": "sq ft"
            },
            {
              "label": "Area one extinguisher covers, travel rule",
              "value": 5625,
              "unit": "sq ft"
            },
            {
              "label": "Grid spacing the travel rule allows",
              "value": 75,
              "unit": "ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Extra hazard, where the area rule bites hardest",
          "inputs": {
            "floorArea": 1000,
            "hazard": "extra",
            "ratingA": 2,
            "travelDistance": 22.86,
            "minimumPerFloor": 2
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "extinguishers",
          "confidence": "medium",
          "steps": [
            {
              "label": "By the area rule",
              "value": 6,
              "unit": "extinguishers"
            },
            {
              "label": "By the travel rule",
              "value": 2,
              "unit": "extinguishers"
            },
            {
              "label": "Area one extinguisher covers, area rule",
              "value": 2000,
              "unit": "sq ft"
            },
            {
              "label": "Area one extinguisher covers, travel rule",
              "value": 5625,
              "unit": "sq ft"
            },
            {
              "label": "Grid spacing the travel rule allows",
              "value": 75,
              "unit": "ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A small floor still takes the minimum",
          "inputs": {
            "floorArea": 100,
            "hazard": "ordinary",
            "ratingA": 2,
            "travelDistance": 22.86,
            "minimumPerFloor": 2
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "extinguishers",
          "confidence": "medium",
          "steps": [
            {
              "label": "By the area rule",
              "value": 1,
              "unit": "extinguishers"
            },
            {
              "label": "By the travel rule",
              "value": 1,
              "unit": "extinguishers"
            },
            {
              "label": "Area one extinguisher covers, area rule",
              "value": 3000.0000000000005,
              "unit": "sq ft"
            },
            {
              "label": "Area one extinguisher covers, travel rule",
              "value": 5625,
              "unit": "sq ft"
            },
            {
              "label": "Grid spacing the travel rule allows",
              "value": 75,
              "unit": "ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "fire-joint-movement-volume-calculator",
      "title": "Firestop Joint Movement and Sealant Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/fire-joint-movement-volume-calculator/",
      "sources": [
        "UL 2079 Tests for Fire Resistance of Building Joint Systems — a joint system is qualified for a movement class stated as a percentage of its nominal width, and is cycled through that range before the fire and hose-stream exposure",
        "ASTM E1966 Standard Test Method for Fire-Resistive Joint Systems — the companion test method covering the same cycling and exposure, and the standard many listings are published against alongside UL 2079",
        "Volume is geometry, not a published rate: sealant = nominal joint width x listed fill depth x run length x number of treated faces; backing = the uncompressed width needed to reach the specified compression, x backing depth x run length. The fill depth and the compression percentage both come from the tested system's own listing"
      ],
      "vectors": [
        {
          "name": "19 mm joint, 3.2 mm sealant, 60 m run, one face",
          "inputs": {
            "nominalWidth": 0.019,
            "movementClass": 25,
            "runLength": 60,
            "backingDepth": 0.1,
            "backingCompression": 25,
            "sealantDepth": 0.0032,
            "sealantFaces": "1"
          },
          "expected": 3.648,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Narrowest width in service",
              "value": 14.249999999999998,
              "unit": "mm"
            },
            {
              "label": "Widest width in service",
              "value": 23.75,
              "unit": "mm"
            },
            {
              "label": "Total movement the joint absorbs",
              "value": 9.500000000000002,
              "unit": "mm"
            },
            {
              "label": "Backing material before compression",
              "value": 152.00000000000003,
              "unit": "L"
            },
            {
              "label": "Uncompressed backing width required",
              "value": 25.333333333333332,
              "unit": "mm"
            },
            {
              "label": "Sealant if the run were at its widest",
              "value": 4.56,
              "unit": "L"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "25 mm joint, 6.4 mm sealant, 120 m run, both faces",
          "inputs": {
            "nominalWidth": 0.025,
            "movementClass": 50,
            "runLength": 120,
            "backingDepth": 0.15,
            "backingCompression": 33,
            "sealantDepth": 0.0064,
            "sealantFaces": "2"
          },
          "expected": 38.4,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Narrowest width in service",
              "value": 12.5,
              "unit": "mm"
            },
            {
              "label": "Widest width in service",
              "value": 37.50000000000001,
              "unit": "mm"
            },
            {
              "label": "Total movement the joint absorbs",
              "value": 25.000000000000004,
              "unit": "mm"
            },
            {
              "label": "Backing material before compression",
              "value": 671.6417910447761,
              "unit": "L"
            },
            {
              "label": "Uncompressed backing width required",
              "value": 37.3134328358209,
              "unit": "mm"
            },
            {
              "label": "Sealant if the run were at its widest",
              "value": 57.600000000000016,
              "unit": "L"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "fire-rated-glazing-clearance-lookup",
      "title": "Fire-Rated Glazing Typical Edge Clearance Reference",
      "url": "https://craftquantities.com/calculators/materials-quantities/fire-rated-glazing-clearance-lookup/",
      "sources": [
        "Fire-rated glazing edge clearance is NOT governed by a calculable thermal-expansion formula — it is set entirely by the specific tested and listed assembly per UL 9/UL 10B/UL 10C and NFPA 80/257. The values below are commonly-cited TYPICAL figures for reference only."
      ],
      "vectors": [
        {
          "name": "Wire glass, hollow metal frame",
          "inputs": {
            "glazingType": "wire-glass",
            "frameType": "hollow-metal"
          },
          "expected": 9.5,
          "toleranceDecimalPlaces": 1,
          "unit": "mm",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ceramic glazing, hollow metal frame",
          "inputs": {
            "glazingType": "ceramic",
            "frameType": "hollow-metal"
          },
          "expected": 12.7,
          "toleranceDecimalPlaces": 1,
          "unit": "mm",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "fire-rated-gypsum-layer-calculator",
      "title": "Multi-Layer Fire-Rated (Type X) Gypsum Sheet Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/fire-rated-gypsum-layer-calculator/",
      "sources": [
        "Sheets per side = ceil(wall area ÷ sheet area); total sheets = sheets per side × layers per side × 2 sides. The exact number of Type X layers required for a specific fire-resistance rating (1-hr, 2-hr, etc.) must come from a tested UL or GA fire-rated assembly design, not a general formula"
      ],
      "vectors": [
        {
          "name": "20m² wall, 2.88m² sheet, 1 layer/side",
          "inputs": {
            "wallArea": 20,
            "sheetArea": 2.88,
            "layersPerSide": 1
          },
          "expected": 14,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets",
          "confidence": "medium",
          "steps": [
            {
              "label": "Sheets per side (one layer)",
              "value": 7
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30m² wall, 2.88m² sheet, 2 layers/side",
          "inputs": {
            "wallArea": 30,
            "sheetArea": 2.88,
            "layersPerSide": 2
          },
          "expected": 44,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets",
          "confidence": "medium",
          "steps": [
            {
              "label": "Sheets per side (one layer)",
              "value": 11
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "firebrick-thermal-expansion-calculator",
      "title": "Firebrick Chimney Liner Thermal Expansion Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/firebrick-thermal-expansion-calculator/",
      "sources": [
        "Standard linear thermal expansion: ΔL = α x L x ΔT; fireclay/firebrick refractory materials have a coefficient of thermal expansion of approximately 5-6 x 10⁻⁶ per °C, though the exact value varies by specific composition"
      ],
      "vectors": [
        {
          "name": "6m liner, 400°C rise, α=5.5e-6",
          "inputs": {
            "linerLength": 6,
            "temperatureRise": 400,
            "thermalExpansionCoefficient": 0.0000055
          },
          "expected": 13.2,
          "toleranceDecimalPlaces": 1,
          "unit": "mm",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "8m liner, 500°C rise, α=5e-6",
          "inputs": {
            "linerLength": 8,
            "temperatureRise": 500,
            "thermalExpansionCoefficient": 0.000005
          },
          "expected": 20,
          "toleranceDecimalPlaces": 0,
          "unit": "mm",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "fireplace-hearth-size-calculator",
      "title": "Fireplace Hearth Size Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/fireplace-hearth-size-calculator/",
      "sources": [
        "International Code Council, 2021 International Residential Code, R1001.10 Hearth extension dimensions: at least 16 in (406 mm) in front of and 8 in (203 mm) beyond each side of the fireplace opening; at least 20 in (508 mm) and 12 in (305 mm) where the opening is 6 sq ft (0.6 m²) or larger",
        "The same code, R1001.9.1 and R1001.9.2: fireplace hearths at least 4 in (102 mm) thick; hearth extensions at least 2 in (51 mm), or 3/8 in (10 mm) where the bottom of the firebox opening is raised at least 8 in (203 mm) above the extension",
        "HM Government, Approved Document J (2010 edition incorporating 2022 amendments), paragraphs 2.23–2.28 and Diagrams 24–26: a constructional hearth at least 125 mm thick, projecting at least 500 mm from the jamb and 150 mm beyond each side of a fireplace recess, or at least 840 × 840 mm for a free-standing appliance; a hearth surface at least 225 mm (closed appliance) or 300 mm (open appliance) in front and 150 mm at the sides and back"
      ],
      "vectors": [
        {
          "name": "IRC: a 36 × 30 in opening is 7.5 sq ft, so 20 in in front and 12 in each side — 60 × 20 in, 8.33 sq ft",
          "inputs": {
            "rule": "irc",
            "openingWidth": 0.9144,
            "openingHeight": 0.762,
            "recessWidth": 0.9,
            "recessDepth": 0.4,
            "applianceWidth": 0.5,
            "applianceDepth": 0.4,
            "applianceType": "closed"
          },
          "expected": 8.3333,
          "toleranceDecimalPlaces": 3,
          "unit": "sq ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Extension width",
              "value": 60,
              "unit": "in"
            },
            {
              "label": "Extension in front of the opening",
              "value": 20,
              "unit": "in"
            },
            {
              "label": "Extension beyond each side of the opening",
              "value": 11.999999999999998,
              "unit": "in"
            },
            {
              "label": "Fireplace opening area",
              "value": 7.499999999999999,
              "unit": "sq ft"
            },
            {
              "label": "Least hearth extension thickness",
              "value": 2,
              "unit": "in"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "IRC: a 30 × 24 in opening is 5 sq ft, so 16 in in front and 8 in each side — 46 × 16 in, 5.11 sq ft",
          "inputs": {
            "rule": "irc",
            "openingWidth": 0.762,
            "openingHeight": 0.6095999999999999,
            "recessWidth": 0.9,
            "recessDepth": 0.4,
            "applianceWidth": 0.5,
            "applianceDepth": 0.4,
            "applianceType": "closed"
          },
          "expected": 5.1111,
          "toleranceDecimalPlaces": 3,
          "unit": "sq ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Extension width",
              "value": 46.00000000000001,
              "unit": "in"
            },
            {
              "label": "Extension in front of the opening",
              "value": 16,
              "unit": "in"
            },
            {
              "label": "Extension beyond each side of the opening",
              "value": 8,
              "unit": "in"
            },
            {
              "label": "Fireplace opening area",
              "value": 4.999999999999999,
              "unit": "sq ft"
            },
            {
              "label": "Least hearth extension thickness",
              "value": 2,
              "unit": "in"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Approved Document J recess: 900 mm wide and 400 mm deep — 0.36 m² inside plus 1,200 × 500 mm in front, 0.96 m² (10.33 sq ft)",
          "inputs": {
            "rule": "adjRecess",
            "openingWidth": 0.9,
            "openingHeight": 0.76,
            "recessWidth": 0.9,
            "recessDepth": 0.4,
            "applianceWidth": 0.5,
            "applianceDepth": 0.4,
            "applianceType": "closed"
          },
          "expected": 10.3334,
          "toleranceDecimalPlaces": 2,
          "unit": "sq ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Width in front of the recess",
              "value": 47.24409448818898,
              "unit": "in"
            },
            {
              "label": "Projection in front of the jambs",
              "value": 19.68503937007874,
              "unit": "in"
            },
            {
              "label": "Hearth inside the recess",
              "value": 3.8750077500155005,
              "unit": "sq ft"
            },
            {
              "label": "Least hearth thickness",
              "value": 4.921259842519685,
              "unit": "in"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "Approved Document J free-standing: a 500 × 400 mm closed stove needs 800 × 775 mm of clear surface, inside the 840 mm square — 0.7056 m² (7.60 sq ft)",
          "inputs": {
            "rule": "adjFree",
            "openingWidth": 0.9,
            "openingHeight": 0.76,
            "recessWidth": 0.9,
            "recessDepth": 0.4,
            "applianceWidth": 0.5,
            "applianceDepth": 0.4,
            "applianceType": "closed"
          },
          "expected": 7.5951,
          "toleranceDecimalPlaces": 2,
          "unit": "sq ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Hearth width",
              "value": 33.07086614173228,
              "unit": "in"
            },
            {
              "label": "Hearth depth",
              "value": 33.07086614173228,
              "unit": "in"
            },
            {
              "label": "Clear surface in front of the appliance",
              "value": 8.858267716535433,
              "unit": "in"
            },
            {
              "label": "Clear surface the appliance needs (width)",
              "value": 31.496062992125985,
              "unit": "in"
            },
            {
              "label": "Clear surface the appliance needs (depth)",
              "value": 30.511811023622048,
              "unit": "in"
            },
            {
              "label": "Least hearth thickness",
              "value": 4.921259842519685,
              "unit": "in"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "Approved Document J free-standing: a 600 × 500 mm open appliance needs 900 × 950 mm, beyond the square both ways — 0.855 m² (9.20 sq ft)",
          "inputs": {
            "rule": "adjFree",
            "openingWidth": 0.9,
            "openingHeight": 0.76,
            "recessWidth": 0.9,
            "recessDepth": 0.4,
            "applianceWidth": 0.6,
            "applianceDepth": 0.5,
            "applianceType": "open"
          },
          "expected": 9.2031,
          "toleranceDecimalPlaces": 2,
          "unit": "sq ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Hearth width",
              "value": 35.43307086614173,
              "unit": "in"
            },
            {
              "label": "Hearth depth",
              "value": 37.40157480314961,
              "unit": "in"
            },
            {
              "label": "Clear surface in front of the appliance",
              "value": 11.811023622047244,
              "unit": "in"
            },
            {
              "label": "Clear surface the appliance needs (width)",
              "value": 35.43307086614173,
              "unit": "in"
            },
            {
              "label": "Clear surface the appliance needs (depth)",
              "value": 37.40157480314961,
              "unit": "in"
            },
            {
              "label": "Least hearth thickness",
              "value": 4.921259842519685,
              "unit": "in"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "fireplace-mantel-clearance-calculator",
      "title": "Fireplace Mantel Clearance Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/fireplace-mantel-clearance-calculator/",
      "sources": [
        "International Code Council, 2021 International Residential Code, R1001.11 exception 4: combustible mantels or trim not within 6 in (152 mm) of a fireplace opening; within 12 in (306 mm) of the opening, a projection of no more than 1/8 in (3 mm) for each 1 in (25 mm) of distance from it"
      ],
      "vectors": [
        {
          "name": "A 1 in piece of trim: 8 × 1 = 8 in from the opening",
          "inputs": {
            "distance": 0.254,
            "projection": 0.0254
          },
          "expected": 8,
          "toleranceDecimalPlaces": 3,
          "unit": "in",
          "confidence": "high",
          "steps": [
            {
              "label": "Greatest projection at the distance entered",
              "value": 1.25,
              "unit": "in"
            },
            {
              "label": "Nearest any combustible may come",
              "value": 6,
              "unit": "in"
            },
            {
              "label": "Distance beyond which projection is not limited",
              "value": 12,
              "unit": "in"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A 1/2 in bead: 8 × 0.5 = 4 in, but never inside 6 in — 6 in",
          "inputs": {
            "distance": 0.1016,
            "projection": 0.0127
          },
          "expected": 6,
          "toleranceDecimalPlaces": 3,
          "unit": "in",
          "confidence": "high",
          "steps": [
            {
              "label": "Greatest projection at the distance entered",
              "value": 0,
              "unit": "in"
            },
            {
              "label": "Nearest any combustible may come",
              "value": 6,
              "unit": "in"
            },
            {
              "label": "Distance beyond which projection is not limited",
              "value": 12,
              "unit": "in"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A 6 in mantel shelf projects more than the graded zone allows anywhere, so it sits at 12 in",
          "inputs": {
            "distance": 0.30479999999999996,
            "projection": 0.15239999999999998
          },
          "expected": 12,
          "toleranceDecimalPlaces": 3,
          "unit": "in",
          "confidence": "high",
          "steps": [
            {
              "label": "Nearest any combustible may come",
              "value": 6,
              "unit": "in"
            },
            {
              "label": "Distance beyond which projection is not limited",
              "value": 12,
              "unit": "in"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "firestop-caulk-volume-calculator",
      "title": "Penetration Firestop Caulk Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/firestop-caulk-volume-calculator/",
      "sources": [
        "Firestop sealant volume = total penetration perimeter × annular gap width × firestop depth, the standard method for estimating a continuous sealant bead around penetration openings"
      ],
      "vectors": [
        {
          "name": "15m perimeter, 10mm gap, 25mm depth",
          "inputs": {
            "totalPenetrationPerimeter": 15,
            "gapWidth": 0.01,
            "firestopDepth": 0.025
          },
          "expected": 3.75,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "22m perimeter, 12mm gap, 30mm depth",
          "inputs": {
            "totalPenetrationPerimeter": 22,
            "gapWidth": 0.012,
            "firestopDepth": 0.03
          },
          "expected": 7.92,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "firewood-cord-calculator",
      "title": "Firewood Cord Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/firewood-cord-calculator/",
      "sources": [
        "A standard (full) cord is a stacked pile measuring 4 ft x 4 ft x 8 ft, equal to 128 cubic feet"
      ],
      "vectors": [
        {
          "name": "2.4x1.2x1.2m stack",
          "inputs": {
            "stackLength": 2.4,
            "stackWidth": 1.2,
            "stackHeight": 1.2
          },
          "expected": 0.95,
          "toleranceDecimalPlaces": 1,
          "unit": "cords",
          "confidence": "high",
          "steps": [
            {
              "label": "Stack volume",
              "value": 122.04748818946457,
              "unit": "cubic ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "4x0.4x1.2m stack (single row)",
          "inputs": {
            "stackLength": 4,
            "stackWidth": 0.4,
            "stackHeight": 1.2
          },
          "expected": 0.53,
          "toleranceDecimalPlaces": 2,
          "unit": "cords",
          "confidence": "high",
          "steps": [
            {
              "label": "Stack volume",
              "value": 67.80416010525809,
              "unit": "cubic ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "flashing-trim-sheet-calculator",
      "title": "Exterior Flashing Layout Trim Sheet Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/flashing-trim-sheet-calculator/",
      "sources": [
        "Sheet count = ceil(total flashing run length ÷ standard sheet/coil piece length), the standard method for estimating sheet metal flashing material at window heads, wall-to-roof intersections, and other transitions"
      ],
      "vectors": [
        {
          "name": "15m total run, 3.05m sheets",
          "inputs": {
            "totalFlashingLength": 15,
            "sheetLength": 3.05
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "22m total run, 3.05m sheets",
          "inputs": {
            "totalFlashingLength": 22,
            "sheetLength": 3.05
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "flex-duct-friction-loss-calculator",
      "title": "Flexible Duct Friction Pressure Loss Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/flex-duct-friction-loss-calculator/",
      "sources": [
        "Base friction rate (in. w.g. per 100 ft) = 0.109136 × CFM^1.9 ÷ Diameter(in)^5.02, a widely-reproduced curve-fit approximation of the ASHRAE Fundamentals Ch. 21 smooth round galvanized duct friction chart. Flexible duct has significantly higher friction than smooth rigid duct of the same diameter — per ASHRAE-sponsored research (Culp, 'Compression Effects on Pressure Loss in Flexible HVAC Ducts'), a fully-extended flex duct runs roughly 1.5-3x smooth duct friction, while typical field installations with some sag/compression can run 3-4x or considerably higher; ACCA Manual D Appendix 3 and manufacturer-published flex-duct friction charts are the authoritative source for a specific product."
      ],
      "vectors": [
        {
          "name": "150 CFM, 8in, 40ft, install factor 3.5",
          "inputs": {
            "airflow": 70.7921,
            "ductDiameter": 0.2032,
            "runLength": 12.19,
            "installFactor": 3.5
          },
          "expected": 0.061,
          "toleranceDecimalPlaces": 2,
          "unit": "in. w.g.",
          "confidence": "low",
          "steps": [
            {
              "label": "Base smooth-duct friction rate (per 100 ft)",
              "value": 0.04355414549771651,
              "unit": "in. w.g./100 ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "200 CFM, 10in, 60ft, install factor 1.75",
          "inputs": {
            "airflow": 94.3895,
            "ductDiameter": 0.254,
            "runLength": 18.29,
            "installFactor": 1.75
          },
          "expected": 0.0258,
          "toleranceDecimalPlaces": 2,
          "unit": "in. w.g.",
          "confidence": "low",
          "steps": [
            {
              "label": "Base smooth-duct friction rate (per 100 ft)",
              "value": 0.024542857356335792,
              "unit": "in. w.g./100 ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "float-and-set-plaster-calculator",
      "title": "Float and Set Plaster Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/float-and-set-plaster-calculator/",
      "sources": [
        "Geometry, coat by coat: each coat's plaster is the area times that coat's thickness, and its mass is that volume times that product's applied density",
        "Gypsum undercoat plasters publish coverage at a nominal 11 mm — commonly 2.5 to 3 m² per 25 kg bag, an applied density of about 760 to 900 kg/m³ — while finish plaster covers about 10 m² per 25 kg bag at 2 mm, about 1,250 kg/m³"
      ],
      "vectors": [
        {
          "name": "30 m², 11 mm undercoat at 850 and 2 mm finish at 1,250, 15% allowance",
          "inputs": {
            "area": 30,
            "undercoatMm": 0.011,
            "undercoatDensity": 850,
            "finishMm": 0.002,
            "finishDensity": 1250,
            "wastePercent": 15
          },
          "expected": 901.31,
          "toleranceDecimalPlaces": 0,
          "unit": "lb",
          "confidence": "high",
          "steps": [
            {
              "label": "Undercoat",
              "value": 711.1561422428687,
              "unit": "lb"
            },
            {
              "label": "Undercoat, 50 lb bags",
              "value": 15,
              "unit": "bags"
            },
            {
              "label": "Finish",
              "value": 190.1487011344569,
              "unit": "lb"
            },
            {
              "label": "Finish, 50 lb bags",
              "value": 4,
              "unit": "bags"
            },
            {
              "label": "Allowance at 15%",
              "value": 117.56150131008594,
              "unit": "lb"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The undercoat is the order: 10 m² with no allowance",
          "inputs": {
            "area": 10,
            "undercoatMm": 0.011,
            "undercoatDensity": 850,
            "finishMm": 0.002,
            "finishDensity": 1250,
            "wastePercent": 0
          },
          "expected": 261.25,
          "toleranceDecimalPlaces": 0,
          "unit": "lb",
          "confidence": "high",
          "steps": [
            {
              "label": "Undercoat",
              "value": 206.1322151428605,
              "unit": "lb"
            },
            {
              "label": "Undercoat, 50 lb bags",
              "value": 5,
              "unit": "bags"
            },
            {
              "label": "Finish",
              "value": 55.11556554621939,
              "unit": "lb"
            },
            {
              "label": "Finish, 50 lb bags",
              "value": 2,
              "unit": "bags"
            },
            {
              "label": "Allowance at 0%",
              "value": 0,
              "unit": "lb"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A wall out of true, averaging 18 mm of undercoat",
          "inputs": {
            "area": 30,
            "undercoatMm": 0.018,
            "undercoatDensity": 850,
            "finishMm": 0.002,
            "finishDensity": 1250,
            "wastePercent": 0
          },
          "expected": 1177.28,
          "toleranceDecimalPlaces": 0,
          "unit": "lb",
          "confidence": "high",
          "steps": [
            {
              "label": "Undercoat",
              "value": 1011.9217834285879,
              "unit": "lb"
            },
            {
              "label": "Undercoat, 50 lb bags",
              "value": 21,
              "unit": "bags"
            },
            {
              "label": "Finish",
              "value": 165.3466966386582,
              "unit": "lb"
            },
            {
              "label": "Finish, 50 lb bags",
              "value": 4,
              "unit": "bags"
            },
            {
              "label": "Allowance at 0%",
              "value": 0,
              "unit": "lb"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "floor-drain-screed-calculator",
      "title": "Floor Drain Slope Screed Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/floor-drain-screed-calculator/",
      "sources": [
        "Screed volume = area × maximum depth × the average-depth factor for the fall geometry. A ONE-WAY fall, from a high edge down to a linear channel or a threshold, averages HALF the maximum depth. A fall to a CENTRAL POINT drain averages TWO THIRDS of it: the shallow ground near the drain occupies far less plan area than the deep ground out at the perimeter, so the mean is pulled up. Integrating a linear fall over a plane triangle from an edge to a central apex gives exactly 2/3, whatever the room's plan shape"
      ],
      "vectors": [
        {
          "name": "4m² floor, 20mm max depth, one-way fall to a channel",
          "inputs": {
            "fallGeometry": "linear",
            "floorArea": 4,
            "maxDepth": 0.02
          },
          "expected": 40,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "6m² floor, 25mm max depth, one-way fall to a channel",
          "inputs": {
            "fallGeometry": "linear",
            "floorArea": 6,
            "maxDepth": 0.025
          },
          "expected": 75,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "The same 4m² floor falling to a central point drain takes a third more",
          "inputs": {
            "fallGeometry": "point",
            "floorArea": 4,
            "maxDepth": 0.02
          },
          "expected": 53.3333,
          "toleranceDecimalPlaces": 1,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "floor-finish-coverage-calculator",
      "title": "Floor Sanding and Finish Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/floor-finish-coverage-calculator/",
      "sources": [
        "NWFA Sand and Finish Guidelines (updated June 2016): use the last sequenced grit, not skipping more than one grit between sanding cuts, and on parquet not skipping any — every grit sequence offered here keeps to the first rule",
        "Bona Traffic HD technical data sheet (Bona US, 05/27/2026): 350–400 sq ft per gallon (8.6–9.8 m² per litre), not to be spread thinner; a Bona sealer and two coats, a third in heavy traffic; abrading between coats only needed after 48 hours",
        "Junckers product information F 8.5, HP Commercial (UK, 2015-03-05): one coat of PreLak at 8 m² per litre (326 sq ft per US gallon) or ProSeal at 10 m² per litre (407 sq ft per US gallon), then two coats at 10–12 m² per litre (407–489 sq ft per US gallon), sanded with 150–180 grit after the primer; packs of 4.95 L (1.31 US gallons)",
        "DuraSeal 550 VOC Polyurethane product page (oil-based): approximately 500 sq ft per gallon (12.3 m² per litre), at least two coats, abraded between each with a maroon pad or a 120 grit screen; quart, gallon and 5 gallon containers",
        "Minwax Super Fast-Drying Polyurethane for Floors product page: 600–700 sq ft per gallon (14.7–17.2 m² per litre), three coats over bare wood; 1 gallon (3.79 L) and 2.5 gallon (9.46 L) cans",
        "Osmo Polyx-Oil Original product information (version 12/20): 24 m² per litre (978 sq ft per US gallon) for one coat, a second coat applied thinly, no primer and no sanding between coats, floors sanded finally to P120–150; cans from 0.375 to 25 L (0.1 to 6.6 US gallons)",
        "Fiddes Australia, Hard Wax Oil application instructions (version 11-22): no sealer, at most two coats at 20–24 m² per litre (815–978 sq ft per US gallon) depending on how dense the timber is, lightly abraded with a maroon pad before the second; sanded to 120–150",
        "Rubio Monocoat Oil Plus 2C technical data sheet (05/02/2025): colours and protects in one layer at 30–50 m² per litre (1,222–2,037 sq ft per US gallon), depending on wood type and sanding; floors finished with a 100 screen first",
        "Pete's Hardwood Floors, sanding FAQ: a drum sander belt should last 250–300 sq ft (23–28 m²) and an edger disc be changed every 20 linear ft (6.1 m), one US floor contractor's stated figures rather than a maker's rate; the later-grit defaults here, and to be checked against your own machine",
        "Unsourced: no maker or trade body publishes how long a first-grit sheet or disc lasts on an old finish, or how much floor one screening pad buffs; the page opens on its own figures for these and they are the reader's fields, set from the sander and the floor",
        "EPA Renovation, Repair and Painting Rule, 40 CFR Part 745, §745.85(a)(3): in pre-1978 US housing, paid work may not machine-sand paint unless the machine has a shroud or containment and a HEPA vacuum attachment",
        "HSE, Construction hazardous substances: Lead — lead pigments were widely used in house paint until the 1960s and not removed from all common paint until the early 1980s; on-tool extraction (H or M class) and RPE of protection factor 20"
      ],
      "vectors": [
        {
          "name": "20 m² under water-based lacquer, 10% lost to tools (the metric default)",
          "inputs": {
            "floorArea": 20,
            "perimeter": 18,
            "finishSystem": "water-lacquer",
            "extraCoats": 0,
            "containerSize": 5,
            "wastePercent": 10,
            "gritSequence": "standard",
            "firstGritAreaPerSheet": 10,
            "laterGritAreaPerSheet": 23,
            "firstGritEdgePerDisc": 3,
            "laterGritEdgePerDisc": 6.1,
            "screenPadArea": 50,
            "customSealerCoats": 1,
            "customSealerRate": 10,
            "customFinishCoats": 2,
            "customFinishRate": 10,
            "customAbrading": "every"
          },
          "expected": 7.872333,
          "toleranceDecimalPlaces": 4,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Floor area, one coat",
              "value": 20,
              "unit": "m²"
            },
            {
              "label": "Edge for the edger",
              "value": 18,
              "unit": "m"
            },
            {
              "label": "Sealer or primer coats",
              "value": 1,
              "unit": "coats"
            },
            {
              "label": "Sealer or primer to buy",
              "value": 2.75,
              "unit": "L"
            },
            {
              "label": "Sealer or primer containers",
              "value": 1,
              "unit": "containers"
            },
            {
              "label": "Finish coats",
              "value": 2,
              "unit": "coats"
            },
            {
              "label": "Finish to buy",
              "value": 5.122333333333334,
              "unit": "L"
            },
            {
              "label": "Finish containers",
              "value": 2,
              "unit": "containers"
            },
            {
              "label": "Grits in the sanding sequence",
              "value": 4,
              "unit": "grits"
            },
            {
              "label": "Drum or belt sheets, first grit",
              "value": 2,
              "unit": "sheets"
            },
            {
              "label": "Drum or belt sheets, each later grit",
              "value": 1,
              "unit": "sheets"
            },
            {
              "label": "Drum or belt sheets, all grits",
              "value": 5,
              "unit": "sheets"
            },
            {
              "label": "Edger discs, first grit",
              "value": 6,
              "unit": "discs"
            },
            {
              "label": "Edger discs, each later grit",
              "value": 3,
              "unit": "discs"
            },
            {
              "label": "Edger discs, all grits",
              "value": 15,
              "unit": "discs"
            },
            {
              "label": "Rounds of abrading between coats",
              "value": 1,
              "unit": "rounds"
            },
            {
              "label": "Screening pads between coats",
              "value": 1,
              "unit": "pads"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "500 sq ft under oil-modified polyurethane, nothing lost: three coats at 500 sq ft per gallon",
          "inputs": {
            "floorArea": 46.45152,
            "perimeter": 27.4,
            "finishSystem": "oil-poly",
            "extraCoats": 0,
            "containerSize": 3.785411784,
            "wastePercent": 0,
            "gritSequence": "standard",
            "firstGritAreaPerSheet": 10,
            "laterGritAreaPerSheet": 23,
            "firstGritEdgePerDisc": 3,
            "laterGritEdgePerDisc": 6.1,
            "screenPadArea": 50,
            "customSealerCoats": 1,
            "customSealerRate": 10,
            "customFinishCoats": 2,
            "customFinishRate": 10,
            "customAbrading": "every"
          },
          "expected": 11.356235,
          "toleranceDecimalPlaces": 3,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Floor area, one coat",
              "value": 46.45152,
              "unit": "m²"
            },
            {
              "label": "Edge for the edger",
              "value": 27.4,
              "unit": "m"
            },
            {
              "label": "Sealer or primer coats",
              "value": 0,
              "unit": "coats"
            },
            {
              "label": "Sealer or primer to buy",
              "value": 0,
              "unit": "L"
            },
            {
              "label": "Sealer or primer containers",
              "value": 0,
              "unit": "containers"
            },
            {
              "label": "Finish coats",
              "value": 3,
              "unit": "coats"
            },
            {
              "label": "Finish to buy",
              "value": 11.356235351999999,
              "unit": "L"
            },
            {
              "label": "Finish containers",
              "value": 3,
              "unit": "containers"
            },
            {
              "label": "Grits in the sanding sequence",
              "value": 4,
              "unit": "grits"
            },
            {
              "label": "Drum or belt sheets, first grit",
              "value": 5,
              "unit": "sheets"
            },
            {
              "label": "Drum or belt sheets, each later grit",
              "value": 3,
              "unit": "sheets"
            },
            {
              "label": "Drum or belt sheets, all grits",
              "value": 14,
              "unit": "sheets"
            },
            {
              "label": "Edger discs, first grit",
              "value": 10,
              "unit": "discs"
            },
            {
              "label": "Edger discs, each later grit",
              "value": 5,
              "unit": "discs"
            },
            {
              "label": "Edger discs, all grits",
              "value": 25,
              "unit": "discs"
            },
            {
              "label": "Rounds of abrading between coats",
              "value": 2,
              "unit": "rounds"
            },
            {
              "label": "Screening pads between coats",
              "value": 2,
              "unit": "pads"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "30 m² under hardwax oil, 10% lost: two coats at 20 m²/L",
          "inputs": {
            "floorArea": 30,
            "perimeter": 22,
            "finishSystem": "hardwax-oil",
            "extraCoats": 0,
            "containerSize": 2.5,
            "wastePercent": 10,
            "gritSequence": "standard-120",
            "firstGritAreaPerSheet": 10,
            "laterGritAreaPerSheet": 23,
            "firstGritEdgePerDisc": 3,
            "laterGritEdgePerDisc": 6.1,
            "screenPadArea": 50,
            "customSealerCoats": 1,
            "customSealerRate": 10,
            "customFinishCoats": 2,
            "customFinishRate": 10,
            "customAbrading": "every"
          },
          "expected": 3.3,
          "toleranceDecimalPlaces": 6,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Floor area, one coat",
              "value": 30,
              "unit": "m²"
            },
            {
              "label": "Edge for the edger",
              "value": 22,
              "unit": "m"
            },
            {
              "label": "Sealer or primer coats",
              "value": 0,
              "unit": "coats"
            },
            {
              "label": "Sealer or primer to buy",
              "value": 0,
              "unit": "L"
            },
            {
              "label": "Sealer or primer containers",
              "value": 0,
              "unit": "containers"
            },
            {
              "label": "Finish coats",
              "value": 2,
              "unit": "coats"
            },
            {
              "label": "Finish to buy",
              "value": 3.3000000000000003,
              "unit": "L"
            },
            {
              "label": "Finish containers",
              "value": 2,
              "unit": "containers"
            },
            {
              "label": "Grits in the sanding sequence",
              "value": 5,
              "unit": "grits"
            },
            {
              "label": "Drum or belt sheets, first grit",
              "value": 3,
              "unit": "sheets"
            },
            {
              "label": "Drum or belt sheets, each later grit",
              "value": 2,
              "unit": "sheets"
            },
            {
              "label": "Drum or belt sheets, all grits",
              "value": 11,
              "unit": "sheets"
            },
            {
              "label": "Edger discs, first grit",
              "value": 8,
              "unit": "discs"
            },
            {
              "label": "Edger discs, each later grit",
              "value": 4,
              "unit": "discs"
            },
            {
              "label": "Edger discs, all grits",
              "value": 24,
              "unit": "discs"
            },
            {
              "label": "Rounds of abrading between coats",
              "value": 1,
              "unit": "rounds"
            },
            {
              "label": "Screening pads between coats",
              "value": 1,
              "unit": "pads"
            }
          ],
          "basis": "cited",
          "sourceIndex": 6
        },
        {
          "name": "45 m² under a one-coat penetrating oil, nothing lost: one coat at 30 m²/L",
          "inputs": {
            "floorArea": 45,
            "perimeter": 27,
            "finishSystem": "penetrating-oil",
            "extraCoats": 0,
            "containerSize": 1,
            "wastePercent": 0,
            "gritSequence": "light",
            "firstGritAreaPerSheet": 10,
            "laterGritAreaPerSheet": 23,
            "firstGritEdgePerDisc": 3,
            "laterGritEdgePerDisc": 6.1,
            "screenPadArea": 50,
            "customSealerCoats": 1,
            "customSealerRate": 10,
            "customFinishCoats": 2,
            "customFinishRate": 10,
            "customAbrading": "every"
          },
          "expected": 1.5,
          "toleranceDecimalPlaces": 6,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Floor area, one coat",
              "value": 45,
              "unit": "m²"
            },
            {
              "label": "Edge for the edger",
              "value": 27,
              "unit": "m"
            },
            {
              "label": "Sealer or primer coats",
              "value": 0,
              "unit": "coats"
            },
            {
              "label": "Sealer or primer to buy",
              "value": 0,
              "unit": "L"
            },
            {
              "label": "Sealer or primer containers",
              "value": 0,
              "unit": "containers"
            },
            {
              "label": "Finish coats",
              "value": 1,
              "unit": "coats"
            },
            {
              "label": "Finish to buy",
              "value": 1.5,
              "unit": "L"
            },
            {
              "label": "Finish containers",
              "value": 2,
              "unit": "containers"
            },
            {
              "label": "Grits in the sanding sequence",
              "value": 3,
              "unit": "grits"
            },
            {
              "label": "Drum or belt sheets, first grit",
              "value": 5,
              "unit": "sheets"
            },
            {
              "label": "Drum or belt sheets, each later grit",
              "value": 2,
              "unit": "sheets"
            },
            {
              "label": "Drum or belt sheets, all grits",
              "value": 9,
              "unit": "sheets"
            },
            {
              "label": "Edger discs, first grit",
              "value": 9,
              "unit": "discs"
            },
            {
              "label": "Edger discs, each later grit",
              "value": 5,
              "unit": "discs"
            },
            {
              "label": "Edger discs, all grits",
              "value": 19,
              "unit": "discs"
            },
            {
              "label": "Rounds of abrading between coats",
              "value": 0,
              "unit": "rounds"
            },
            {
              "label": "Screening pads between coats",
              "value": 0,
              "unit": "pads"
            }
          ],
          "basis": "cited",
          "sourceIndex": 7
        },
        {
          "name": "20 m² of the reader's own lacquer, sealer at 12 and finish at 8 m²/L, three coats, abraded once after the sealer, coarse sequence",
          "inputs": {
            "floorArea": 20,
            "perimeter": 18,
            "finishSystem": "custom",
            "extraCoats": 0,
            "containerSize": 5,
            "wastePercent": 0,
            "gritSequence": "coarse",
            "firstGritAreaPerSheet": 10,
            "laterGritAreaPerSheet": 23,
            "firstGritEdgePerDisc": 3,
            "laterGritEdgePerDisc": 6.1,
            "screenPadArea": 50,
            "customSealerCoats": 1,
            "customSealerRate": 12,
            "customFinishCoats": 3,
            "customFinishRate": 8,
            "customAbrading": "after-sealer"
          },
          "expected": 9.166667,
          "toleranceDecimalPlaces": 5,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Floor area, one coat",
              "value": 20,
              "unit": "m²"
            },
            {
              "label": "Edge for the edger",
              "value": 18,
              "unit": "m"
            },
            {
              "label": "Sealer or primer coats",
              "value": 1,
              "unit": "coats"
            },
            {
              "label": "Sealer or primer to buy",
              "value": 1.6666666666666667,
              "unit": "L"
            },
            {
              "label": "Sealer or primer containers",
              "value": 1,
              "unit": "containers"
            },
            {
              "label": "Finish coats",
              "value": 3,
              "unit": "coats"
            },
            {
              "label": "Finish to buy",
              "value": 7.5,
              "unit": "L"
            },
            {
              "label": "Finish containers",
              "value": 2,
              "unit": "containers"
            },
            {
              "label": "Grits in the sanding sequence",
              "value": 5,
              "unit": "grits"
            },
            {
              "label": "Drum or belt sheets, first grit",
              "value": 2,
              "unit": "sheets"
            },
            {
              "label": "Drum or belt sheets, each later grit",
              "value": 1,
              "unit": "sheets"
            },
            {
              "label": "Drum or belt sheets, all grits",
              "value": 6,
              "unit": "sheets"
            },
            {
              "label": "Edger discs, first grit",
              "value": 6,
              "unit": "discs"
            },
            {
              "label": "Edger discs, each later grit",
              "value": 3,
              "unit": "discs"
            },
            {
              "label": "Edger discs, all grits",
              "value": 18,
              "unit": "discs"
            },
            {
              "label": "Rounds of abrading between coats",
              "value": 1,
              "unit": "rounds"
            },
            {
              "label": "Screening pads between coats",
              "value": 1,
              "unit": "pads"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "30 m² of the reader's own oil, no sealer, two coats at 15 m²/L, never abraded, 5% lost",
          "inputs": {
            "floorArea": 30,
            "perimeter": 22,
            "finishSystem": "custom",
            "extraCoats": 0,
            "containerSize": 1,
            "wastePercent": 5,
            "gritSequence": "standard",
            "firstGritAreaPerSheet": 10,
            "laterGritAreaPerSheet": 23,
            "firstGritEdgePerDisc": 3,
            "laterGritEdgePerDisc": 6.1,
            "screenPadArea": 50,
            "customSealerCoats": 0,
            "customSealerRate": 10,
            "customFinishCoats": 2,
            "customFinishRate": 15,
            "customAbrading": "none"
          },
          "expected": 4.2,
          "toleranceDecimalPlaces": 6,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Floor area, one coat",
              "value": 30,
              "unit": "m²"
            },
            {
              "label": "Edge for the edger",
              "value": 22,
              "unit": "m"
            },
            {
              "label": "Sealer or primer coats",
              "value": 0,
              "unit": "coats"
            },
            {
              "label": "Sealer or primer to buy",
              "value": 0,
              "unit": "L"
            },
            {
              "label": "Sealer or primer containers",
              "value": 0,
              "unit": "containers"
            },
            {
              "label": "Finish coats",
              "value": 2,
              "unit": "coats"
            },
            {
              "label": "Finish to buy",
              "value": 4.2,
              "unit": "L"
            },
            {
              "label": "Finish containers",
              "value": 5,
              "unit": "containers"
            },
            {
              "label": "Grits in the sanding sequence",
              "value": 4,
              "unit": "grits"
            },
            {
              "label": "Drum or belt sheets, first grit",
              "value": 3,
              "unit": "sheets"
            },
            {
              "label": "Drum or belt sheets, each later grit",
              "value": 2,
              "unit": "sheets"
            },
            {
              "label": "Drum or belt sheets, all grits",
              "value": 9,
              "unit": "sheets"
            },
            {
              "label": "Edger discs, first grit",
              "value": 8,
              "unit": "discs"
            },
            {
              "label": "Edger discs, each later grit",
              "value": 4,
              "unit": "discs"
            },
            {
              "label": "Edger discs, all grits",
              "value": 20,
              "unit": "discs"
            },
            {
              "label": "Rounds of abrading between coats",
              "value": 0,
              "unit": "rounds"
            },
            {
              "label": "Screening pads between coats",
              "value": 0,
              "unit": "pads"
            }
          ],
          "basis": "cited",
          "sourceIndex": 5
        }
      ]
    },
    {
      "slug": "floor-perimeter-expansion-gap-calculator",
      "title": "Floating Floor Perimeter Expansion Gap Spacer Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/floor-perimeter-expansion-gap-calculator/",
      "sources": [
        "Expansion spacer count = ceil(room perimeter ÷ spacer spacing), maintaining the manufacturer-required expansion gap consistently around a floating (unattached) floor's edge"
      ],
      "vectors": [
        {
          "name": "24m perimeter, 0.35m spacing",
          "inputs": {
            "roomPerimeter": 24,
            "spacerSpacing": 0.35
          },
          "expected": 69,
          "toleranceDecimalPlaces": 0,
          "unit": "spacers",
          "confidence": "high",
          "steps": [
            {
              "label": "Spacer centres round the room",
              "value": 0.34782608695652173,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "32m perimeter, 0.3m spacing",
          "inputs": {
            "roomPerimeter": 32,
            "spacerSpacing": 0.3
          },
          "expected": 107,
          "toleranceDecimalPlaces": 0,
          "unit": "spacers",
          "confidence": "high",
          "steps": [
            {
              "label": "Spacer centres round the room",
              "value": 0.29906542056074764,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "floor-primer-dilution-calculator",
      "title": "Floor Primer Dilution and Coverage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/floor-primer-dilution-calculator/",
      "sources": [
        "Mixed volume = area × coats ÷ the coverage rate published for the MIXED primer; neat primer = mixed volume ÷ (1 + parts of water per part of primer); the water is the remainder",
        "Dilution ratio, coverage rate and the number of coats are all product data from the primer manufacturer's instructions, which set them against the absorbency of the substrate — there is no general dilution for floor primer"
      ],
      "vectors": [
        {
          "name": "30 m² at 8 m²/L mixed, one coat at 1:1",
          "inputs": {
            "floorArea": 30,
            "mixCoverageRate": 8,
            "dilutionParts": 1,
            "coats": 1,
            "containerSize": 5
          },
          "expected": 1.875,
          "toleranceDecimalPlaces": 3,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Containers of neat primer to buy",
              "value": 1,
              "unit": "containers"
            },
            {
              "label": "Water to add",
              "value": 1.875,
              "unit": "L"
            },
            {
              "label": "Mixed primer this makes",
              "value": 3.75,
              "unit": "L"
            },
            {
              "label": "Neat primer left in the last container",
              "value": 3.125,
              "unit": "L"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "120 m², two coats, neat over a dense power-floated slab",
          "inputs": {
            "floorArea": 120,
            "mixCoverageRate": 10,
            "dilutionParts": 0,
            "coats": 2,
            "containerSize": 5
          },
          "expected": 24,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Containers of neat primer to buy",
              "value": 5,
              "unit": "containers"
            },
            {
              "label": "Water to add",
              "value": 0,
              "unit": "L"
            },
            {
              "label": "Mixed primer this makes",
              "value": 24,
              "unit": "L"
            },
            {
              "label": "Neat primer left in the last container",
              "value": 1,
              "unit": "L"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "floor-screed-calculator",
      "title": "Floor Screed Calculator — Sand and Cement, Bagged or Liquid",
      "url": "https://craftquantities.com/calculators/materials-quantities/floor-screed-calculator/",
      "sources": [
        "Mineral Products Association, MPA Mortar Data Sheet 22, Screeds (Issue 3, October 2023), reporting BS 8204-1: a bonded screed at least 25 mm thick, with 40 mm normally specified to accommodate deviations in the base; an unbonded screed at least 50 mm, with 70 mm specified; a floating screed at least 75 mm, although 65 mm is normally considered satisfactory for domestic housing; nominal proportions by weight of cement to fine aggregate of 1:4, with a lower limit of 1:3 and an upper limit of 1:4.5",
        "Anhydritec Ltd, Gyvlon XTR free flowing calcium sulfate screed (NBS Source product page): minimum thickness bonded 25 mm, in contact with the substrate 30 mm, unbonded 30 mm, floating domestic 35 mm, floating commercial 40 mm, and 25 mm (30 mm nominal) cover to underfloor heating pipes; wet density 2,200 kg/m³, dry density 2,000 kg/m³",
        "ARDEX UK, ARDEX A 70 GYPFLO product data sheet (July 2019), a bagged calcium sulphate flowing screed: minimum thickness floating 35 mm domestic and 45 mm commercial, unbonded 30 mm domestic and 40 mm commercial; a 25 kg bag covers approximately 0.4 m² at 35 mm — a second maker's figures, which is why the page names whose minimum it quotes",
        "Sika, SikaScreed-40 Binder product data sheet (Version 04.01, February 2026): binder to sand by weight, 400 kg of binder per m³ of fresh mortar at 1:4 (4 bags of 20 kg to about 320 kg of aggregate in a 200 litre mixer), 340 kg at 1:5 and 290 kg at 1:6 — 2,000 kg of material as batched in each cubic metre at 1:4; the sheet does not say whether the aggregate is dry",
        "Marshalls, Factory Batched Screed data sheet (13 April 2018), ready-to-lay retarded cement and sand screeds: coverage 45.0 m² a tonne at 10 mm, 18.0 at 25 mm, 9.0 at 50 mm and 6.0 at 75 mm, which is 0.45 m³ of laid screed a tonne; its traditional levelling screeds are sold in volume proportions, 1:3 for heavy duty, 1:4 for general purpose and 1:5 for light duty",
        "ARDEX UK, ARDEX A 38 MIX product data sheet (January 2024), a pre-blended cement and graded sand screed in 25 kg bags: material requirement approximately 1.85 kg per m² per millimetre of thickness, about 0.5 m² at 25 mm a bag; laid bonded at 15–40 mm, unbonded from 40 mm, floating from 75 mm or 65 mm in lightly loaded or domestic locations",
        "QUIKRETE Sand/Topping Mix (No. 1103) data sheet (revised December 2022): for overlays less than 2 in (50 mm) thick and thick setting beds for floor tile; an 80 lb bag yields approximately 0.66 ft³ (18.7 L), and the Canadian 25 kg bag approximately 0.46 ft³ (13 L)",
        "QUIKRETE Portland Cement (No. 1124) data sheet (revised August 2022): sold in 94 lb (42.6 kg) bags, among other sizes",
        "Holcim UK, Screed Calculator: \"We recommend allowing for a 5% margin to cover additional needs\" — the margin this page opens on",
        "Heidelberg Materials UK, Sharp Sand product guide: a washed sand to BS EN 13139 for screeds, with a typical moisture content of 5%"
      ],
      "vectors": [
        {
          "name": "20 m² floating screed at 75 mm, site-mixed 1 : 4, 25 kg bags, 5% margin",
          "inputs": {
            "floorArea": 20,
            "screedDepth": 0.075,
            "construction": "floating-domestic",
            "screedType": "site-mixed",
            "mixRatio": "4",
            "dryMixDensity": 2000,
            "cementBagMass": 25,
            "deliveredDensity": 2220,
            "bagYield": 13.513513513513512,
            "wastePercent": 5
          },
          "expected": 1.575,
          "toleranceDecimalPlaces": 3,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Screed volume at the depth entered",
              "value": 1.5,
              "unit": "m³"
            },
            {
              "label": "Sand and cement together, as batched",
              "value": 3.1500000000000004,
              "unit": "t"
            },
            {
              "label": "Cement by weight",
              "value": 630.0000000000001,
              "unit": "kg"
            },
            {
              "label": "Cement bags at the size entered",
              "value": 26,
              "unit": "bags"
            },
            {
              "label": "Sharp sand by weight",
              "value": 2.5200000000000005,
              "unit": "t"
            },
            {
              "label": "Least depth for this screed laid this way",
              "value": 65,
              "unit": "mm"
            }
          ],
          "includesAllowance": {
            "label": "Over-order for spillage, the mixer's leavings and edges",
            "percent": 5
          },
          "basis": "cited",
          "sourceIndex": 8
        },
        {
          "name": "The same floor in liquid calcium sulfate at Anhydritec's 35 mm floating domestic depth",
          "inputs": {
            "floorArea": 20,
            "screedDepth": 0.035,
            "construction": "floating-domestic",
            "screedType": "liquid-anhydrite",
            "mixRatio": "4",
            "dryMixDensity": 2000,
            "cementBagMass": 25,
            "deliveredDensity": 2220,
            "bagYield": 13.513513513513512,
            "wastePercent": 5
          },
          "expected": 0.735,
          "toleranceDecimalPlaces": 3,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Screed volume at the depth entered",
              "value": 0.7000000000000001,
              "unit": "m³"
            },
            {
              "label": "Least depth for this screed laid this way",
              "value": 35,
              "unit": "mm"
            }
          ],
          "includesAllowance": {
            "label": "Over-order for spillage, the mixer's leavings and edges",
            "percent": 5
          },
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A 12 m² bonded floor at BS 8204-1's specified 40 mm, from bags of premix",
          "inputs": {
            "floorArea": 12,
            "screedDepth": 0.04,
            "construction": "bonded",
            "screedType": "bagged",
            "mixRatio": "4",
            "dryMixDensity": 2000,
            "cementBagMass": 25,
            "deliveredDensity": 2220,
            "bagYield": 13.513513513513512,
            "wastePercent": 5
          },
          "expected": 0.504,
          "toleranceDecimalPlaces": 3,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Screed volume at the depth entered",
              "value": 0.48,
              "unit": "m³"
            },
            {
              "label": "Bags of screed mix",
              "value": 38,
              "unit": "bags"
            },
            {
              "label": "Least depth for this screed laid this way",
              "value": 25,
              "unit": "mm"
            }
          ],
          "includesAllowance": {
            "label": "Over-order for spillage, the mixer's leavings and edges",
            "percent": 5
          },
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "floor-tile-calculator",
      "title": "Floor & Wall Tile Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/floor-tile-calculator/",
      "sources": [
        "TCNA Handbook and BS 5385 both recommend 5-10% waste for a straight lay and 15-20% for a diagonal or herringbone pattern",
        "Tile is sold by the box; box coverage varies by format and must come from the supplier"
      ],
      "vectors": [
        {
          "name": "12 m² of 600×300 straight, 6 per box",
          "inputs": {
            "area": 12,
            "tileLength": 0.6,
            "tileWidth": 0.3,
            "pattern": "straight",
            "tilesPerBox": 6
          },
          "expected": 74,
          "toleranceDecimalPlaces": 0,
          "unit": "tiles",
          "confidence": "high",
          "steps": [
            {
              "label": "Boxes to order",
              "value": 13,
              "unit": "boxes"
            },
            {
              "label": "Tiles before waste",
              "value": 66.66666666666667,
              "unit": "tiles"
            },
            {
              "label": "Waste applied",
              "value": 10,
              "unit": "%"
            },
            {
              "label": "Area covered by the boxes",
              "value": 14.04,
              "unit": "m²"
            },
            {
              "label": "Spare after the job",
              "value": 4,
              "unit": "tiles"
            }
          ],
          "includesAllowance": {
            "label": "Pattern waste",
            "percent": 10,
            "base": 66.66666666666667
          },
          "basis": "ambiguous"
        },
        {
          "name": "Diagonal raises the count",
          "inputs": {
            "area": 12,
            "tileLength": 0.6,
            "tileWidth": 0.3,
            "pattern": "diagonal",
            "tilesPerBox": 6
          },
          "expected": 79,
          "toleranceDecimalPlaces": 0,
          "unit": "tiles",
          "confidence": "high",
          "steps": [
            {
              "label": "Boxes to order",
              "value": 14,
              "unit": "boxes"
            },
            {
              "label": "Tiles before waste",
              "value": 66.66666666666667,
              "unit": "tiles"
            },
            {
              "label": "Waste applied",
              "value": 18,
              "unit": "%"
            },
            {
              "label": "Area covered by the boxes",
              "value": 15.12,
              "unit": "m²"
            },
            {
              "label": "Spare after the job",
              "value": 5,
              "unit": "tiles"
            }
          ],
          "includesAllowance": {
            "label": "Pattern waste",
            "percent": 18,
            "base": 66.66666666666667
          },
          "basis": "ambiguous"
        },
        {
          "name": "Smaller 300×300 tiles double the count",
          "inputs": {
            "area": 12,
            "tileLength": 0.3,
            "tileWidth": 0.3,
            "pattern": "straight",
            "tilesPerBox": 11
          },
          "expected": 147,
          "toleranceDecimalPlaces": 0,
          "unit": "tiles",
          "confidence": "high",
          "steps": [
            {
              "label": "Boxes to order",
              "value": 14,
              "unit": "boxes"
            },
            {
              "label": "Tiles before waste",
              "value": 133.33333333333334,
              "unit": "tiles"
            },
            {
              "label": "Waste applied",
              "value": 10,
              "unit": "%"
            },
            {
              "label": "Area covered by the boxes",
              "value": 13.86,
              "unit": "m²"
            },
            {
              "label": "Spare after the job",
              "value": 7,
              "unit": "tiles"
            }
          ],
          "includesAllowance": {
            "label": "Pattern waste",
            "percent": 10,
            "base": 133.33333333333334
          },
          "basis": "ambiguous"
        },
        {
          "name": "Double the area doubles the tiles",
          "inputs": {
            "area": 24,
            "tileLength": 0.6,
            "tileWidth": 0.3,
            "pattern": "straight",
            "tilesPerBox": 6
          },
          "expected": 147,
          "toleranceDecimalPlaces": 0,
          "unit": "tiles",
          "confidence": "high",
          "steps": [
            {
              "label": "Boxes to order",
              "value": 25,
              "unit": "boxes"
            },
            {
              "label": "Tiles before waste",
              "value": 133.33333333333334,
              "unit": "tiles"
            },
            {
              "label": "Waste applied",
              "value": 10,
              "unit": "%"
            },
            {
              "label": "Area covered by the boxes",
              "value": 27,
              "unit": "m²"
            },
            {
              "label": "Spare after the job",
              "value": 3,
              "unit": "tiles"
            }
          ],
          "includesAllowance": {
            "label": "Pattern waste",
            "percent": 10,
            "base": 133.33333333333334
          },
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "floor-transition-strip-calculator",
      "title": "Floor Transition Strip Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/floor-transition-strip-calculator/",
      "sources": [
        "Total transition strip length = number of transitions × average opening width × (1 + waste allowance), covering the standard doorway/threshold transition-strip use case"
      ],
      "vectors": [
        {
          "name": "5 transitions, 0.9m wide, 5% waste",
          "inputs": {
            "numberOfTransitions": 5,
            "averageWidth": 0.9,
            "wastePercent": 5
          },
          "expected": 4.725,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "8 transitions, 0.9m wide, 8% waste",
          "inputs": {
            "numberOfTransitions": 8,
            "averageWidth": 0.9,
            "wastePercent": 8
          },
          "expected": 7.776,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "floor-underlayment-roll-calculator",
      "title": "Laminate/Vinyl Plank Floor Underlayment Roll Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/floor-underlayment-roll-calculator/",
      "sources": [
        "Roll count = ceil(floor area ÷ roll coverage area), the standard method for estimating rolled underlayment material"
      ],
      "vectors": [
        {
          "name": "40m² floor, 9.3m² roll coverage",
          "inputs": {
            "floorArea": 40,
            "rollCoverageArea": 9.3
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "60m² floor, 9.3m² roll coverage",
          "inputs": {
            "floorArea": 60,
            "rollCoverageArea": 9.3
          },
          "expected": 7,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "floor-vibration-frequency-calculator",
      "title": "Floor Beam Vibration Natural Frequency Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/floor-vibration-frequency-calculator/",
      "sources": [
        "Fundamental frequency of a uniform simply supported beam, f₁ = (π/2)·√(E·I / (m·L⁴)), with m the supported mass per unit length — the classical closed form, and the same relationship AISC Design Guide 11 expresses as f = 0.18·√(g/Δ) through the static deflection",
        "AISC Design Guide 11, Vibrations of Steel-Framed Structural Systems Due to Human Activity — floors below about 3 Hz can be resonated by the first harmonic of walking, and floors above roughly 9 to 10 Hz respond impulsively rather than resonantly, which is why the two thresholds appear in the note under the result",
        "Dynamic amplification at resonance = 1 / (2ζ) for a single-degree-of-freedom system, which is where the damping ratio enters. Damping ratios for floors are assessed, not measured — a bare structure is nearer 1–2%, a fitted-out office with partitions nearer 3–5%",
        "This page reports FREQUENCY, not the Design Guide 11 acceleration ratio. That check needs the effective weight of the vibrating panel, which comes from the guide's own joist-and-girder panel procedure and cannot be derived from a single beam's properties"
      ],
      "vectors": [
        {
          "name": "9 m steel beam, I = 300 ×10⁶ mm⁴, 600 kg/m supported",
          "inputs": {
            "span": 9,
            "momentOfInertia": 300,
            "elasticModulus": 200000000000,
            "supportedMassPerLength": 600,
            "dampingRatio": 3
          },
          "expected": 6.133,
          "toleranceDecimalPlaces": 2,
          "unit": "Hz",
          "confidence": "medium",
          "steps": [
            {
              "label": "Static deflection under the supported mass",
              "value": 8.37779044921875,
              "unit": "mm"
            },
            {
              "label": "Dynamic amplification at resonance",
              "value": 16.666666666666668,
              "unit": "(× static)"
            },
            {
              "label": "Walking pace whose second harmonic matches this floor",
              "value": 183.9738567740019,
              "unit": "steps/min"
            },
            {
              "label": "Walking pace whose third harmonic matches this floor",
              "value": 122.64923784933458,
              "unit": "steps/min"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "12 m steel beam, I = 1200 ×10⁶ mm⁴, 900 kg/m supported",
          "inputs": {
            "span": 12,
            "momentOfInertia": 1200,
            "elasticModulus": 200000000000,
            "supportedMassPerLength": 900,
            "dampingRatio": 3
          },
          "expected": 5.633,
          "toleranceDecimalPlaces": 2,
          "unit": "Hz",
          "confidence": "medium",
          "steps": [
            {
              "label": "Static deflection under the supported mass",
              "value": 9.929233125000001,
              "unit": "mm"
            },
            {
              "label": "Dynamic amplification at resonance",
              "value": 16.666666666666668,
              "unit": "(× static)"
            },
            {
              "label": "Walking pace whose second harmonic matches this floor",
              "value": 168.99077816556712,
              "unit": "steps/min"
            },
            {
              "label": "Walking pace whose third harmonic matches this floor",
              "value": 112.66051877704476,
              "unit": "steps/min"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Short stiff 4 m span — a high-frequency floor",
          "inputs": {
            "span": 4,
            "momentOfInertia": 300,
            "elasticModulus": 200000000000,
            "supportedMassPerLength": 600,
            "dampingRatio": 3
          },
          "expected": 31.045,
          "toleranceDecimalPlaces": 1,
          "unit": "Hz",
          "confidence": "high",
          "steps": [
            {
              "label": "Static deflection under the supported mass",
              "value": 0.3268883333333334,
              "unit": "mm"
            },
            {
              "label": "Dynamic amplification at resonance",
              "value": 16.666666666666668,
              "unit": "(× static)"
            },
            {
              "label": "Walking pace whose second harmonic matches this floor",
              "value": 931.3676499183844,
              "unit": "steps/min"
            },
            {
              "label": "Walking pace whose third harmonic matches this floor",
              "value": 620.9117666122562,
              "unit": "steps/min"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "flooring-adhesive-calculator",
      "title": "Flooring Adhesive Calculator — Glue-Down Vinyl, LVT, Carpet or Wood",
      "url": "https://craftquantities.com/calculators/materials-quantities/flooring-adhesive-calculator/",
      "sources": [
        "F. Ball and Co., STYCCOBOND F44 vinyl flooring adhesive, product page: coverage \"4m² per litre using a 1.5mm x 5mm trowel\" — the metric opening",
        "F. Ball and Co., STYCCOBOND F44 technical data sheet (February 2025): coverage rate up to 4.5 m² per litre with a STYCCOBOND 1.5 mm x 5 mm V-notched trowel, 67.5 m² from a 15 litre bucket; \"Coverage rates will depend on the condition and absorbency of the subfloor\"; \"DO NOT use the roller to extend the stated coverage as this will reduce adhesion\"; subfloors dry (below 75% RH); installation to BS 8203",
        "MAPEI Corporation, Ultrabond ECO 373 technical data sheet (edition date November 6, 2023): approximate coverage for LVT/LVP and solid vinyl on porous substrates with a 1/16 x 1/16 x 1/16 in (1.5 x 1.5 x 1.5 mm) square notch, 125 to 185 sq ft per US gallon (500 to 740 sq ft per 4 gallons); on non-porous substrates with a 1/16 x 1/32 x 1/32 in (1.5 x 1 x 1 mm) U-notch, 185 to 245 sq ft per gallon; by 1/4 in nap roller for carpet tile, 250 to 350; pails of 1 quart, 1 gallon and 4 gallons; \"Coverage shown is for estimating purposes only\"; not to be installed where the moisture vapor emission rate exceeds 15 lb per 1,000 sq ft per 24 hours (ASTM F1869)"
      ],
      "vectors": [
        {
          "name": "UK opening: 20 m² of vinyl in STYCCOBOND F44 at 4 m²/L from 15 L buckets",
          "inputs": {
            "floorArea": 20,
            "coverageRate": 4,
            "containerSize": 15,
            "wastePercent": 0
          },
          "expected": 1,
          "toleranceDecimalPlaces": 0,
          "unit": "containers",
          "confidence": "high",
          "steps": [
            {
              "label": "Adhesive to spread, allowance included",
              "value": 5,
              "unit": "L"
            },
            {
              "label": "Floor one container covers",
              "value": 60,
              "unit": "m²"
            },
            {
              "label": "Adhesive left in the last container",
              "value": 10,
              "unit": "L"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A 70 m² floor on the data sheet's 4.5 m²/L: 15.6 L, two buckets",
          "inputs": {
            "floorArea": 70,
            "coverageRate": 4.5,
            "containerSize": 15,
            "wastePercent": 0
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "containers",
          "confidence": "high",
          "steps": [
            {
              "label": "Adhesive to spread, allowance included",
              "value": 15.555555555555555,
              "unit": "L"
            },
            {
              "label": "Floor one container covers",
              "value": 67.5,
              "unit": "m²"
            },
            {
              "label": "Adhesive left in the last container",
              "value": 14.444444444444445,
              "unit": "L"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "1,500 sq ft of LVT in Ultrabond ECO 373 at 125 sq ft/gal from 4 gal pails",
          "inputs": {
            "floorArea": 139.35456000000002,
            "coverageRate": 3.067798343388895,
            "containerSize": 15.141647136,
            "wastePercent": 0
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "containers",
          "confidence": "high",
          "steps": [
            {
              "label": "Adhesive to spread, allowance included",
              "value": 45.424941408,
              "unit": "L"
            },
            {
              "label": "Floor one container covers",
              "value": 46.45152,
              "unit": "m²"
            },
            {
              "label": "Adhesive left in the last container",
              "value": -7.105427357601002e-15,
              "unit": "L"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "flooring-calculator",
      "title": "Flooring Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/flooring-calculator/",
      "sources": [
        "Waste factor ranges: 7-10% for straight-lay hardwood, 12-15% for diagonal hardwood, 5-10% for straight laminate/LVP, 10% for straight-set tile, 15% for diagonal tile — standard flooring-industry rules of thumb"
      ],
      "vectors": [
        {
          "name": "4x3.5m room, hardwood diagonal (13% waste)",
          "inputs": {
            "roomLength": 4,
            "roomWidth": 3.5,
            "materialType": "hardwood-diagonal"
          },
          "expected": 15.82,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Room area",
              "value": 14,
              "unit": "m²"
            },
            {
              "label": "Waste factor applied",
              "value": 13,
              "unit": "%"
            }
          ],
          "includesAllowance": {
            "label": "Material and layout waste",
            "percent": 13,
            "base": 14
          },
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "5x4m room, tile straight (10% waste)",
          "inputs": {
            "roomLength": 5,
            "roomWidth": 4,
            "materialType": "tile-straight"
          },
          "expected": 22,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Room area",
              "value": 20,
              "unit": "m²"
            },
            {
              "label": "Waste factor applied",
              "value": 10,
              "unit": "%"
            }
          ],
          "includesAllowance": {
            "label": "Material and layout waste",
            "percent": 10,
            "base": 20
          },
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "flooring-cost-comparison-calculator",
      "title": "Flooring Cost Comparison Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/flooring-cost-comparison-calculator/",
      "sources": [
        "Annualized cost per sq ft = price per sq ft / expected lifespan in years — a cheaper material with a shorter lifespan can cost more per year than a pricier, longer-lasting one"
      ],
      "vectors": [
        {
          "name": "A: $3/10yr vs B: $8/25yr",
          "inputs": {
            "optionAPricePerSqft": 3,
            "optionALifespanYears": 10,
            "optionBPricePerSqft": 8,
            "optionBLifespanYears": 25
          },
          "expected": 0.3,
          "toleranceDecimalPlaces": 2,
          "unit": "currency/sq ft/year (Option A wins)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Option A annualized cost",
              "value": 0.3,
              "unit": "currency/sq ft/yr"
            },
            {
              "label": "Option B annualized cost",
              "value": 0.32,
              "unit": "currency/sq ft/yr"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "A: $5/15yr vs B: $12/40yr",
          "inputs": {
            "optionAPricePerSqft": 5,
            "optionALifespanYears": 15,
            "optionBPricePerSqft": 12,
            "optionBLifespanYears": 40
          },
          "expected": 0.3,
          "toleranceDecimalPlaces": 2,
          "unit": "currency/sq ft/year (Option B wins)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Option A annualized cost",
              "value": 0.3333333333333333,
              "unit": "currency/sq ft/yr"
            },
            {
              "label": "Option B annualized cost",
              "value": 0.3,
              "unit": "currency/sq ft/yr"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "fluid-applied-wrb-coverage-calculator",
      "title": "Fluid-Applied Weather Barrier Coating Coverage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/fluid-applied-wrb-coverage-calculator/",
      "sources": [
        "ASTM E2570, Standard Test Methods for Evaluating Water-Resistive Barrier (WRB) Coatings and Systems Used under Exterior Insulation and Finish Systems (EIFS) or EIFS with Drainage — the barrier's performance is evaluated at the wet film thickness the manufacturer states, which is why thickness rather than a headline coverage rate is the input here",
        "Volume = coated area × wet film thickness × number of coats. One millimetre of wet film over one square metre is one litre of material, by definition of the litre"
      ],
      "vectors": [
        {
          "name": "100 m² of sheathing, two coats at 0.8 mm, 60 m of details",
          "inputs": {
            "substrateArea": 100,
            "wetFilmThickness": 0.0008,
            "coats": 2,
            "detailLength": 60,
            "detailBandWidth": 0.15,
            "lapAllowance": 10
          },
          "expected": 174.4,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Coated area including the detail band",
              "value": 109,
              "unit": "m²"
            },
            {
              "label": "Material for a single coat",
              "value": 87.2,
              "unit": "L"
            },
            {
              "label": "Detail tape or reinforcing mesh to order",
              "value": 66,
              "unit": "m"
            },
            {
              "label": "Wet build applied in each pass",
              "value": 0.8,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "250 m² field coat at 1 mm, details treated separately",
          "inputs": {
            "substrateArea": 250,
            "wetFilmThickness": 0.001,
            "coats": 1,
            "detailLength": 0,
            "detailBandWidth": 0.15,
            "lapAllowance": 0
          },
          "expected": 250,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Coated area including the detail band",
              "value": 250,
              "unit": "m²"
            },
            {
              "label": "Material for a single coat",
              "value": 250,
              "unit": "L"
            },
            {
              "label": "Detail tape or reinforcing mesh to order",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Wet build applied in each pass",
              "value": 1,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "foam-board-insulation-calculator",
      "title": "Foam Board Insulation Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/foam-board-insulation-calculator/",
      "sources": [
        "Standard rigid foam board sheet size is 4 ft x 8 ft (32 sq ft) in North America and 2400 x 1200 mm (2.88 m²) in metric markets; sheet count = area / one board's area, rounded up with a waste allowance"
      ],
      "vectors": [
        {
          "name": "40m² area",
          "inputs": {
            "area": 40
          },
          "expected": 15,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets (4x8 ft)",
          "confidence": "high",
          "steps": [
            {
              "label": "Area to cover (with waste)",
              "value": 473.6120583352278,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "80m² area",
          "inputs": {
            "area": 80
          },
          "expected": 30,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets (4x8 ft)",
          "confidence": "high",
          "steps": [
            {
              "label": "Area to cover (with waste)",
              "value": 947.2241166704556,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "40m² with no cutting waste",
          "inputs": {
            "area": 40,
            "wastePercent": 0
          },
          "expected": 14,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets (4x8 ft)",
          "confidence": "high",
          "steps": [
            {
              "label": "Area to cover (with waste)",
              "value": 430.55641666838886,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "foot-candles-to-lux-calculator",
      "title": "Foot-Candles to Lux Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/foot-candles-to-lux-calculator/",
      "sources": [
        "NIST SP 811, Appendix B — illuminance: 1 footcandle = 10.76391 lx",
        "The footcandle is one lumen per square foot; the lux one lumen per square metre (SI Brochure, 9th edition)"
      ],
      "vectors": [
        {
          "name": "50 fc office target is 538 lux",
          "inputs": {
            "footCandles": 50
          },
          "expected": 538.19552,
          "toleranceDecimalPlaces": 4,
          "unit": "lx",
          "confidence": "high",
          "steps": [
            {
              "label": "Foot-candles entered",
              "value": 50,
              "unit": "fc"
            },
            {
              "label": "Lux",
              "value": 538.1955208354861,
              "unit": "lx"
            },
            {
              "label": "Rounded to the nearest metric step of 50 lx",
              "value": 550,
              "unit": "lx"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "30 fc is 322.9 lux",
          "inputs": {
            "footCandles": 30
          },
          "expected": 322.91731,
          "toleranceDecimalPlaces": 4,
          "unit": "lx",
          "confidence": "high",
          "steps": [
            {
              "label": "Foot-candles entered",
              "value": 30,
              "unit": "fc"
            },
            {
              "label": "Lux",
              "value": 322.91731250129163,
              "unit": "lx"
            },
            {
              "label": "Rounded to the nearest metric step of 50 lx",
              "value": 300,
              "unit": "lx"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "100 fc workshop is 1076 lux",
          "inputs": {
            "footCandles": 100
          },
          "expected": 1076.391,
          "toleranceDecimalPlaces": 3,
          "unit": "lx",
          "confidence": "high",
          "steps": [
            {
              "label": "Foot-candles entered",
              "value": 100,
              "unit": "fc"
            },
            {
              "label": "Lux",
              "value": 1076.3910416709723,
              "unit": "lx"
            },
            {
              "label": "Rounded to the nearest metric step of 50 lx",
              "value": 1100,
              "unit": "lx"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "5 fc is 53.8 lux",
          "inputs": {
            "footCandles": 5
          },
          "expected": 53.819552,
          "toleranceDecimalPlaces": 5,
          "unit": "lx",
          "confidence": "high",
          "steps": [
            {
              "label": "Foot-candles entered",
              "value": 5,
              "unit": "fc"
            },
            {
              "label": "Lux",
              "value": 53.81955208354861,
              "unit": "lx"
            },
            {
              "label": "Rounded to the nearest metric step of 50 lx",
              "value": 50,
              "unit": "lx"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "footing-bearing-pressure-calculator",
      "title": "Footing Soil Bearing Pressure Checker",
      "url": "https://craftquantities.com/calculators/materials-quantities/footing-bearing-pressure-calculator/",
      "sources": [
        "Standard geotechnical check: applied bearing pressure = total load / footing area, compared against the site's allowable soil bearing capacity from a geotechnical report"
      ],
      "vectors": [
        {
          "name": "500kN load, 2x2m footing, 150kPa allowable (pass)",
          "inputs": {
            "appliedLoad": 500000,
            "footingLength": 2,
            "footingWidth": 2,
            "allowableBearingPressure": 150000
          },
          "expected": 125,
          "toleranceDecimalPlaces": 0,
          "unit": "kN/m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Footing area",
              "value": 4,
              "unit": "m²"
            },
            {
              "label": "Allowable bearing pressure",
              "value": 150,
              "unit": "kN/m²"
            },
            {
              "label": "Safety margin (allowable / applied)",
              "value": 1.2
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "800kN load, 2x2m footing, 150kPa allowable (fail)",
          "inputs": {
            "appliedLoad": 800000,
            "footingLength": 2,
            "footingWidth": 2,
            "allowableBearingPressure": 150000
          },
          "expected": 200,
          "toleranceDecimalPlaces": 0,
          "unit": "kN/m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Footing area",
              "value": 4,
              "unit": "m²"
            },
            {
              "label": "Allowable bearing pressure",
              "value": 150,
              "unit": "kN/m²"
            },
            {
              "label": "Safety margin (allowable / applied)",
              "value": 0.75
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "formwork-brace-force-calculator",
      "title": "Formwork Brace & Kicker Force Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/formwork-brace-force-calculator/",
      "sources": [
        "ACI 347R, Guide to Formwork for Concrete, is the document that sets the minimum lateral force wall-form bracing must be designed for; the pressure used here is the one you enter from it, not a figure this page supplies",
        "ASCE/SEI 37, Design Loads on Structures During Construction, governs the construction-stage wind and lateral load cases that produce that pressure",
        "OSHA 29 CFR 1926 Subpart Q requires formwork to be designed, erected, supported, braced and maintained so that it supports all vertical and lateral loads applied to it",
        "Statics only: uniform lateral pressure over the tributary strip, the form taken as pinned at its base, and the resultant resolved along a kicker at the angle entered"
      ],
      "vectors": [
        {
          "name": "3 m form, 1.8 m spacing, 720 Pa, kicker at 60 degrees onto a 2.4 m attachment",
          "inputs": {
            "formHeight": 3,
            "braceSpacing": 1.8,
            "lateralPressure": 720,
            "braceAngle": 60,
            "attachmentHeight": 2.4
          },
          "expected": 4.86,
          "toleranceDecimalPlaces": 3,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total lateral force on the braced strip",
              "value": 3.888,
              "unit": "kN"
            },
            {
              "label": "Horizontal reaction at the anchorage",
              "value": 2.43,
              "unit": "kN"
            },
            {
              "label": "Vertical reaction at the anchorage",
              "value": 4.208883462392371,
              "unit": "kN"
            },
            {
              "label": "Lateral force per unit length of form",
              "value": 2.16,
              "unit": "kN/m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "2.4 m form, 1.2 m spacing, 1200 Pa, kicker at 45 degrees onto a 2.0 m attachment",
          "inputs": {
            "formHeight": 2.4,
            "braceSpacing": 1.2,
            "lateralPressure": 1200,
            "braceAngle": 45,
            "attachmentHeight": 2
          },
          "expected": 2.93251,
          "toleranceDecimalPlaces": 3,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total lateral force on the braced strip",
              "value": 3.456,
              "unit": "kN"
            },
            {
              "label": "Horizontal reaction at the anchorage",
              "value": 2.0736,
              "unit": "kN"
            },
            {
              "label": "Vertical reaction at the anchorage",
              "value": 2.0735999999999994,
              "unit": "kN"
            },
            {
              "label": "Lateral force per unit length of form",
              "value": 2.88,
              "unit": "kN/m"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "formwork-tie-spacing-calculator",
      "title": "Concrete Formwork Tie Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/formwork-tie-spacing-calculator/",
      "sources": [
        "Each form tie's tributary area = its allowable (safety-factored) load capacity / the fresh concrete lateral pressure; assuming a square grid, spacing = sqrt(tributary area)"
      ],
      "vectors": [
        {
          "name": "50kPa pressure, 20kN tie, SF 2.0",
          "inputs": {
            "lateralPressure": 50000,
            "tieRatedCapacity": 20000,
            "safetyFactor": 2
          },
          "expected": 0.4472,
          "toleranceDecimalPlaces": 2,
          "unit": "m (square grid)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Allowable tie load (after safety factor)",
              "value": 10,
              "unit": "kN"
            },
            {
              "label": "Tributary area per tie",
              "value": 0.2,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "70kPa pressure, 30kN tie, SF 2.5",
          "inputs": {
            "lateralPressure": 70000,
            "tieRatedCapacity": 30000,
            "safetyFactor": 2.5
          },
          "expected": 0.414,
          "toleranceDecimalPlaces": 2,
          "unit": "m (square grid)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Allowable tie load (after safety factor)",
              "value": 12,
              "unit": "kN"
            },
            {
              "label": "Tributary area per tie",
              "value": 0.17142857142857143,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "a 15 m SCC pour at 354 kPa, which the old 150 kPa ceiling cut",
          "inputs": {
            "lateralPressure": 354000,
            "tieRatedCapacity": 20000,
            "safetyFactor": 2
          },
          "expected": 0.168,
          "toleranceDecimalPlaces": 2,
          "unit": "m (square grid)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Allowable tie load (after safety factor)",
              "value": 10,
              "unit": "kN"
            },
            {
              "label": "Tributary area per tie",
              "value": 0.02824858757062147,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "foundation-frost-insulation-calculator",
      "title": "Foundation Frost-Protection Insulation Depth Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/foundation-frost-insulation-calculator/",
      "sources": [
        "Required thickness = target R-value ÷ the insulation board's rated R-value per inch, the same relationship used for any rigid foam insulation thickness sizing"
      ],
      "vectors": [
        {
          "name": "R-10 target, R-5/in board",
          "inputs": {
            "targetRValue": 10,
            "rValuePerInch": 5
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "in",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "R-15 target, R-4.5/in board",
          "inputs": {
            "targetRValue": 15,
            "rValuePerInch": 4.5
          },
          "expected": 3.33,
          "toleranceDecimalPlaces": 1,
          "unit": "in",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "framing-stud-calculator",
      "title": "Framing Stud Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/framing-stud-calculator/",
      "sources": [
        "Standard residential wall framing uses studs spaced 16 in or 24 in on-center; stud count = (wall length / spacing) + 1"
      ],
      "vectors": [
        {
          "name": "6m wall, 16in spacing, 1 opening",
          "inputs": {
            "wallLength": 6,
            "spacingIn": 16,
            "openingCount": 1
          },
          "expected": 20,
          "toleranceDecimalPlaces": 0,
          "unit": "studs",
          "confidence": "medium",
          "steps": [
            {
              "label": "Regular-spacing studs",
              "value": 16,
              "unit": "studs"
            },
            {
              "label": "Extra studs for openings",
              "value": 4,
              "unit": "studs"
            },
            {
              "label": "Whole bays at the spacing entered",
              "value": 14
            },
            {
              "label": "Short bay left at the end of the wall",
              "value": 12.220472440944889,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "10m wall, 24in spacing, no openings",
          "inputs": {
            "wallLength": 10,
            "spacingIn": 24,
            "openingCount": 0
          },
          "expected": 18,
          "toleranceDecimalPlaces": 0,
          "unit": "studs",
          "confidence": "medium",
          "steps": [
            {
              "label": "Regular-spacing studs",
              "value": 18,
              "unit": "studs"
            },
            {
              "label": "Extra studs for openings",
              "value": 0,
              "unit": "studs"
            },
            {
              "label": "Whole bays at the spacing entered",
              "value": 16
            },
            {
              "label": "Short bay left at the end of the wall",
              "value": 9.700787401574814,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "frc-fiber-dosage-calculator",
      "title": "Fiber-Reinforced Concrete (FRC) Dosage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/frc-fiber-dosage-calculator/",
      "sources": [
        "Typical polypropylene micro-synthetic fiber dosage for shrinkage/temperature crack control is 0.9-1.5 kg per m³ (1.5-2.5 lb per yd³), per common manufacturer technical data sheets (ASTM C1116 Type III fibers)"
      ],
      "vectors": [
        {
          "name": "10 m³, 1.2 kg/m³",
          "inputs": {
            "mixVolume": 10000,
            "dosageRateKgM3": 1.2
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in pounds",
              "value": 26.455471462185308,
              "unit": "lb"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "25 m³, 0.9 kg/m³",
          "inputs": {
            "mixVolume": 25000,
            "dosageRateKgM3": 0.9
          },
          "expected": 22.5,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in pounds",
              "value": 49.60400899159745,
              "unit": "lb"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "french-drain-calculator",
      "title": "French Drain Gravel Calculator",
      "url": "https://craftquantities.com/calculators/auto-utility/french-drain-calculator/",
      "sources": [
        "Trench volume = length x width x depth; the perforated pipe's own volume (length x pi x radius²) is subtracted since gravel doesn't fill the space the pipe itself occupies",
        "10% waste is standard for gravel to account for trench irregularities and settling"
      ],
      "vectors": [
        {
          "name": "15m trench, 0.3x0.46m, 4in pipe",
          "inputs": {
            "trenchLength": 15,
            "trenchWidth": 0.3,
            "trenchDepth": 0.46,
            "pipeDiameter": 0.1
          },
          "expected": 2.809,
          "toleranceDecimalPlaces": 2,
          "unit": "cubic yards",
          "confidence": "high",
          "steps": [
            {
              "label": "Trench volume",
              "value": 2.7074577819807923,
              "unit": "yd³"
            },
            {
              "label": "Pipe volume (subtracted)",
              "value": 0.1540893021336118,
              "unit": "yd³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "30m trench, 0.3x0.6m, 4in pipe",
          "inputs": {
            "trenchLength": 30,
            "trenchWidth": 0.3,
            "trenchDepth": 0.6,
            "pipeDiameter": 0.1
          },
          "expected": 7.43,
          "toleranceDecimalPlaces": 0.3,
          "unit": "cubic yards",
          "confidence": "high",
          "steps": [
            {
              "label": "Trench volume",
              "value": 7.062933344297717,
              "unit": "yd³"
            },
            {
              "label": "Pipe volume (subtracted)",
              "value": 0.3081786042672236,
              "unit": "yd³"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "furnace-sizing-calculator",
      "title": "Furnace Sizing Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/furnace-sizing-calculator/",
      "sources": [
        "Commonly cited furnace sizing rule of thumb: 30-60 BTU/hr per sq ft of conditioned area, depending on climate zone and insulation level"
      ],
      "vectors": [
        {
          "name": "150m² house, moderate climate",
          "inputs": {
            "houseArea": 150,
            "climateFactor": "moderate"
          },
          "expected": 64583.6,
          "toleranceDecimalPlaces": 0,
          "unit": "BTU/hr",
          "confidence": "low",
          "steps": [
            {
              "label": "House area",
              "value": 1614.5865625064582,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "200m² house, cold climate",
          "inputs": {
            "houseArea": 200,
            "climateFactor": "cold"
          },
          "expected": 107639,
          "toleranceDecimalPlaces": 0,
          "unit": "BTU/hr",
          "confidence": "low",
          "steps": [
            {
              "label": "House area",
              "value": 2152.782083341944,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "gabion-basket-calculator",
      "title": "Gabion Basket and Stone Calculator",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/gabion-basket-calculator/",
      "sources": [
        "Gabion baskets are sold in modular sizes: where they are made to metric sizes, 1 m wide and 1 m or 0.5 m high in lengths of whole metres; in the US, 3 ft wide and 3 ft or 1.5 ft high in lengths of whole yards. A wall takes whole baskets along its length, whole courses up its height and whole rows through its depth",
        "The baskets are specified by BS EN 10223-3 (woven hexagonal mesh) and BS EN 10223-8 (welded mesh gabions) in the UK and Europe, and by ASTM A975 (double-twisted hexagonal mesh gabions and revet mattresses) in the US; the stone that fills them, and the wall they make, are the designer's",
        "Stone to fill the baskets = volume of the baskets × density of the solid stone × (1 − voids), where the voids are the space between the stones as a share of the basket's volume — the quantity ASTM C29 measures for aggregate. Gabion design guidance usually takes the voids as 30 to 40 per cent, lower for a hand-packed face and higher for stone tipped in by machine"
      ],
      "vectors": [
        {
          "name": "Three 6 × 3 × 3 ft baskets build an 18 ft wall one course high",
          "inputs": {
            "wallLength": 5.4864,
            "wallHeight": 0.9144,
            "wallDepth": 0.9144,
            "basketSize": "double",
            "basketLength": 1,
            "basketWidth": 0.5,
            "basketHeight": 0.5,
            "voidsPercent": 35,
            "stoneDensity": 2650,
            "overfillPercent": 5
          },
          "expected": 3,
          "toleranceDecimalPlaces": 2,
          "unit": "baskets (6 × 3 × 3 ft)",
          "confidence": "high",
          "steps": [
            {
              "label": "Baskets along the wall, in each course",
              "value": 3,
              "unit": "baskets"
            },
            {
              "label": "Courses up the wall",
              "value": 1,
              "unit": "courses"
            },
            {
              "label": "Rows through the wall, front to back",
              "value": 1,
              "unit": "rows"
            },
            {
              "label": "Stone to order, with the overfill allowance",
              "value": 8.296758180127874,
              "unit": "t"
            },
            {
              "label": "Stone that fills the baskets",
              "value": 7.901674457264642,
              "unit": "t"
            },
            {
              "label": "Volume of the filled baskets",
              "value": 4.5873291479040015,
              "unit": "m³"
            },
            {
              "label": "Density of a filled basket — the stone and its voids together",
              "value": 1722.5,
              "unit": "kg/m³"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A 19 ft wall 4 ft high in 6 × 3 × 3 ft baskets — the end basket and the second course both round up",
          "inputs": {
            "wallLength": 5.7912,
            "wallHeight": 1.2192,
            "wallDepth": 0.9144,
            "basketSize": "double",
            "basketLength": 1,
            "basketWidth": 0.5,
            "basketHeight": 0.5,
            "voidsPercent": 35,
            "stoneDensity": 2650,
            "overfillPercent": 5
          },
          "expected": 8,
          "toleranceDecimalPlaces": 2,
          "unit": "baskets (6 × 3 × 3 ft)",
          "confidence": "high",
          "steps": [
            {
              "label": "Baskets along the wall, in each course",
              "value": 4,
              "unit": "baskets"
            },
            {
              "label": "Courses up the wall",
              "value": 2,
              "unit": "courses"
            },
            {
              "label": "Rows through the wall, front to back",
              "value": 1,
              "unit": "rows"
            },
            {
              "label": "Stone to order, with the overfill allowance",
              "value": 22.124688480341,
              "unit": "t"
            },
            {
              "label": "Stone that fills the baskets",
              "value": 21.071131886039044,
              "unit": "t"
            },
            {
              "label": "Volume of the filled baskets",
              "value": 12.232877727744004,
              "unit": "m³"
            },
            {
              "label": "Density of a filled basket — the stone and its voids together",
              "value": 1722.5,
              "unit": "kg/m³"
            },
            {
              "label": "Length of the wall the baskets build",
              "value": 7.315200000000001,
              "unit": "m"
            },
            {
              "label": "Height of the wall the baskets build",
              "value": 1.8288000000000002,
              "unit": "m"
            },
            {
              "label": "Depth of the wall the baskets build",
              "value": 0.9144000000000001,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "9 × 3 × 3 ft baskets, a 27 ft wall two courses high",
          "inputs": {
            "wallLength": 8.2296,
            "wallHeight": 1.8288,
            "wallDepth": 0.9144,
            "basketSize": "triple",
            "basketLength": 1,
            "basketWidth": 0.5,
            "basketHeight": 0.5,
            "voidsPercent": 35,
            "stoneDensity": 2650,
            "overfillPercent": 5
          },
          "expected": 6,
          "toleranceDecimalPlaces": 2,
          "unit": "baskets (9 × 3 × 3 ft)",
          "confidence": "high",
          "steps": [
            {
              "label": "Baskets along the wall, in each course",
              "value": 3,
              "unit": "baskets"
            },
            {
              "label": "Courses up the wall",
              "value": 2,
              "unit": "courses"
            },
            {
              "label": "Rows through the wall, front to back",
              "value": 1,
              "unit": "rows"
            },
            {
              "label": "Stone to order, with the overfill allowance",
              "value": 24.890274540383626,
              "unit": "t"
            },
            {
              "label": "Stone that fills the baskets",
              "value": 23.70502337179393,
              "unit": "t"
            },
            {
              "label": "Volume of the filled baskets",
              "value": 13.761987443712005,
              "unit": "m³"
            },
            {
              "label": "Density of a filled basket — the stone and its voids together",
              "value": 1722.5,
              "unit": "kg/m³"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "12 × 3 × 3 ft baskets, a 48 ft wall one course high and two rows deep",
          "inputs": {
            "wallLength": 14.6304,
            "wallHeight": 0.9144,
            "wallDepth": 1.8288,
            "basketSize": "quadruple",
            "basketLength": 1,
            "basketWidth": 0.5,
            "basketHeight": 0.5,
            "voidsPercent": 35,
            "stoneDensity": 2650,
            "overfillPercent": 5
          },
          "expected": 8,
          "toleranceDecimalPlaces": 2,
          "unit": "baskets (12 × 3 × 3 ft)",
          "confidence": "high",
          "steps": [
            {
              "label": "Baskets along the wall, in each course",
              "value": 4,
              "unit": "baskets"
            },
            {
              "label": "Courses up the wall",
              "value": 1,
              "unit": "courses"
            },
            {
              "label": "Rows through the wall, front to back",
              "value": 2,
              "unit": "rows"
            },
            {
              "label": "Stone to order, with the overfill allowance",
              "value": 44.249376960682,
              "unit": "t"
            },
            {
              "label": "Stone that fills the baskets",
              "value": 42.14226377207809,
              "unit": "t"
            },
            {
              "label": "Volume of the filled baskets",
              "value": 24.465755455488008,
              "unit": "m³"
            },
            {
              "label": "Density of a filled basket — the stone and its voids together",
              "value": 1722.5,
              "unit": "kg/m³"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "3 × 3 × 3 ft cubes along a 10 ft garden wall — the fourth runs past the end",
          "inputs": {
            "wallLength": 3.048,
            "wallHeight": 0.9144,
            "wallDepth": 0.9144,
            "basketSize": "cube",
            "basketLength": 1,
            "basketWidth": 0.5,
            "basketHeight": 0.5,
            "voidsPercent": 35,
            "stoneDensity": 2650,
            "overfillPercent": 5
          },
          "expected": 4,
          "toleranceDecimalPlaces": 2,
          "unit": "baskets (3 × 3 × 3 ft)",
          "confidence": "high",
          "steps": [
            {
              "label": "Baskets along the wall, in each course",
              "value": 4,
              "unit": "baskets"
            },
            {
              "label": "Courses up the wall",
              "value": 1,
              "unit": "courses"
            },
            {
              "label": "Rows through the wall, front to back",
              "value": 1,
              "unit": "rows"
            },
            {
              "label": "Stone to order, with the overfill allowance",
              "value": 5.53117212008525,
              "unit": "t"
            },
            {
              "label": "Stone that fills the baskets",
              "value": 5.267782971509761,
              "unit": "t"
            },
            {
              "label": "Volume of the filled baskets",
              "value": 3.058219431936001,
              "unit": "m³"
            },
            {
              "label": "Density of a filled basket — the stone and its voids together",
              "value": 1722.5,
              "unit": "kg/m³"
            },
            {
              "label": "Length of the wall the baskets build",
              "value": 3.6576000000000004,
              "unit": "m"
            },
            {
              "label": "Height of the wall the baskets build",
              "value": 0.9144000000000001,
              "unit": "m"
            },
            {
              "label": "Depth of the wall the baskets build",
              "value": 0.9144000000000001,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "6 × 3 × 1.5 ft half-height baskets for a 12 ft seat wall 18 in high",
          "inputs": {
            "wallLength": 3.6576,
            "wallHeight": 0.4572,
            "wallDepth": 0.9144,
            "basketSize": "double-half",
            "basketLength": 1,
            "basketWidth": 0.5,
            "basketHeight": 0.5,
            "voidsPercent": 35,
            "stoneDensity": 2650,
            "overfillPercent": 5
          },
          "expected": 2,
          "toleranceDecimalPlaces": 2,
          "unit": "baskets (6 × 3 × 1.5 ft)",
          "confidence": "high",
          "steps": [
            {
              "label": "Baskets along the wall, in each course",
              "value": 2,
              "unit": "baskets"
            },
            {
              "label": "Courses up the wall",
              "value": 1,
              "unit": "courses"
            },
            {
              "label": "Rows through the wall, front to back",
              "value": 1,
              "unit": "rows"
            },
            {
              "label": "Stone to order, with the overfill allowance",
              "value": 2.765586060042625,
              "unit": "t"
            },
            {
              "label": "Stone that fills the baskets",
              "value": 2.6338914857548805,
              "unit": "t"
            },
            {
              "label": "Volume of the filled baskets",
              "value": 1.5291097159680005,
              "unit": "m³"
            },
            {
              "label": "Density of a filled basket — the stone and its voids together",
              "value": 1722.5,
              "unit": "kg/m³"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Another size — 1 × 0.5 × 0.5 m garden baskets along a 10 m wall 1 m high",
          "inputs": {
            "wallLength": 10,
            "wallHeight": 1,
            "wallDepth": 0.5,
            "basketSize": "custom",
            "basketLength": 1,
            "basketWidth": 0.5,
            "basketHeight": 0.5,
            "voidsPercent": 35,
            "stoneDensity": 2650,
            "overfillPercent": 5
          },
          "expected": 20,
          "toleranceDecimalPlaces": 2,
          "unit": "baskets",
          "confidence": "high",
          "steps": [
            {
              "label": "Baskets along the wall, in each course",
              "value": 10,
              "unit": "baskets"
            },
            {
              "label": "Courses up the wall",
              "value": 2,
              "unit": "courses"
            },
            {
              "label": "Rows through the wall, front to back",
              "value": 1,
              "unit": "rows"
            },
            {
              "label": "Stone to order, with the overfill allowance",
              "value": 9.043125,
              "unit": "t"
            },
            {
              "label": "Stone that fills the baskets",
              "value": 8.6125,
              "unit": "t"
            },
            {
              "label": "Volume of the filled baskets",
              "value": 5,
              "unit": "m³"
            },
            {
              "label": "Density of a filled basket — the stone and its voids together",
              "value": 1722.5,
              "unit": "kg/m³"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "gallons-to-cubic-feet-calculator",
      "title": "Gallons to Cubic Feet Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/gallons-to-cubic-feet-calculator/",
      "sources": [
        "NIST Handbook 44, Appendix C — 1 US liquid gallon = 231 cubic inches (exact)",
        "1 cubic foot = 1,728 cubic inches, so 1 ft³ = 1728 ÷ 231 = 7.4805 US gallons exactly"
      ],
      "vectors": [
        {
          "name": "100 gallons to cubic feet",
          "inputs": {
            "value": 100,
            "fromUnit": "gal"
          },
          "expected": 13.368055556,
          "toleranceDecimalPlaces": 6,
          "unit": "ft³",
          "confidence": "high",
          "steps": [
            {
              "label": "US gallons entered",
              "value": 100,
              "unit": "gal"
            },
            {
              "label": "Litres",
              "value": 378.5411784,
              "unit": "L"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "50 cubic feet to gallons",
          "inputs": {
            "value": 50,
            "fromUnit": "ft3"
          },
          "expected": 374.025974026,
          "toleranceDecimalPlaces": 6,
          "unit": "gal",
          "confidence": "high",
          "steps": [
            {
              "label": "Cubic feet entered",
              "value": 50,
              "unit": "ft³"
            },
            {
              "label": "Litres",
              "value": 1415.8423296,
              "unit": "L"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "1 cubic foot is 7.4805 gallons, not 7.48",
          "inputs": {
            "value": 1,
            "fromUnit": "ft3"
          },
          "expected": 7.480519481,
          "toleranceDecimalPlaces": 6,
          "unit": "gal",
          "confidence": "high",
          "steps": [
            {
              "label": "Cubic feet entered",
              "value": 1,
              "unit": "ft³"
            },
            {
              "label": "Litres",
              "value": 28.316846592,
              "unit": "L"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "1,728 gallons are exactly 231 cubic feet",
          "inputs": {
            "value": 1728,
            "fromUnit": "gal"
          },
          "expected": 231,
          "toleranceDecimalPlaces": 6,
          "unit": "ft³",
          "confidence": "high",
          "steps": [
            {
              "label": "US gallons entered",
              "value": 1728,
              "unit": "gal"
            },
            {
              "label": "Litres",
              "value": 6541.191562752,
              "unit": "L"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "galvanic-corrosion-risk-calculator",
      "title": "Dielectric Union Galvanic Corrosion Risk Evaluator",
      "url": "https://craftquantities.com/calculators/materials-quantities/galvanic-corrosion-risk-calculator/",
      "sources": [
        "Galvanic corrosion risk depends on the two metals' positions in the galvanic series — dissimilar metals far apart in the series (e.g. copper and steel/aluminum) corrode faster when in direct contact with an electrolyte present, and a dielectric union or fitting is commonly used to electrically isolate them. Common plumbing metal-pair risk levels below are general reference guidance, not a substitute for a corrosion engineer's assessment on critical systems."
      ],
      "vectors": [
        {
          "name": "Copper to steel",
          "inputs": {
            "metal1": "copper",
            "metal2": "steel"
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "Risk Level (1=Low, 2=Medium, 3=High)",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Copper to brass",
          "inputs": {
            "metal1": "copper",
            "metal2": "brass"
          },
          "expected": 1,
          "toleranceDecimalPlaces": 0,
          "unit": "Risk Level (1=Low, 2=Medium, 3=High)",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "gambrel-roof-rafter-calculator",
      "title": "Gambrel Roof Rafter Geometry Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/gambrel-roof-rafter-calculator/",
      "sources": [
        "Standard rafter-length trigonometry applied independently to each of the gambrel roof's two slope segments: segment length = segment run × √(1+(segment pitch/12)²)"
      ],
      "vectors": [
        {
          "name": "8m width, 24/6 pitch, 0.5 break",
          "inputs": {
            "buildingWidth": 8,
            "lowerPitch": 24,
            "upperPitch": 6,
            "breakPointRatio": 0.5
          },
          "expected": 6.708,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Lower segment length",
              "value": 4.47213595499958,
              "unit": "m"
            },
            {
              "label": "Upper segment length",
              "value": 2.23606797749979,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "10m width, 20/8 pitch, 0.4 break",
          "inputs": {
            "buildingWidth": 10,
            "lowerPitch": 20,
            "upperPitch": 8,
            "breakPointRatio": 0.4
          },
          "expected": 7.493,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Lower segment length",
              "value": 3.8873012632302006,
              "unit": "m"
            },
            {
              "label": "Upper segment length",
              "value": 3.6055512754639896,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "garden-soil-calculator",
      "title": "Garden Soil Calculator",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/garden-soil-calculator/",
      "sources": [
        "Loose topsoil and compost blends settle 15-25% after watering and initial consolidation — horticultural supplier guidance",
        "Typical bulk density of screened topsoil 1300 kg/m³; compost blends 550-900 kg/m³"
      ],
      "vectors": [
        {
          "name": "3 × 1.2 × 0.3 m at 20% settlement",
          "inputs": {
            "length": 3,
            "width": 1.2,
            "depth": 0.3,
            "settlementPercent": 20
          },
          "expected": 1.296,
          "toleranceDecimalPlaces": 1,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Finished volume",
              "value": 1.0799999999999998,
              "unit": "m³"
            },
            {
              "label": "Litres",
              "value": 1295.9999999999998,
              "unit": "L"
            },
            {
              "label": "Cubic yards",
              "value": 1.6951040026314521,
              "unit": "yd³"
            },
            {
              "label": "60 L bags",
              "value": 22,
              "unit": "bags"
            },
            {
              "label": "Approximate weight",
              "value": 1295.9999999999998,
              "unit": "kg"
            }
          ],
          "includesAllowance": {
            "label": "Settlement allowance",
            "percent": 20
          },
          "basis": "ambiguous"
        },
        {
          "name": "No settlement allowance",
          "inputs": {
            "length": 3,
            "width": 1.2,
            "depth": 0.3,
            "settlementPercent": 0
          },
          "expected": 1.08,
          "toleranceDecimalPlaces": 1,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Finished volume",
              "value": 1.0799999999999998,
              "unit": "m³"
            },
            {
              "label": "Litres",
              "value": 1079.9999999999998,
              "unit": "L"
            },
            {
              "label": "Cubic yards",
              "value": 1.4125866688595434,
              "unit": "yd³"
            },
            {
              "label": "60 L bags",
              "value": 18,
              "unit": "bags"
            },
            {
              "label": "Approximate weight",
              "value": 1079.9999999999998,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A deeper bed scales linearly",
          "inputs": {
            "length": 3,
            "width": 1.2,
            "depth": 0.45,
            "settlementPercent": 20
          },
          "expected": 1.944,
          "toleranceDecimalPlaces": 1,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Finished volume",
              "value": 1.6199999999999999,
              "unit": "m³"
            },
            {
              "label": "Litres",
              "value": 1943.9999999999998,
              "unit": "L"
            },
            {
              "label": "Cubic yards",
              "value": 2.542656003947178,
              "unit": "yd³"
            },
            {
              "label": "60 L bags",
              "value": 33,
              "unit": "bags"
            },
            {
              "label": "Approximate weight",
              "value": 1943.9999999999998,
              "unit": "kg"
            }
          ],
          "includesAllowance": {
            "label": "Settlement allowance",
            "percent": 20
          },
          "basis": "ambiguous"
        },
        {
          "name": "Zero length is zero soil",
          "inputs": {
            "length": 0,
            "width": 1.2,
            "depth": 0.3,
            "settlementPercent": 20
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Finished volume",
              "value": 0,
              "unit": "m³"
            },
            {
              "label": "Litres",
              "value": 0,
              "unit": "L"
            },
            {
              "label": "Cubic yards",
              "value": 0,
              "unit": "yd³"
            },
            {
              "label": "60 L bags",
              "value": 0,
              "unit": "bags"
            },
            {
              "label": "Approximate weight",
              "value": 0,
              "unit": "kg"
            }
          ],
          "includesAllowance": {
            "label": "Settlement allowance",
            "percent": 20
          },
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "gas-pipe-capacity-calculator",
      "title": "Fuel Gas Pipe Capacity Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/gas-pipe-capacity-calculator/",
      "sources": [
        "Capacity = pipe cross-sectional area × maximum allowable gas velocity, a simplified velocity-based screening check consistent with NFPA 54/IFGC gas pipe sizing principles (which also account for pressure drop and pipe length via sizing tables)"
      ],
      "vectors": [
        {
          "name": "25mm pipe, 6 m/s max velocity",
          "inputs": {
            "pipeDiameter": 0.025,
            "maxVelocity": 6
          },
          "expected": 10.6,
          "toleranceDecimalPlaces": 1,
          "unit": "m³/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Capacity in CFH, the unit US gas tables use",
              "value": 374.43700418467677,
              "unit": "CFH"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "32mm pipe, 6 m/s max velocity",
          "inputs": {
            "pipeDiameter": 0.032,
            "maxVelocity": 6
          },
          "expected": 17.37,
          "toleranceDecimalPlaces": 1,
          "unit": "m³/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Capacity in CFH, the unit US gas tables use",
              "value": 613.4775876561744,
              "unit": "CFH"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "gas-pipe-sizing-calculator",
      "title": "Gas Pipe Sizing Calculator (Longest-Length Method)",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/gas-pipe-sizing-calculator/",
      "sources": [
        "NFPA 54 / IFGC longest-length method: every section of the piping system is sized from the total developed length of the run to the most remote outlet, using the total connected load carried by that section",
        "NFPA 54 6.2: where the measured length falls between two tabulated lengths, the next longer length is used",
        "Capacity in cubic feet per hour = connected load in BTU/h ÷ the gas heating value per cubic foot. Planning values: natural gas commonly 1,000–1,050 BTU/ft³, commercial propane about 2,500 BTU/ft³ — the supplier's published figure governs",
        "Standard table bases: natural gas at 0.60 specific gravity, propane at 1.50. A table computed for one gas does not apply to the other"
      ],
      "vectors": [
        {
          "name": "250,000 BTU/h of natural gas is 243 CFH",
          "inputs": {
            "fuelType": "natural",
            "connectedLoadBtu": 250000,
            "developedLength": 18.288,
            "pipeMaterial": "schedule-40",
            "inletPressure": "low",
            "allowableDrop": "0.3"
          },
          "expected": 242.7,
          "toleranceDecimalPlaces": 1,
          "unit": "CFH",
          "confidence": "medium",
          "steps": [
            {
              "label": "Table row to read — next tabulated length at or above the measured run",
              "value": 60,
              "unit": "ft"
            },
            {
              "label": "Measured developed length",
              "value": 59.99999999999999,
              "unit": "ft"
            },
            {
              "label": "Heating value used (BTU per ft³)",
              "value": 1030,
              "unit": "BTU per ft³"
            },
            {
              "label": "Gas specific gravity the table must be computed at",
              "value": 0.6
            },
            {
              "label": "Same flow in cubic metres an hour",
              "value": 6.873021017475728,
              "unit": "m³/h"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "The same load on propane is 100 CFH",
          "inputs": {
            "fuelType": "propane",
            "connectedLoadBtu": 250000,
            "developedLength": 18.288,
            "pipeMaterial": "schedule-40",
            "inletPressure": "low",
            "allowableDrop": "0.3"
          },
          "expected": 100,
          "toleranceDecimalPlaces": 4,
          "unit": "CFH",
          "confidence": "medium",
          "steps": [
            {
              "label": "Table row to read — next tabulated length at or above the measured run",
              "value": 60,
              "unit": "ft"
            },
            {
              "label": "Measured developed length",
              "value": 59.99999999999999,
              "unit": "ft"
            },
            {
              "label": "Heating value used (BTU per ft³)",
              "value": 2500,
              "unit": "BTU per ft³"
            },
            {
              "label": "Gas specific gravity the table must be computed at",
              "value": 1.5
            },
            {
              "label": "Same flow in cubic metres an hour",
              "value": 2.8316846592,
              "unit": "m³/h"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A single 100,000 BTU/h furnace is 97 CFH",
          "inputs": {
            "fuelType": "natural",
            "connectedLoadBtu": 100000,
            "developedLength": 9.144,
            "pipeMaterial": "schedule-40",
            "inletPressure": "low",
            "allowableDrop": "0.3"
          },
          "expected": 97.09,
          "toleranceDecimalPlaces": 2,
          "unit": "CFH",
          "confidence": "medium",
          "steps": [
            {
              "label": "Table row to read — next tabulated length at or above the measured run",
              "value": 30,
              "unit": "ft"
            },
            {
              "label": "Measured developed length",
              "value": 29.999999999999996,
              "unit": "ft"
            },
            {
              "label": "Heating value used (BTU per ft³)",
              "value": 1030,
              "unit": "BTU per ft³"
            },
            {
              "label": "Gas specific gravity the table must be computed at",
              "value": 0.6
            },
            {
              "label": "Same flow in cubic metres an hour",
              "value": 2.7492084069902916,
              "unit": "m³/h"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A 600,000 BTU/h commercial load is 583 CFH",
          "inputs": {
            "fuelType": "natural",
            "connectedLoadBtu": 600000,
            "developedLength": 30.48,
            "pipeMaterial": "csst",
            "inletPressure": "two-psi",
            "allowableDrop": "1.0"
          },
          "expected": 582.5,
          "toleranceDecimalPlaces": 1,
          "unit": "CFH",
          "confidence": "medium",
          "steps": [
            {
              "label": "Table row to read — next tabulated length at or above the measured run",
              "value": 100,
              "unit": "ft"
            },
            {
              "label": "Measured developed length",
              "value": 99.99999999999999,
              "unit": "ft"
            },
            {
              "label": "Heating value used (BTU per ft³)",
              "value": 1030,
              "unit": "BTU per ft³"
            },
            {
              "label": "Gas specific gravity the table must be computed at",
              "value": 0.6
            },
            {
              "label": "Same flow in cubic metres an hour",
              "value": 16.49525044194175,
              "unit": "m³/h"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "generator-fuel-runtime-calculator",
      "title": "Generator Fuel Runtime Calculator",
      "url": "https://craftquantities.com/calculators/electrical/generator-fuel-runtime-calculator/",
      "sources": [
        "Runtime (hours) = fuel tank capacity (gallons) / fuel consumption rate (gallons per hour) at the expected load"
      ],
      "vectors": [
        {
          "name": "5 gal (18.93 L) tank, 0.75 gal/hr (2.84 L/hr)",
          "inputs": {
            "tankGallons": 18.92705892,
            "fuelConsumptionGph": 2.839058838
          },
          "expected": 6.667,
          "toleranceDecimalPlaces": 3,
          "unit": "hours",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "8 gal (30.28 L) tank, 1.0 gal/hr (3.79 L/hr)",
          "inputs": {
            "tankGallons": 30.283294272,
            "fuelConsumptionGph": 3.785411784
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "hours",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "generator-sizing-calculator",
      "title": "Generator Sizing Calculator",
      "url": "https://craftquantities.com/calculators/electrical/generator-sizing-calculator/",
      "sources": [
        "Standard sizing rule of thumb: generator capacity >= sum of all running watts running simultaneously, plus the largest single motor's additional starting-surge watts (beyond its own running watts), plus a safety margin"
      ],
      "vectors": [
        {
          "name": "3500W running + 2000W surge, 20% margin",
          "inputs": {
            "totalRunningWatts": 3500,
            "additionalSurgeWatts": 2000,
            "safetyMarginPercent": 20
          },
          "expected": 6600,
          "toleranceDecimalPlaces": 1,
          "unit": "W (recommended generator rating)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total running watts",
              "value": 3500,
              "unit": "W"
            },
            {
              "label": "Peak (with largest surge)",
              "value": 5500,
              "unit": "W"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "5000W running + 3000W surge, 25% margin",
          "inputs": {
            "totalRunningWatts": 5000,
            "additionalSurgeWatts": 3000,
            "safetyMarginPercent": 25
          },
          "expected": 10000,
          "toleranceDecimalPlaces": 1,
          "unit": "W (recommended generator rating)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total running watts",
              "value": 5000,
              "unit": "W"
            },
            {
              "label": "Peak (with largest surge)",
              "value": 8000,
              "unit": "W"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "geocell-infill-volume-calculator",
      "title": "Geocell Gravity Retaining Wall Infill Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/geocell-infill-volume-calculator/",
      "sources": [
        "Infill volume = wall face area × the wall's front-to-back thickness. A geocell gravity wall resists overturning by its own mass, so the infill is the whole cross-section of the wall, not one course of it",
        "Geocell panel area to buy = infill volume ÷ expanded cell depth: the panels lie flat in horizontal courses, so each course covers thickness × length in plan and the courses repeat every cell depth up the wall"
      ],
      "vectors": [
        {
          "name": "40m² face (2.0 x 20 m) on a 1.2 m thick wall",
          "inputs": {
            "wallFaceArea": 40,
            "wallThickness": 1.2,
            "cellDepth": 0.15
          },
          "expected": 48,
          "toleranceDecimalPlaces": 0,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Geocell panel area across all courses",
              "value": 320,
              "unit": "m²"
            },
            {
              "label": "Infill in a single geocell course",
              "value": 6,
              "unit": "m³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "60m² face on a 1.5 m thick wall",
          "inputs": {
            "wallFaceArea": 60,
            "wallThickness": 1.5,
            "cellDepth": 0.2
          },
          "expected": 90,
          "toleranceDecimalPlaces": 0,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Geocell panel area across all courses",
              "value": 450,
              "unit": "m²"
            },
            {
              "label": "Infill in a single geocell course",
              "value": 12,
              "unit": "m³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Cell depth no longer moves the infill volume",
          "inputs": {
            "wallFaceArea": 40,
            "wallThickness": 1.2,
            "cellDepth": 0.3
          },
          "expected": 48,
          "toleranceDecimalPlaces": 0,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Geocell panel area across all courses",
              "value": 160,
              "unit": "m²"
            },
            {
              "label": "Infill in a single geocell course",
              "value": 12,
              "unit": "m³"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "geogrid-layer-count-calculator",
      "title": "Geogrid Reinforcement Layer Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/geogrid-layer-count-calculator/",
      "sources": [
        "Reinforced soil wall design places geogrid layers at a regular vertical spacing from the base to the top of the wall; layer count = ceiling(wall height / vertical spacing)"
      ],
      "vectors": [
        {
          "name": "6m wall, 0.6m spacing, 4m embedment",
          "inputs": {
            "wallHeight": 6,
            "verticalSpacing": 0.6,
            "embedmentLength": 4
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "layers",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total geogrid length (per linear unit of wall face)",
              "value": 40,
              "unit": "m"
            },
            {
              "label": "Lift between geogrid layers, as built",
              "value": 0.6,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "4.5m wall, 0.4m spacing, 3.5m embedment",
          "inputs": {
            "wallHeight": 4.5,
            "verticalSpacing": 0.4,
            "embedmentLength": 3.5
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "layers",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total geogrid length (per linear unit of wall face)",
              "value": 42,
              "unit": "m"
            },
            {
              "label": "Lift between geogrid layers, as built",
              "value": 0.375,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "geotextile-riprap-overlap-calculator",
      "title": "Geotextile Riprap Fabric Overlap Calculator",
      "url": "https://craftquantities.com/calculators/heavy-civil/geotextile-riprap-overlap-calculator/",
      "sources": [
        "Standard geotextile installation requires adjacent rolls to overlap by a minimum margin, reducing the effective coverage width per roll below its full manufactured width"
      ],
      "vectors": [
        {
          "name": "20x15m slope, 4.5m roll, 0.3m overlap",
          "inputs": {
            "slopeWidth": 20,
            "slopeLength": 15,
            "rollWidth": 4.5,
            "overlapWidth": 0.3
          },
          "expected": 337.5,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Number of roll widths needed",
              "value": 5,
              "unit": "rolls"
            },
            {
              "label": "Effective coverage width per roll",
              "value": 4.2,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30x10m slope, 4.5m roll, 0.5m overlap",
          "inputs": {
            "slopeWidth": 30,
            "slopeLength": 10,
            "rollWidth": 4.5,
            "overlapWidth": 0.5
          },
          "expected": 360,
          "toleranceDecimalPlaces": 0,
          "unit": "m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Number of roll widths needed",
              "value": 8,
              "unit": "rolls"
            },
            {
              "label": "Effective coverage width per roll",
              "value": 4,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "glass-balustrade-stress-calculator",
      "title": "Glass Balustrade Bending Stress Checker",
      "url": "https://craftquantities.com/calculators/materials-quantities/glass-balustrade-stress-calculator/",
      "sources": [
        "IBC 1607.8.1/ASCE 7: glass guards must resist a 50 plf (0.73 kN/m) horizontal line load at the top rail; simplified cantilever screening check per glassonweb.com industry practice: M = w×h (per unit width), stress = 6M/t². This is a first-pass screening calculation only — ASTM E2358 requires full-scale physical testing (load/deflection, safety-factor hold, impact, and post-breakage behavior), and IBC 2407.1.1 requires a minimum safety factor of 4 against glass breaking strength, which this simple check does not verify"
      ],
      "vectors": [
        {
          "name": "0.73 N/mm load, 1050mm rail, 12mm glass",
          "inputs": {
            "lineLoad": 0.73,
            "railHeight": 1.05,
            "glassThickness": 0.012
          },
          "expected": 31.94,
          "toleranceDecimalPlaces": 1,
          "unit": "MPa",
          "confidence": "medium",
          "steps": [
            {
              "label": "Bending moment per unit width",
              "value": 766.5,
              "unit": "N·mm/mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "0.73 N/mm load, 900mm rail, 15mm glass",
          "inputs": {
            "lineLoad": 0.73,
            "railHeight": 0.9,
            "glassThickness": 0.015
          },
          "expected": 17.52,
          "toleranceDecimalPlaces": 1,
          "unit": "MPa",
          "confidence": "medium",
          "steps": [
            {
              "label": "Bending moment per unit width",
              "value": 657,
              "unit": "N·mm/mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "glass-block-panel-calculator",
      "title": "Glass Block Panel Expansion Strip & Wire Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/glass-block-panel-calculator/",
      "sources": [
        "Glass block panels require a compressible expansion strip around the full panel perimeter to accommodate thermal movement, and horizontal wire (or ladder-type) reinforcement embedded in the mortar bed joint at regular course intervals"
      ],
      "vectors": [
        {
          "name": "1.2x1.2m panel, 8in block, wire every 2 courses",
          "inputs": {
            "panelWidth": 1.2,
            "panelHeight": 1.2,
            "blockSize": "8",
            "wireReinforcementSpacing": 2
          },
          "expected": 4.8,
          "toleranceDecimalPlaces": 1,
          "unit": "m expansion strip",
          "confidence": "medium",
          "steps": [
            {
              "label": "Number of courses",
              "value": 6,
              "unit": "courses"
            },
            {
              "label": "Total wire reinforcement length",
              "value": 3.5999999999999996,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1.8x1.5m panel, 6in block, wire every 2 courses",
          "inputs": {
            "panelWidth": 1.8,
            "panelHeight": 1.5,
            "blockSize": "6",
            "wireReinforcementSpacing": 2
          },
          "expected": 6.6,
          "toleranceDecimalPlaces": 1,
          "unit": "m expansion strip",
          "confidence": "medium",
          "steps": [
            {
              "label": "Number of courses",
              "value": 10,
              "unit": "courses"
            },
            {
              "label": "Total wire reinforcement length",
              "value": 9,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "glass-panel-lift-safety-calculator",
      "title": "Glass Panel Lift Safety Weight Checker",
      "url": "https://craftquantities.com/calculators/materials-quantities/glass-panel-lift-safety-calculator/",
      "sources": [
        "Panel weight = area × thickness × glass density (2500 kg/m³); compared against a safe manual lifting threshold appropriate for the number of installers, since manual glass handling weight limits are a common jobsite safety practice to prevent back injury and dropped-glass incidents"
      ],
      "vectors": [
        {
          "name": "1.5m² x 10mm, threshold 23kg (fail)",
          "inputs": {
            "panelArea": 1.5,
            "thickness": 0.01,
            "density": 2500,
            "liftThreshold": 23
          },
          "expected": 37.5,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Safe lift threshold",
              "value": 23,
              "unit": "kg"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1.0m² x 6mm, threshold 23kg (pass)",
          "inputs": {
            "panelArea": 1,
            "thickness": 0.006,
            "density": 2500,
            "liftThreshold": 23
          },
          "expected": 15,
          "toleranceDecimalPlaces": 0,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Safe lift threshold",
              "value": 23,
              "unit": "kg"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "glass-panel-weight-calculator",
      "title": "Structural Glass Panel Weight Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/glass-panel-weight-calculator/",
      "sources": [
        "Panel weight = Width × Height × Total Glass Thickness × Ply Count × Glass Density (2,500 kg/m³, the standard density of soda-lime glass). This calculates WEIGHT ONLY for handling/rigging/logistics planning — it is NOT a structural adequacy or thickness-selection calculator. Structural glass thickness/lamination (for walkways, guards, floors, or other load-bearing glazing) must be selected using ASTM E1300 (wind/uniform load glass charts) or ASTM E2751/E2752 (structural glass walkways/railings) by a licensed engineer using the specific glass manufacturer's certified test data — never from a generic online calculator."
      ],
      "vectors": [
        {
          "name": "1.0x2.0m panel, 10mm plies x2",
          "inputs": {
            "panelWidth": 1,
            "panelHeight": 2,
            "glassThickness": 0.01,
            "plyCount": 2
          },
          "expected": 100,
          "toleranceDecimalPlaces": 0,
          "unit": "kg",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1.2x2.4m panel, 12mm plies x2",
          "inputs": {
            "panelWidth": 1.2,
            "panelHeight": 2.4,
            "glassThickness": 0.012,
            "plyCount": 2
          },
          "expected": 172.8,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "glazing-gasket-linear-footage-calculator",
      "title": "Glazing Gasket/Wedge Linear Footage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/glazing-gasket-linear-footage-calculator/",
      "sources": [
        "Total gasket length = number of lites × perimeter per lite × (1 + waste allowance), the standard method for estimating continuous perimeter glazing gasket/wedge material"
      ],
      "vectors": [
        {
          "name": "20 lites, 4.5m perimeter, 5% waste",
          "inputs": {
            "liteCount": 20,
            "litePerimeter": 4.5,
            "wastePercent": 5
          },
          "expected": 94.5,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30 lites, 5.2m perimeter, 8% waste",
          "inputs": {
            "liteCount": 30,
            "litePerimeter": 5.2,
            "wastePercent": 8
          },
          "expected": 168.48,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "glulam-beam-deflection-calculator",
      "title": "Glulam Beam Deflection Checker",
      "url": "https://craftquantities.com/calculators/materials-quantities/glulam-beam-deflection-calculator/",
      "sources": [
        "Uniformly-loaded simple beam deflection: Δ = 5wL⁴/(384EI); standard code deflection limits are L/180 for roof beams and L/360 for floor beams"
      ],
      "vectors": [
        {
          "name": "500 N/m, 6m span, E11000 MPa, I=80x10^6mm^4, L/240",
          "inputs": {
            "udl": 500,
            "span": 6,
            "elasticModulus": 11000000000,
            "momentOfInertia": 80,
            "deflectionLimitRatio": "240"
          },
          "expected": 9.59,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Allowable limit",
              "value": 25,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "800 N/m, 7m span, E11000 MPa, I=100x10^6mm^4, L/240",
          "inputs": {
            "udl": 800,
            "span": 7,
            "elasticModulus": 11000000000,
            "momentOfInertia": 100,
            "deflectionLimitRatio": "240"
          },
          "expected": 22.74,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Allowable limit",
              "value": 29.166666666666668,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "gpm-to-liters-per-minute-calculator",
      "title": "GPM to Litres per Minute Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/gpm-to-liters-per-minute-calculator/",
      "sources": [
        "1 US liquid gallon = 231 cubic inches = 3.785411784 L exactly",
        "1 imperial gallon = 4.54609 L, roughly 20% larger than a US gallon"
      ],
      "vectors": [
        {
          "name": "10 GPM converts correctly",
          "inputs": {
            "gpm": 10
          },
          "expected": 37.85411784,
          "toleranceDecimalPlaces": 6,
          "unit": "L/min",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 3.785411784,
              "unit": "L/min per GPM"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "gpm": 100
          },
          "expected": 378.5411784,
          "toleranceDecimalPlaces": 6,
          "unit": "L/min",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 3.785411784,
              "unit": "L/min per GPM"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "gpm-to-lpm-calculator",
      "title": "GPM to LPM Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/gpm-to-lpm-calculator/",
      "sources": [
        "1 US gallon = 3.785411784 litres, exactly"
      ],
      "vectors": [
        {
          "name": "10 GPM to LPM",
          "inputs": {
            "value": 10,
            "fromUnit": "gpm"
          },
          "expected": 37.8541,
          "toleranceDecimalPlaces": 4,
          "unit": "LPM",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "50 LPM to GPM",
          "inputs": {
            "value": 50,
            "fromUnit": "lpm"
          },
          "expected": 13.209,
          "toleranceDecimalPlaces": 3,
          "unit": "GPM",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "grass-seed-calculator",
      "title": "Grass Seed Calculator",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/grass-seed-calculator/",
      "sources": [
        "Seeding rates vary significantly by grass species (roughly 2-8 lb per 1,000 sq ft) — always use the rate printed on your specific product label"
      ],
      "vectors": [
        {
          "name": "10x8m lawn, 5 lb/1000sqft",
          "inputs": {
            "lawnLength": 10,
            "lawnWidth": 8,
            "seedingRatePer1000Sqft": 5
          },
          "expected": 4.31,
          "toleranceDecimalPlaces": 1,
          "unit": "lb of seed",
          "confidence": "high",
          "steps": [
            {
              "label": "Lawn area",
              "value": 861.1128333367777,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "20x15m lawn, 7 lb/1000sqft",
          "inputs": {
            "lawnLength": 20,
            "lawnWidth": 15,
            "seedingRatePer1000Sqft": 7
          },
          "expected": 22.6,
          "toleranceDecimalPlaces": 1,
          "unit": "lb of seed",
          "confidence": "high",
          "steps": [
            {
              "label": "Lawn area",
              "value": 3229.1731250129164,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "grassed-swale-capacity-calculator",
      "title": "Grassed Swale Capacity & Velocity Calculator",
      "url": "https://craftquantities.com/calculators/heavy-civil/grassed-swale-capacity-calculator/",
      "sources": [
        "Manning's equation for uniform open-channel flow, Q = (1/n) x A x R^(2/3) x S^(1/2) in SI units, applied to a trapezoidal section with equal side slopes",
        "USDA NRCS grassed waterway guidance is the source for both the permissible velocity of a vegetated lining and Manning's n for it; both vary with the cover species, its condition and the erodibility of the soil, and are entered here rather than assumed by this page",
        "Manning's n for a grass lining depends on retardance class, which changes through the season as the sward grows and is cut — so one value does not describe a swale all year, and capacity and velocity are conventionally checked at opposite ends of the range"
      ],
      "vectors": [
        {
          "name": "1 m bottom, 2H:1V banks, 0.5 m deep, 1% grade, n = 0.04",
          "inputs": {
            "bottomWidth": 1,
            "sideSlope": 2,
            "flowDepth": 0.5,
            "longitudinalSlope": 1,
            "manningN": 0.04,
            "permissibleVelocity": 1.5
          },
          "expected": 40.3537,
          "toleranceDecimalPlaces": 2,
          "unit": "ft³/s",
          "confidence": "medium",
          "steps": [
            {
              "label": "Mean flow velocity",
              "value": 3.7489814257891942,
              "unit": "ft/s"
            },
            {
              "label": "Flow cross-sectional area",
              "value": 1,
              "unit": "m²"
            },
            {
              "label": "Wetted perimeter",
              "value": 3.23606797749979,
              "unit": "m"
            },
            {
              "label": "Hydraulic radius",
              "value": 0.3090169943749474,
              "unit": "m"
            },
            {
              "label": "Permissible velocity for the lining",
              "value": 4.921259842519685,
              "unit": "ft/s"
            },
            {
              "label": "Velocity as a share of the permissible",
              "value": 76.17930257203643,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "2 m bottom, 3H:1V banks, 0.25 m deep, 3% grade, n = 0.045",
          "inputs": {
            "bottomWidth": 2,
            "sideSlope": 3,
            "flowDepth": 0.25,
            "longitudinalSlope": 3,
            "manningN": 0.045,
            "permissibleVelocity": 1.8
          },
          "expected": 31.0988,
          "toleranceDecimalPlaces": 2,
          "unit": "ft³/s",
          "confidence": "medium",
          "steps": [
            {
              "label": "Mean flow velocity",
              "value": 4.202433477476095,
              "unit": "ft/s"
            },
            {
              "label": "Flow cross-sectional area",
              "value": 0.6875,
              "unit": "m²"
            },
            {
              "label": "Wetted perimeter",
              "value": 3.58113883008419,
              "unit": "m"
            },
            {
              "label": "Hydraulic radius",
              "value": 0.19197803621141304,
              "unit": "m"
            },
            {
              "label": "Permissible velocity for the lining",
              "value": 5.905511811023622,
              "unit": "ft/s"
            },
            {
              "label": "Velocity as a share of the permissible",
              "value": 71.16120688526188,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "gravel-base-tonnage-calculator",
      "title": "Gravel Base Layer Tonnage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/gravel-base-tonnage-calculator/",
      "sources": [
        "Mass = area x thickness x in-place compacted density",
        "Wisconsin DOT Standard Specifications for Highway and Structure Construction (2025), §305.4(2): completed in-place dense-graded base converts at 1.85 US tons per cubic yard, about 2,195 kg/m³ (137 pcf)"
      ],
      "vectors": [
        {
          "name": "200m² area, 0.15m thick, 1700 kg/m³",
          "inputs": {
            "area": 200,
            "thickness": 0.15,
            "gravelDensity": 1700
          },
          "expected": 51,
          "toleranceDecimalPlaces": 0,
          "unit": "metric tons",
          "confidence": "medium",
          "steps": [
            {
              "label": "Volume",
              "value": 30,
              "unit": "m³"
            },
            {
              "label": "Equivalent in US (short) tons",
              "value": 56.21786074505201,
              "unit": "tons"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "350m² area, 0.2m thick, 1800 kg/m³",
          "inputs": {
            "area": 350,
            "thickness": 0.2,
            "gravelDensity": 1800
          },
          "expected": 126,
          "toleranceDecimalPlaces": 0,
          "unit": "metric tons",
          "confidence": "medium",
          "steps": [
            {
              "label": "Volume",
              "value": 70,
              "unit": "m³"
            },
            {
              "label": "Equivalent in US (short) tons",
              "value": 138.89118537012848,
              "unit": "tons"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The default: 200 m² at 150 mm of compacted dense-graded base, 2,200 kg/m³",
          "inputs": {
            "area": 200,
            "thickness": 0.15,
            "gravelDensity": 2200
          },
          "expected": 66,
          "toleranceDecimalPlaces": 0,
          "unit": "metric tons",
          "confidence": "medium",
          "steps": [
            {
              "label": "Volume",
              "value": 30,
              "unit": "m³"
            },
            {
              "label": "Equivalent in US (short) tons",
              "value": 72.7525256700673,
              "unit": "tons"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "One compacted cubic yard at Wisconsin DOT's 1.85 US tons (2,195.1 kg/m³): 1.678 t",
          "inputs": {
            "area": 1.529109716,
            "thickness": 0.5,
            "gravelDensity": 2195.1
          },
          "expected": 1.678,
          "toleranceDecimalPlaces": 3,
          "unit": "metric tons",
          "confidence": "medium",
          "steps": [
            {
              "label": "Volume",
              "value": 0.764554858,
              "unit": "m³"
            },
            {
              "label": "Equivalent in US (short) tons",
              "value": 1.8499802893520065,
              "unit": "tons"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "gravel-calculator",
      "title": "Gravel Calculator",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/gravel-calculator/",
      "sources": [
        "Typical LOOSE bulk density of crushed stone or gravel as delivered, 1600 kg/m³ (100 lb/ft³) — the site's material density table gives gravel, dry loose, at 1600 kg/m³ and crushed stone at 1550 kg/m³ (97 lb/ft³); a rolled dense-graded base is about 2200 kg/m³ (137 lb/ft³) in place (Wisconsin DOT 1.85 US tons per cubic yard)",
        "Driveway base depth 100-150 mm (4-6 in) over a prepared subgrade — common residential practice"
      ],
      "vectors": [
        {
          "name": "10 × 3 × 0.1 m at 20% compaction",
          "inputs": {
            "length": 10,
            "width": 3,
            "depth": 0.1,
            "compactionPercent": 20
          },
          "expected": 5.76,
          "toleranceDecimalPlaces": 2,
          "unit": "metric tonnes",
          "confidence": "medium",
          "steps": [
            {
              "label": "Finished volume",
              "value": 3,
              "unit": "m³"
            },
            {
              "label": "Loose volume to order",
              "value": 3.5999999999999996,
              "unit": "m³"
            },
            {
              "label": "Cubic yards",
              "value": 4.708622229531811,
              "unit": "yd³"
            },
            {
              "label": "US short tons",
              "value": 6.349313150924473,
              "unit": "tons"
            }
          ],
          "includesAllowance": {
            "label": "Compaction allowance",
            "percent": 20
          },
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1 m³ finished, no compaction",
          "inputs": {
            "length": 1,
            "width": 1,
            "depth": 1,
            "compactionPercent": 0
          },
          "expected": 1.6,
          "toleranceDecimalPlaces": 1,
          "unit": "metric tonnes",
          "confidence": "medium",
          "steps": [
            {
              "label": "Finished volume",
              "value": 1,
              "unit": "m³"
            },
            {
              "label": "Loose volume to order",
              "value": 1,
              "unit": "m³"
            },
            {
              "label": "Cubic yards",
              "value": 1.3079506193143922,
              "unit": "yd³"
            },
            {
              "label": "US short tons",
              "value": 1.7636980974790206,
              "unit": "tons"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Deeper layer scales linearly",
          "inputs": {
            "length": 10,
            "width": 3,
            "depth": 0.15,
            "compactionPercent": 20
          },
          "expected": 8.64,
          "toleranceDecimalPlaces": 2,
          "unit": "metric tonnes",
          "confidence": "medium",
          "steps": [
            {
              "label": "Finished volume",
              "value": 4.5,
              "unit": "m³"
            },
            {
              "label": "Loose volume to order",
              "value": 5.3999999999999995,
              "unit": "m³"
            },
            {
              "label": "Cubic yards",
              "value": 7.062933344297717,
              "unit": "yd³"
            },
            {
              "label": "US short tons",
              "value": 9.523969726386712,
              "unit": "tons"
            }
          ],
          "includesAllowance": {
            "label": "Compaction allowance",
            "percent": 20
          },
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Zero area is zero gravel",
          "inputs": {
            "length": 0,
            "width": 3,
            "depth": 0.1,
            "compactionPercent": 20
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "metric tonnes",
          "confidence": "medium",
          "steps": [
            {
              "label": "Finished volume",
              "value": 0,
              "unit": "m³"
            },
            {
              "label": "Loose volume to order",
              "value": 0,
              "unit": "m³"
            },
            {
              "label": "Cubic yards",
              "value": 0,
              "unit": "yd³"
            },
            {
              "label": "US short tons",
              "value": 0,
              "unit": "tons"
            }
          ],
          "includesAllowance": {
            "label": "Compaction allowance",
            "percent": 20
          },
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "gravel-cubic-yards-to-tons-calculator",
      "title": "Gravel Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/gravel-cubic-yards-to-tons-calculator/",
      "sources": [
        "Commonly cited bulk density for dry crushed stone/gravel: approximately 1.4 short tons per cubic yard (about 2,800 lb/cu yd)",
        "Density varies materially with stone type, gradation and moisture content — the supplier's ticket weight governs"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 14,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.4,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 140,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.4,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "gravel-driveway-calculator",
      "title": "Gravel Driveway Calculator",
      "url": "https://craftquantities.com/calculators/auto-utility/gravel-driveway-calculator/",
      "sources": [
        "Crushed stone/gravel is sold by weight; a commonly-cited average for stone as tipped or laid loose is about 1.4 US tons per cubic yard (about 1,660 kg/m³). A rolled dense-graded base weighs about 1.85 US tons per cubic yard in place (Wisconsin DOT)",
        "A 4-6 in gravel depth is standard for a residential driveway base or wearing surface"
      ],
      "vectors": [
        {
          "name": "12x3m driveway, 4in depth",
          "inputs": {
            "drivewayLength": 12,
            "drivewayWidth": 3,
            "depth": 0.1016
          },
          "expected": 6.7,
          "toleranceDecimalPlaces": 1,
          "unit": "tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Driveway area",
              "value": 387.50077500155,
              "unit": "sq ft"
            },
            {
              "label": "Volume",
              "value": 4.78396018520432,
              "unit": "cubic yards"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "15x3.5m driveway, 6in depth",
          "inputs": {
            "drivewayLength": 15,
            "drivewayWidth": 3.5,
            "depth": 0.1524
          },
          "expected": 14.65,
          "toleranceDecimalPlaces": 1,
          "unit": "tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Driveway area",
              "value": 565.1052968772603,
              "unit": "sq ft"
            },
            {
              "label": "Volume",
              "value": 10.464912905134451,
              "unit": "cubic yards"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "gravel-tons-to-cubic-yards-calculator",
      "title": "Gravel Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/gravel-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of the commonly cited 1.4 short tons per cubic yard for dry crushed stone",
        "1 short ton = 2,000 lb; 1 metric tonne = 1,000 kg (about 2,205 lb)"
      ],
      "vectors": [
        {
          "name": "14 short tons converts correctly",
          "inputs": {
            "tons": 14
          },
          "expected": 10,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.7142857142857143,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 140
          },
          "expected": 100,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.7142857142857143,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "grease-trap-sizing-calculator",
      "title": "Grease Trap Sizing Calculator (PDI-G101 Method)",
      "url": "https://craftquantities.com/calculators/materials-quantities/grease-trap-sizing-calculator/",
      "sources": [
        "PDI-G101 method: required grease trap capacity = flow rate × retention time × storage factor, the standard plumbing industry method for sizing hydromechanical grease interceptors for commercial kitchen fixtures"
      ],
      "vectors": [
        {
          "name": "150 L/min, 2 min retention, 1.7 storage factor",
          "inputs": {
            "flowRate": 150,
            "retentionTime": 2,
            "storageFactor": 1.7
          },
          "expected": 510,
          "toleranceDecimalPlaces": -1,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "200 L/min, 2 min retention, 1.7 storage factor",
          "inputs": {
            "flowRate": 200,
            "retentionTime": 2,
            "storageFactor": 1.7
          },
          "expected": 680,
          "toleranceDecimalPlaces": -1,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "green-roof-growing-medium-calculator",
      "title": "Green Roof Growing Medium Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/green-roof-growing-medium-calculator/",
      "sources": [
        "Volume = Roof Area × Growing Medium Depth, a straightforward volumetric takeoff for the substrate/growing medium layer of an extensive or intensive green roof system, applied over the green roof's plan area."
      ],
      "vectors": [
        {
          "name": "100m² roof, 0.15m depth",
          "inputs": {
            "roofArea": 100,
            "mediumDepth": 0.15
          },
          "expected": 15,
          "toleranceDecimalPlaces": 1,
          "unit": "m³",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "200m² roof, 0.2m depth",
          "inputs": {
            "roofArea": 200,
            "mediumDepth": 0.2
          },
          "expected": 40,
          "toleranceDecimalPlaces": 0,
          "unit": "m³",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "green-roof-retention-calculator",
      "title": "Green Roof Vegetated Tray Rainwater Retention Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/green-roof-retention-calculator/",
      "sources": [
        "Retained volume = tray area × the tray system's rated water retention depth, the standard method for estimating a modular green roof system's stormwater retention capacity"
      ],
      "vectors": [
        {
          "name": "50m² trays, 25mm retention",
          "inputs": {
            "trayArea": 50,
            "retentionDepth": 0.025
          },
          "expected": 1250,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "75m² trays, 30mm retention",
          "inputs": {
            "trayArea": 75,
            "retentionDepth": 0.03
          },
          "expected": 2250,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "green-roof-saturated-load-calculator",
      "title": "Green Roof Growing Medium Saturated Load Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/green-roof-saturated-load-calculator/",
      "sources": [
        "Total saturated weight = Medium Depth × Roof Area × Saturated Density; Load per unit area (kPa) = Medium Depth × Saturated Density × 9.81 ÷ 1000. Saturated growing medium density is product-specific (lightweight engineered green roof media commonly range roughly 800-1,600 kg/m³ when fully saturated, versus native soil which can be much heavier) — this calculator applies the density you supply from the specific medium manufacturer's data sheet. This is a load QUANTITY calculation only — the roof structure's capacity to carry this load must be verified by a qualified structural engineer."
      ],
      "vectors": [
        {
          "name": "0.15m medium, 100m² roof, 1200 kg/m³",
          "inputs": {
            "mediumDepth": 0.15,
            "roofArea": 100,
            "saturatedDensity": 1200
          },
          "expected": 18000,
          "toleranceDecimalPlaces": -1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Load per unit area",
              "value": 1.7658000000000003,
              "unit": "kN/m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "0.2m medium, 200m² roof, 1400 kg/m³",
          "inputs": {
            "mediumDepth": 0.2,
            "roofArea": 200,
            "saturatedDensity": 1400
          },
          "expected": 56000,
          "toleranceDecimalPlaces": -1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Load per unit area",
              "value": 2.7468000000000004,
              "unit": "kN/m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "greenhouse-heating-btu-calculator",
      "title": "Greenhouse Heating BTU Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/greenhouse-heating-btu-calculator/",
      "sources": [
        "Commonly cited greenhouse heat-loss factors (BTU/hr per sq ft per °F of temperature difference): single-layer poly film ~1.2, double-layer inflated poly ~0.7, glass ~1.1 — air leakage, wind exposure and glazing condition change these materially, and a U-value for the glazing actually installed governs"
      ],
      "vectors": [
        {
          "name": "20m² greenhouse, single-poly, 40°F diff",
          "inputs": {
            "greenhouseArea": 20,
            "glazingType": "single-poly",
            "tempDiff": 22.2222222
          },
          "expected": 10333.4,
          "toleranceDecimalPlaces": -1,
          "unit": "BTU/hr",
          "confidence": "medium",
          "steps": [
            {
              "label": "Covering area",
              "value": 215.27820833419443,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30m² greenhouse, double-poly, 50°F diff",
          "inputs": {
            "greenhouseArea": 30,
            "glazingType": "double-poly",
            "tempDiff": 27.7777778
          },
          "expected": 11302.2,
          "toleranceDecimalPlaces": -1,
          "unit": "BTU/hr",
          "confidence": "medium",
          "steps": [
            {
              "label": "Covering area",
              "value": 322.91731250129163,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "greywater-cistern-peak-inflow-calculator",
      "title": "Greywater Collection Cistern Peak Inflow Calculator",
      "url": "https://craftquantities.com/calculators/sustainability-compliance/greywater-cistern-peak-inflow-calculator/",
      "sources": [
        "Peak inflow rate = average daily flow × peaking factor, the standard method for sizing detention/collection systems to handle short-duration peak demand rather than just the daily average"
      ],
      "vectors": [
        {
          "name": "500 L/day average, 2.5x peaking factor",
          "inputs": {
            "avgDailyFlow": 500,
            "peakingFactor": 2.5
          },
          "expected": 1250,
          "toleranceDecimalPlaces": 0,
          "unit": "L/day",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "800 L/day average, 3.0x peaking factor",
          "inputs": {
            "avgDailyFlow": 800,
            "peakingFactor": 3
          },
          "expected": 2400,
          "toleranceDecimalPlaces": 0,
          "unit": "L/day",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "ground-rod-resistance-calculator",
      "title": "Isolated Ground Rod Earth Resistance Calculator (Dwight's Formula)",
      "url": "https://craftquantities.com/calculators/materials-quantities/ground-rod-resistance-calculator/",
      "sources": [
        "Dwight's formula for a single driven ground rod: R = (ρ ÷ (2×π×L)) × (ln(8L÷d) − 1), where ρ is soil resistivity, L is the rod's driven length, and d is the rod diameter — a well-established, widely-cited formula for estimating single ground rod resistance (IEEE Std 142)"
      ],
      "vectors": [
        {
          "name": "100 Ω·m soil, 2.4m rod, 5/8in diameter",
          "inputs": {
            "soilResistivity": 100,
            "rodLength": 2.4,
            "rodDiameter": 0.0159
          },
          "expected": 40.43,
          "toleranceDecimalPlaces": 1,
          "unit": "Ω",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150 Ω·m soil, 3.0m rod, 3/4in diameter",
          "inputs": {
            "soilResistivity": 150,
            "rodLength": 3,
            "rodDiameter": 0.0191
          },
          "expected": 48.83,
          "toleranceDecimalPlaces": 2,
          "unit": "Ω",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "grounding-conductor-sizing-calculator",
      "title": "Equipment Grounding Conductor Sizing Reference Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/grounding-conductor-sizing-calculator/",
      "sources": [
        "NEC Table 250.122 sets equipment grounding conductor size based on the rating of the automatic overcurrent device ahead of the circuit — sizes step up at defined breakpoints rather than scaling continuously. This calculator applies a simplified proportional approximation (OCPD rating × a scaling factor) as a rough estimate only; the actual required size MUST be taken directly from NEC Table 250.122, not calculated proportionally."
      ],
      "vectors": [
        {
          "name": "100A OCPD",
          "inputs": {
            "ocpdRating": 100,
            "sizingFactor": 0.0225
          },
          "expected": 2.25,
          "toleranceDecimalPlaces": 2,
          "unit": "(illustrative scaling units)",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "200A OCPD",
          "inputs": {
            "ocpdRating": 200,
            "sizingFactor": 0.02
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "(illustrative scaling units)",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "grounding-grid-resistance-calculator",
      "title": "Server Room Grounding Grid Resistance Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/grounding-grid-resistance-calculator/",
      "sources": [
        "Simplified grid resistance approximation: R ≈ ρ ÷ (4×√(A/π)), treating the grid as an equivalent hemisphere of the same plan area — a common preliminary estimating method; full grid design uses the more detailed IEEE 80 Sverak equation accounting for grid conductor length, mesh spacing, and burial depth"
      ],
      "vectors": [
        {
          "name": "100 Ω·m soil, 50 m² grid",
          "inputs": {
            "soilResistivity": 100,
            "gridArea": 50
          },
          "expected": 6.27,
          "toleranceDecimalPlaces": 2,
          "unit": "Ω",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150 Ω·m soil, 80 m² grid",
          "inputs": {
            "soilResistivity": 150,
            "gridArea": 80
          },
          "expected": 7.43,
          "toleranceDecimalPlaces": 2,
          "unit": "Ω",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "grout-calculator",
      "title": "Grout Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/grout-calculator/",
      "sources": [
        "Derived rather than tabulated: tiles on a grid form modules of (length + joint) × (width + joint), so the share of the surface that is joint is 1 − length × width ÷ ((length + joint)(width + joint)); joint volume is that share × area × joint depth, and mass is volume × the mixed grout's density",
        "The consumption formula printed on cementitious grout packaging, (length + width) ÷ (length × width) × joint width × joint depth × density, is the same geometry without the joint-crossing correction and reads within 2% of it at common tile sizes"
      ],
      "vectors": [
        {
          "name": "10 m² of 300 mm square tile, 3 mm joints 8 mm deep, 10% allowance",
          "inputs": {
            "area": 10,
            "tileLength": 0.3,
            "tileWidth": 0.3,
            "jointWidth": 0.003,
            "jointDepth": 0.008,
            "groutDensity": 1600,
            "wastePercent": 10
          },
          "expected": 6.116,
          "toleranceDecimalPlaces": 2,
          "unit": "lb",
          "confidence": "high",
          "steps": [
            {
              "label": "Share of the surface that is joint",
              "value": 1.9703950593079167,
              "unit": "%"
            },
            {
              "label": "Joint volume",
              "value": 0.055667075863301455,
              "unit": "ft³"
            },
            {
              "label": "Before the allowance",
              "value": 5.5602912278134955,
              "unit": "lb"
            },
            {
              "label": "Allowance at 10%",
              "value": 0.5560291227813503,
              "unit": "lb"
            },
            {
              "label": "25 lb bags",
              "value": 1,
              "unit": "bags"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1 m² of 25 mm mosaic, 2 mm joints 4 mm deep, no allowance",
          "inputs": {
            "area": 1,
            "tileLength": 0.025,
            "tileWidth": 0.025,
            "jointWidth": 0.002,
            "jointDepth": 0.004,
            "groutDensity": 1600,
            "wastePercent": 0
          },
          "expected": 2.013,
          "toleranceDecimalPlaces": 2,
          "unit": "lb",
          "confidence": "high",
          "steps": [
            {
              "label": "Share of the surface that is joint",
              "value": 14.266117969821678,
              "unit": "%"
            },
            {
              "label": "Joint volume",
              "value": 0.02015212806054768,
              "unit": "ft³"
            },
            {
              "label": "Before the allowance",
              "value": 2.0128900097428613,
              "unit": "lb"
            },
            {
              "label": "Allowance at 0%",
              "value": 0,
              "unit": "lb"
            },
            {
              "label": "25 lb bags",
              "value": 1,
              "unit": "bags"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "20 m² of 600 mm porcelain, 3 mm joints 9 mm deep, no allowance",
          "inputs": {
            "area": 20,
            "tileLength": 0.6,
            "tileWidth": 0.6,
            "jointWidth": 0.003,
            "jointDepth": 0.009,
            "groutDensity": 1600,
            "wastePercent": 0
          },
          "expected": 6.302,
          "toleranceDecimalPlaces": 2,
          "unit": "lb",
          "confidence": "high",
          "steps": [
            {
              "label": "Share of the surface that is joint",
              "value": 0.9925496893641195,
              "unit": "%"
            },
            {
              "label": "Joint volume",
              "value": 0.06309281067193963,
              "unit": "ft³"
            },
            {
              "label": "Before the allowance",
              "value": 6.302008795625605,
              "unit": "lb"
            },
            {
              "label": "Allowance at 0%",
              "value": 0,
              "unit": "lb"
            },
            {
              "label": "25 lb bags",
              "value": 1,
              "unit": "bags"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "grout-weight-calculator",
      "title": "Grout Weight Consumption Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/grout-weight-calculator/",
      "sources": [
        "Grout mass = grout volume × the specific grout product's density; useful when purchasing bulk grout by weight rather than counting pre-packaged bags, since density varies notably between sanded, unsanded, and epoxy grout"
      ],
      "vectors": [
        {
          "name": "15L volume, 1600 kg/m³ density",
          "inputs": {
            "groutVolume": 15,
            "groutDensity": 1600
          },
          "expected": 24,
          "toleranceDecimalPlaces": 0,
          "unit": "kg",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "25L volume, 1500 kg/m³ density",
          "inputs": {
            "groutVolume": 25,
            "groutDensity": 1500
          },
          "expected": 37.5,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "guardrail-compliance-checker",
      "title": "Guardrail System Fall-Protection Compliance Checker",
      "url": "https://craftquantities.com/calculators/materials-quantities/guardrail-compliance-checker/",
      "sources": [
        "OSHA 29 CFR 1926.502(b) Guardrail Systems (verified against the regulatory text): top edge height must be '42 inches (1.1 m) plus or minus 3 inches (8 cm) above the walking/working level' (i.e. 39-45 inches); midrails installed 'at a height midway between the top edge of the guardrail system and the walking/working level'; top rails must withstand 'at least 200 pounds (890 N) applied within 2 inches of the top edge'; midrails and structural members must withstand 'at least 150 pounds (666 N) applied in any downward or outward direction'; midrails, screens, mesh or equivalent members must be installed 'when there is no wall or parapet wall at least 21 inches (53 cm) high' — the wall is what removes the requirement, not what creates it. These are FIXED regulatory values (a performance standard restated directly, not an engineering estimate)."
      ],
      "vectors": [
        {
          "name": "1.0668m top rail, 200 lbf top / 150 lbf mid (all pass)",
          "inputs": {
            "topRailHeight": 1.0668,
            "topRailRatedLoad": 889.6443230520999,
            "midrailRatedLoad": 667.233242289075
          },
          "expected": 42,
          "toleranceDecimalPlaces": 1,
          "unit": "in",
          "confidence": "medium",
          "steps": [
            {
              "label": "Top rail rated load capacity",
              "value": 200,
              "unit": "lbf (OSHA min 200)"
            },
            {
              "label": "Midrail rated load capacity",
              "value": 150,
              "unit": "lbf (OSHA min 150)"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1.143m top rail, 250 lbf top / 180 lbf mid (upper bound, all pass)",
          "inputs": {
            "topRailHeight": 1.143,
            "topRailRatedLoad": 1112.055403815125,
            "midrailRatedLoad": 800.6798907468899
          },
          "expected": 45,
          "toleranceDecimalPlaces": 1,
          "unit": "in",
          "confidence": "medium",
          "steps": [
            {
              "label": "Top rail rated load capacity",
              "value": 250,
              "unit": "lbf (OSHA min 200)"
            },
            {
              "label": "Midrail rated load capacity",
              "value": 180,
              "unit": "lbf (OSHA min 150)"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "guardrail-post-spacing-calculator",
      "title": "Highway Guardrail Post Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/guardrail-post-spacing-calculator/",
      "sources": [
        "Post count = ceil(guardrail length ÷ post spacing) + 1, the standard layout method for W-beam guardrail posts, commonly spaced at 6.25 ft (1.905 m) per AASHTO Roadside Design Guide standard post spacing"
      ],
      "vectors": [
        {
          "name": "100m guardrail, 1.905m spacing",
          "inputs": {
            "guardrailLength": 100,
            "postSpacing": 1.905
          },
          "expected": 54,
          "toleranceDecimalPlaces": 0,
          "unit": "posts",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150m guardrail, 1.905m spacing",
          "inputs": {
            "guardrailLength": 150,
            "postSpacing": 1.905
          },
          "expected": 80,
          "toleranceDecimalPlaces": 0,
          "unit": "posts",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "gutter-calculator",
      "title": "Gutter Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/gutter-calculator/",
      "sources": [
        "Gutter is commonly stocked in 10 ft sections in North America and 4 m lengths in metric markets; one downspout per approximately 35 ft (10.7 m) of gutter run is a standard rule of thumb for adequate drainage"
      ],
      "vectors": [
        {
          "name": "15m eave run",
          "inputs": {
            "eaveLength": 15
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "x 10 ft sections",
          "confidence": "medium",
          "steps": [
            {
              "label": "Eave length",
              "value": 49.212598425196845,
              "unit": "ft"
            },
            {
              "label": "Downspouts needed",
              "value": 2,
              "unit": "downspouts"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30m eave run",
          "inputs": {
            "eaveLength": 30
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "x 10 ft sections",
          "confidence": "medium",
          "steps": [
            {
              "label": "Eave length",
              "value": 98.42519685039369,
              "unit": "ft"
            },
            {
              "label": "Downspouts needed",
              "value": 3,
              "unit": "downspouts"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "gutter-guard-calculator",
      "title": "Gutter Guard Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/gutter-guard-calculator/",
      "sources": [
        "Gutter guard is commonly stocked in 4 ft and 6 ft sections in North America, and in 1 m sections and 4 m full lengths in metric markets; section count = gutter length / stock length, rounded up with an overlap allowance"
      ],
      "vectors": [
        {
          "name": "15m gutter, 4ft sections",
          "inputs": {
            "eaveLength": 15,
            "sectionLengthFt": "4"
          },
          "expected": 14,
          "toleranceDecimalPlaces": 0,
          "unit": "x 4 ft sections",
          "confidence": "high",
          "steps": [
            {
              "label": "Gutter length (with overlap allowance)",
              "value": 54.13385826771653,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30m gutter, 6ft sections",
          "inputs": {
            "eaveLength": 30,
            "sectionLengthFt": "6"
          },
          "expected": 19,
          "toleranceDecimalPlaces": 0,
          "unit": "x 6 ft sections",
          "confidence": "high",
          "steps": [
            {
              "label": "Gutter length (with overlap allowance)",
              "value": 108.26771653543307,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15m gutter, 4ft sections, no overlap allowance",
          "inputs": {
            "eaveLength": 15,
            "sectionLengthFt": "4",
            "overlapPercent": 0
          },
          "expected": 13,
          "toleranceDecimalPlaces": 0,
          "unit": "x 4 ft sections",
          "confidence": "high",
          "steps": [
            {
              "label": "Gutter length (with overlap allowance)",
              "value": 49.212598425196845,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "gutter-hanger-spacing-calculator",
      "title": "Gutter Hanger Spacing Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/gutter-hanger-spacing-calculator/",
      "sources": [
        "Hanger count = (eave length / hanger spacing) + 1, following the standard fence-post-style point-support counting"
      ],
      "vectors": [
        {
          "name": "15m eave, 24in spacing",
          "inputs": {
            "eaveLength": 15,
            "spacingIn": "24"
          },
          "expected": 26,
          "toleranceDecimalPlaces": 0,
          "unit": "hangers",
          "confidence": "high",
          "steps": [
            {
              "label": "Eave length",
              "value": 49.212598425196845,
              "unit": "linear ft"
            },
            {
              "label": "Bays between hangers",
              "value": 25
            },
            {
              "label": "Hanger centres, as hung",
              "value": 23.622047244094485,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30m eave, 36in spacing",
          "inputs": {
            "eaveLength": 30,
            "spacingIn": "36"
          },
          "expected": 34,
          "toleranceDecimalPlaces": 0,
          "unit": "hangers",
          "confidence": "high",
          "steps": [
            {
              "label": "Eave length",
              "value": 98.42519685039369,
              "unit": "linear ft"
            },
            {
              "label": "Bays between hangers",
              "value": 33
            },
            {
              "label": "Hanger centres, as hung",
              "value": 35.79098067287043,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "gypsum-waste-cubic-yards-to-tons-calculator",
      "title": "Gypsum Waste Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/gypsum-waste-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 0.25 short tons per cubic yard",
        "Density varies with moisture, grading and how the material was processed"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 2.5,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.25,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 25,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.25,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "gypsum-waste-tons-to-cubic-yards-calculator",
      "title": "Gypsum Waste Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/gypsum-waste-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 0.25 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 40,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 4,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 400,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 4,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "hand-arm-vibration-exposure-calculator",
      "title": "Hand-Arm Vibration Exposure (A(8)) and Points Calculator",
      "url": "https://craftquantities.com/calculators/sustainability-compliance/hand-arm-vibration-exposure-calculator/",
      "sources": [
        "BS EN ISO 5349-1:2001: the daily exposure A(8) = ahv × √(T ÷ T0), with T0 = 8 hours, and for several tools A(8) = √(A1(8)² + A2(8)² + … + An(8)²)",
        "Control of Vibration at Work Regulations 2005, regulation 4, and Directive 2002/44/EC, Article 3: for hand-arm vibration, a daily exposure action value of 2.5 m/s² A(8) and an exposure limit value of 5 m/s² A(8)",
        "HSE L140 (Hand-arm vibration at work): exposure points = 2 × ahv² × T, with T in hours, so 100 points is the exposure action value and 400 points the exposure limit value",
        "ANSI S2.70-2006 (US): the same daily exposure action value of 2.5 m/s² and limit value of 5.0 m/s², on the ISO 5349-1 A(8) basis"
      ],
      "vectors": [
        {
          "name": "5 m/s² for 2 hours is exactly the 2.5 m/s² action value",
          "inputs": {
            "toolMagnitude1": 5,
            "toolHours1": 2,
            "toolMagnitude2": 0,
            "toolHours2": 0,
            "toolMagnitude3": 0,
            "toolHours3": 0,
            "toolMagnitude4": 0,
            "toolHours4": 0
          },
          "expected": 2.5,
          "toleranceDecimalPlaces": 2,
          "unit": "m/s²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Exposure points (100 is the action value, 400 the limit value)",
              "value": 100,
              "unit": "points"
            },
            {
              "label": "Tool 1: partial exposure",
              "value": 2.5,
              "unit": "m/s²"
            },
            {
              "label": "Tool 1: trigger time to reach the action value on its own",
              "value": 2,
              "unit": "hours"
            },
            {
              "label": "Tool 1: trigger time to reach the limit value on its own",
              "value": 8,
              "unit": "hours"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "10 m/s² for 2 hours is exactly the 5 m/s² limit value — twice the magnitude is four times the dose",
          "inputs": {
            "toolMagnitude1": 10,
            "toolHours1": 2,
            "toolMagnitude2": 0,
            "toolHours2": 0,
            "toolMagnitude3": 0,
            "toolHours3": 0,
            "toolMagnitude4": 0,
            "toolHours4": 0
          },
          "expected": 5,
          "toleranceDecimalPlaces": 2,
          "unit": "m/s²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Exposure points (100 is the action value, 400 the limit value)",
              "value": 400,
              "unit": "points"
            },
            {
              "label": "Tool 1: partial exposure",
              "value": 5,
              "unit": "m/s²"
            },
            {
              "label": "Tool 1: trigger time to reach the action value on its own",
              "value": 0.5,
              "unit": "hours"
            },
            {
              "label": "Tool 1: trigger time to reach the limit value on its own",
              "value": 2,
              "unit": "hours"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Two tools each at the action value combine to 3.54, not 5 — exposures add in squares",
          "inputs": {
            "toolMagnitude1": 5,
            "toolHours1": 2,
            "toolMagnitude2": 5,
            "toolHours2": 2,
            "toolMagnitude3": 0,
            "toolHours3": 0,
            "toolMagnitude4": 0,
            "toolHours4": 0
          },
          "expected": 3.535534,
          "toleranceDecimalPlaces": 3,
          "unit": "m/s²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Exposure points (100 is the action value, 400 the limit value)",
              "value": 200,
              "unit": "points"
            },
            {
              "label": "Tool 1: partial exposure",
              "value": 2.5,
              "unit": "m/s²"
            },
            {
              "label": "Tool 2: partial exposure",
              "value": 2.5,
              "unit": "m/s²"
            },
            {
              "label": "Tool 1: trigger time to reach the action value on its own",
              "value": 2,
              "unit": "hours"
            },
            {
              "label": "Tool 2: trigger time to reach the action value on its own",
              "value": 2,
              "unit": "hours"
            },
            {
              "label": "Tool 1: trigger time to reach the limit value on its own",
              "value": 8,
              "unit": "hours"
            },
            {
              "label": "Tool 2: trigger time to reach the limit value on its own",
              "value": 8,
              "unit": "hours"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The defaults — 7 m/s² for half an hour and 4 m/s² for an hour — are 2.25 m/s², 81 points",
          "inputs": {
            "toolMagnitude1": 7,
            "toolHours1": 0.5,
            "toolMagnitude2": 4,
            "toolHours2": 1,
            "toolMagnitude3": 0,
            "toolHours3": 0,
            "toolMagnitude4": 0,
            "toolHours4": 0
          },
          "expected": 2.25,
          "toleranceDecimalPlaces": 3,
          "unit": "m/s²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Exposure points (100 is the action value, 400 the limit value)",
              "value": 81,
              "unit": "points"
            },
            {
              "label": "Tool 1: partial exposure",
              "value": 1.75,
              "unit": "m/s²"
            },
            {
              "label": "Tool 2: partial exposure",
              "value": 1.4142135623730951,
              "unit": "m/s²"
            },
            {
              "label": "Tool 1: trigger time to reach the action value on its own",
              "value": 1.0204081632653061,
              "unit": "hours"
            },
            {
              "label": "Tool 2: trigger time to reach the action value on its own",
              "value": 3.125,
              "unit": "hours"
            },
            {
              "label": "Tool 1: trigger time to reach the limit value on its own",
              "value": 4.081632653061225,
              "unit": "hours"
            },
            {
              "label": "Tool 2: trigger time to reach the limit value on its own",
              "value": 12.5,
              "unit": "hours"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "handrail-length-calculator",
      "title": "Handrail Length Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/handrail-length-calculator/",
      "sources": [
        "A staircase handrail follows the stringer's slope, so its length is the hypotenuse of the total rise and total run: length = sqrt(rise² + run²)",
        "10% waste is standard for a straight run to account for end cuts and post transitions",
        "Handrail stock is racked at 8, 10, 12 and 16 ft where stair parts are sold by the foot, and at 2.4, 3, 3.6 and 4.8 m where they are sold by the metre"
      ],
      "vectors": [
        {
          "name": "2.4m rise, 3.6m run, 8ft sticks",
          "inputs": {
            "totalRise": 2.4,
            "totalRun": 3.6,
            "stickLengthFt": 8,
            "wastePercent": 10
          },
          "expected": 15.615,
          "toleranceDecimalPlaces": 0.5,
          "unit": "linear ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Sloped rail length (before waste)",
              "value": 14.195083761669247,
              "unit": "linear ft"
            },
            {
              "label": "Sticks needed",
              "value": 2,
              "unit": "x 8 ft sticks"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "3m rise, 4.5m run, 12ft sticks",
          "inputs": {
            "totalRise": 3,
            "totalRun": 4.5,
            "stickLengthFt": 12,
            "wastePercent": 10
          },
          "expected": 19.518,
          "toleranceDecimalPlaces": 0.5,
          "unit": "linear ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Sloped rail length (before waste)",
              "value": 17.743854702086562,
              "unit": "linear ft"
            },
            {
              "label": "Sticks needed",
              "value": 2,
              "unit": "x 12 ft sticks"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "hardscape-area-calculator",
      "title": "Hardscape Area & Base Calculator",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/hardscape-area-calculator/",
      "sources": [
        "Sub-base depth: 100 mm compacted for pedestrian paving, 150-200 mm for vehicular — BS 7533 and ICPI guidance",
        "Bedding layer 25-40 mm of sharp sand, screeded and not compacted before laying — ICPI Tech Spec 2"
      ],
      "vectors": [
        {
          "name": "6 × 4 m patio at 10% waste",
          "inputs": {
            "length": 6,
            "width": 4,
            "use": "pedestrian",
            "beddingDepth": 0.03,
            "wastePercent": 10
          },
          "expected": 26.4,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Net paved area",
              "value": 24,
              "unit": "m²"
            },
            {
              "label": "Sub-base depth",
              "value": 100,
              "unit": "mm"
            },
            {
              "label": "Sub-base to order (loose)",
              "value": 3.0000000000000004,
              "unit": "m³"
            },
            {
              "label": "Sub-base weight",
              "value": 4800.000000000001,
              "unit": "kg"
            },
            {
              "label": "Bedding sand",
              "value": 0.72,
              "unit": "m³"
            },
            {
              "label": "Area in ft²",
              "value": 284.1672350011367,
              "unit": "ft²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "No cutting waste",
          "inputs": {
            "length": 6,
            "width": 4,
            "use": "pedestrian",
            "beddingDepth": 0.03,
            "wastePercent": 0
          },
          "expected": 24,
          "toleranceDecimalPlaces": 0,
          "unit": "m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Net paved area",
              "value": 24,
              "unit": "m²"
            },
            {
              "label": "Sub-base depth",
              "value": 100,
              "unit": "mm"
            },
            {
              "label": "Sub-base to order (loose)",
              "value": 3.0000000000000004,
              "unit": "m³"
            },
            {
              "label": "Sub-base weight",
              "value": 4800.000000000001,
              "unit": "kg"
            },
            {
              "label": "Bedding sand",
              "value": 0.72,
              "unit": "m³"
            },
            {
              "label": "Area in ft²",
              "value": 258.33385000103334,
              "unit": "ft²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A driveway is the same area",
          "inputs": {
            "length": 6,
            "width": 4,
            "use": "vehicular",
            "beddingDepth": 0.03,
            "wastePercent": 10
          },
          "expected": 26.4,
          "toleranceDecimalPlaces": 0,
          "unit": "m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Net paved area",
              "value": 24,
              "unit": "m²"
            },
            {
              "label": "Sub-base depth",
              "value": 200,
              "unit": "mm"
            },
            {
              "label": "Sub-base to order (loose)",
              "value": 6.000000000000001,
              "unit": "m³"
            },
            {
              "label": "Sub-base weight",
              "value": 9600.000000000002,
              "unit": "kg"
            },
            {
              "label": "Bedding sand",
              "value": 0.72,
              "unit": "m³"
            },
            {
              "label": "Area in ft²",
              "value": 284.1672350011367,
              "unit": "ft²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A larger patio scales linearly",
          "inputs": {
            "length": 12,
            "width": 4,
            "use": "pedestrian",
            "beddingDepth": 0.03,
            "wastePercent": 10
          },
          "expected": 52.8,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Net paved area",
              "value": 48,
              "unit": "m²"
            },
            {
              "label": "Sub-base depth",
              "value": 100,
              "unit": "mm"
            },
            {
              "label": "Sub-base to order (loose)",
              "value": 6.000000000000001,
              "unit": "m³"
            },
            {
              "label": "Sub-base weight",
              "value": 9600.000000000002,
              "unit": "kg"
            },
            {
              "label": "Bedding sand",
              "value": 1.44,
              "unit": "m³"
            },
            {
              "label": "Area in ft²",
              "value": 568.3344700022734,
              "unit": "ft²"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "hat-channel-anchor-spacing-calculator",
      "title": "Hat Channel (Metal Furring) Anchor Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/hat-channel-anchor-spacing-calculator/",
      "sources": [
        "Channel rows = ceil(perpendicular run ÷ channel spacing) + 1; anchors per channel = ceil(channel length ÷ anchor spacing) + 1; total anchors = rows × anchors per channel"
      ],
      "vectors": [
        {
          "name": "2.7m run, 0.6m channel spacing, 10m channel, 1.2m anchor spacing",
          "inputs": {
            "perpendicularRun": 2.7,
            "channelSpacing": 0.6,
            "channelLength": 10,
            "anchorSpacing": 1.2
          },
          "expected": 60,
          "toleranceDecimalPlaces": 0,
          "unit": "anchors",
          "confidence": "high",
          "steps": [
            {
              "label": "Channel rows",
              "value": 6
            },
            {
              "label": "Anchors per channel",
              "value": 10
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "3.0m run, 0.61m channel spacing, 8m channel, 1.0m anchor spacing",
          "inputs": {
            "perpendicularRun": 3,
            "channelSpacing": 0.61,
            "channelLength": 8,
            "anchorSpacing": 1
          },
          "expected": 54,
          "toleranceDecimalPlaces": 0,
          "unit": "anchors",
          "confidence": "high",
          "steps": [
            {
              "label": "Channel rows",
              "value": 6
            },
            {
              "label": "Anchors per channel",
              "value": 9
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "haul-cycle-time-calculator",
      "title": "Truck Haul Cycle Time Calculator",
      "url": "https://craftquantities.com/calculators/heavy-civil/haul-cycle-time-calculator/",
      "sources": [
        "Cycle time = load + haul + dump + return + queue. Production = payload ÷ cycle time × efficiency",
        "Match factor = (number of trucks × loader cycle time) ÷ truck cycle time; a factor of 1 balances the fleet against the loader"
      ],
      "vectors": [
        {
          "name": "3 km haul, 4 trucks, 12 m³ payload",
          "inputs": {
            "haulDistance": 3,
            "loadedSpeed": 30,
            "emptySpeed": 45,
            "loadTime": 3,
            "dumpTime": 1.5,
            "payload": 12000,
            "truckCount": 4,
            "efficiency": 50
          },
          "expected": 165.71,
          "toleranceDecimalPlaces": -1,
          "unit": "m³/hr",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cycle time per truck, free-flowing",
              "value": 14.5,
              "unit": "min"
            },
            {
              "label": "Loaded travel",
              "value": 6,
              "unit": "min"
            },
            {
              "label": "Return travel",
              "value": 4,
              "unit": "min"
            },
            {
              "label": "Match factor",
              "value": 0.8275862068965517,
              "unit": "×"
            },
            {
              "label": "Trips per truck per hour, free-flowing",
              "value": 4.137931034482759,
              "unit": "trips"
            },
            {
              "label": "Loader ceiling at 100% efficiency",
              "value": 240,
              "unit": "m³/hr"
            },
            {
              "label": "Trucks for a balanced fleet",
              "value": 4.833333333333333,
              "unit": "trucks"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "One truck produces a quarter as much",
          "inputs": {
            "haulDistance": 3,
            "loadedSpeed": 30,
            "emptySpeed": 45,
            "loadTime": 3,
            "dumpTime": 1.5,
            "payload": 12000,
            "truckCount": 1,
            "efficiency": 50
          },
          "expected": 41.43,
          "toleranceDecimalPlaces": 0,
          "unit": "m³/hr",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cycle time per truck, free-flowing",
              "value": 14.5,
              "unit": "min"
            },
            {
              "label": "Loaded travel",
              "value": 6,
              "unit": "min"
            },
            {
              "label": "Return travel",
              "value": 4,
              "unit": "min"
            },
            {
              "label": "Match factor",
              "value": 0.20689655172413793,
              "unit": "×"
            },
            {
              "label": "Trips per truck per hour, free-flowing",
              "value": 4.137931034482759,
              "unit": "trips"
            },
            {
              "label": "Loader ceiling at 100% efficiency",
              "value": 240,
              "unit": "m³/hr"
            },
            {
              "label": "Trucks for a balanced fleet",
              "value": 4.833333333333333,
              "unit": "trucks"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Adding trucks past the match factor hits the loader ceiling",
          "inputs": {
            "haulDistance": 3,
            "loadedSpeed": 30,
            "emptySpeed": 45,
            "loadTime": 3,
            "dumpTime": 1.5,
            "payload": 12000,
            "truckCount": 20,
            "efficiency": 50
          },
          "expected": 200,
          "toleranceDecimalPlaces": -1,
          "unit": "m³/hr",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cycle time per truck, free-flowing",
              "value": 14.5,
              "unit": "min"
            },
            {
              "label": "Loaded travel",
              "value": 6,
              "unit": "min"
            },
            {
              "label": "Return travel",
              "value": 4,
              "unit": "min"
            },
            {
              "label": "Match factor",
              "value": 4.137931034482759,
              "unit": "×"
            },
            {
              "label": "Trips per truck per hour, free-flowing",
              "value": 4.137931034482759,
              "unit": "trips"
            },
            {
              "label": "Loader ceiling at 100% efficiency",
              "value": 240,
              "unit": "m³/hr"
            },
            {
              "label": "Trucks for a balanced fleet",
              "value": 4.833333333333333,
              "unit": "trucks"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A longer haul lowers production",
          "inputs": {
            "haulDistance": 10,
            "loadedSpeed": 30,
            "emptySpeed": 45,
            "loadTime": 3,
            "dumpTime": 1.5,
            "payload": 12000,
            "truckCount": 4,
            "efficiency": 50
          },
          "expected": 63.4361,
          "toleranceDecimalPlaces": 2,
          "unit": "m³/hr",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cycle time per truck, free-flowing",
              "value": 37.83333333333333,
              "unit": "min"
            },
            {
              "label": "Loaded travel",
              "value": 20,
              "unit": "min"
            },
            {
              "label": "Return travel",
              "value": 13.333333333333332,
              "unit": "min"
            },
            {
              "label": "Match factor",
              "value": 0.31718061674008813,
              "unit": "×"
            },
            {
              "label": "Trips per truck per hour, free-flowing",
              "value": 1.5859030837004406,
              "unit": "trips"
            },
            {
              "label": "Loader ceiling at 100% efficiency",
              "value": 240,
              "unit": "m³/hr"
            },
            {
              "label": "Trucks for a balanced fleet",
              "value": 12.611111111111109,
              "unit": "trucks"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "hazen-williams-friction-loss-calculator",
      "title": "Domestic Water Pipe Friction Loss Calculator (Hazen-Williams)",
      "url": "https://craftquantities.com/calculators/materials-quantities/hazen-williams-friction-loss-calculator/",
      "sources": [
        "Hazen-Williams equation (SI units): hf = 10.67 × L × Q^1.852 ÷ (C^1.852 × D^4.8704), where L is pipe length (m), Q is flow rate (m³/s), C is the Hazen-Williams roughness coefficient, and D is the pipe's internal diameter (m)"
      ],
      "vectors": [
        {
          "name": "50m run, 5 L/s, C=150, 50mm dia",
          "inputs": {
            "pipeLength": 50,
            "flowRate": 300,
            "roughnessCoefficient": 150,
            "pipeDiameter": 0.05
          },
          "expected": 5.92,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "80m run, 8 L/s, C=140, 60mm dia",
          "inputs": {
            "pipeLength": 80,
            "flowRate": 480,
            "roughnessCoefficient": 140,
            "pipeDiameter": 0.06
          },
          "expected": 10.57,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "hearing-protection-attenuation-calculator",
      "title": "Hearing Protection Attenuation Calculator (SNR, HML, NRR)",
      "url": "https://craftquantities.com/calculators/sustainability-compliance/hearing-protection-attenuation-calculator/",
      "sources": [
        "BS EN ISO 4869-2 and HSE L108: with the SNR, the A-weighted level under the protector is LC − SNR; with the H, M and L values, the predicted noise level reduction is PNR = M − (H − M)(LC − LA − 2) ÷ 4 where LC − LA is 2 dB or less and PNR = M − (M − L)(LC − LA − 2) ÷ 8 where it is more, and the level at the ear is LA − PNR",
        "HSE L108 (Controlling noise at work): to allow for real-world factors, reduce the protection of any hearing protector by 4 dB; aim for a level at the ear between 70 and 80 dB(A), since protection taking it below 70 dB(A) over-protects and isolates the wearer",
        "29 CFR 1910.95, Appendix B: where the noise is measured A-weighted, subtract 7 dB from the NRR before deducting it, and where it is measured C-weighted, deduct the NRR directly; the OSHA Technical Manual, Section III, Chapter 5, derates the resulting attenuation by 50 per cent to allow for real-world fit"
      ],
      "vectors": [
        {
          "name": "SNR 30 in 100 dB(C), with HSE's 4 dB real-world allowance, leaves 74 dB(A) at the ear",
          "inputs": {
            "method": "snr",
            "laeq": 95,
            "lceq": 100,
            "snr": 30,
            "hValue": 32,
            "mValue": 24,
            "lValue": 17,
            "nrr": 29,
            "nrrWeighting": "a",
            "realWorld": "yes"
          },
          "expected": 74,
          "toleranceDecimalPlaces": 2,
          "unit": "dB(A)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Level the rating is deducted from",
              "value": 100,
              "unit": "dB(C)"
            },
            {
              "label": "Protection assumed",
              "value": 26,
              "unit": "dB"
            },
            {
              "label": "Real-world allowance taken off the rating",
              "value": 4,
              "unit": "dB"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "HML 32/24/17 with LC − LA of 3 dB — low-frequency noise, so M and L set a reduction of 23.1 dB",
          "inputs": {
            "method": "hml",
            "laeq": 95,
            "lceq": 98,
            "snr": 30,
            "hValue": 32,
            "mValue": 24,
            "lValue": 17,
            "nrr": 29,
            "nrrWeighting": "a",
            "realWorld": "yes"
          },
          "expected": 75.875,
          "toleranceDecimalPlaces": 2,
          "unit": "dB(A)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Level the rating is deducted from",
              "value": 95,
              "unit": "dB(A)"
            },
            {
              "label": "Protection assumed",
              "value": 19.125,
              "unit": "dB"
            },
            {
              "label": "Real-world allowance taken off the rating",
              "value": 4,
              "unit": "dB"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "HML with LC − LA of 1 dB — high-frequency noise, so H and M set a reduction of 26 dB",
          "inputs": {
            "method": "hml",
            "laeq": 95,
            "lceq": 96,
            "snr": 30,
            "hValue": 32,
            "mValue": 24,
            "lValue": 17,
            "nrr": 29,
            "nrrWeighting": "a",
            "realWorld": "yes"
          },
          "expected": 73,
          "toleranceDecimalPlaces": 2,
          "unit": "dB(A)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Level the rating is deducted from",
              "value": 95,
              "unit": "dB(A)"
            },
            {
              "label": "Protection assumed",
              "value": 22,
              "unit": "dB"
            },
            {
              "label": "Real-world allowance taken off the rating",
              "value": 4,
              "unit": "dB"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "NRR 29 against 100 dBA — reduced by 7, then halved — leaves 89 dBA",
          "inputs": {
            "method": "nrr",
            "laeq": 100,
            "lceq": 103,
            "snr": 30,
            "hValue": 32,
            "mValue": 24,
            "lValue": 17,
            "nrr": 29,
            "nrrWeighting": "a",
            "realWorld": "yes"
          },
          "expected": 89,
          "toleranceDecimalPlaces": 2,
          "unit": "dBA",
          "confidence": "medium",
          "steps": [
            {
              "label": "Level the rating is deducted from",
              "value": 100,
              "unit": "dBA"
            },
            {
              "label": "Protection assumed",
              "value": 11,
              "unit": "dB"
            },
            {
              "label": "Real-world allowance taken off the rating",
              "value": 11,
              "unit": "dB"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "NRR 29 against 100 dBC, as printed — the laboratory best case of 71",
          "inputs": {
            "method": "nrr",
            "laeq": 97,
            "lceq": 100,
            "snr": 30,
            "hValue": 32,
            "mValue": 24,
            "lValue": 17,
            "nrr": 29,
            "nrrWeighting": "c",
            "realWorld": "no"
          },
          "expected": 71,
          "toleranceDecimalPlaces": 2,
          "unit": "dBA",
          "confidence": "medium",
          "steps": [
            {
              "label": "Level the rating is deducted from",
              "value": 100,
              "unit": "dBC"
            },
            {
              "label": "Protection assumed",
              "value": 29,
              "unit": "dB"
            },
            {
              "label": "Real-world allowance taken off the rating",
              "value": 0,
              "unit": "dB"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "heat-pump-sizing-calculator",
      "title": "Heat Pump Sizing Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/heat-pump-sizing-calculator/",
      "sources": [
        "Heat pump capacity falls with outdoor temperature; manufacturers publish capacity tables at 47/17/5 °F (8/−8/−15 °C)",
        "ACCA Manual S — equipment selection against the calculated load, including balance-point analysis for heat pumps",
        "MCS 3005 (UK) requires sizing to the calculated design heat loss rather than to the existing boiler output"
      ],
      "vectors": [
        {
          "name": "8 kW load, 8 kW rated, −3 °C design, 2%/°C",
          "inputs": {
            "designHeatLossKw": 8000,
            "designOutdoorC": -3,
            "ratedCapacityKw": 8000,
            "capacityDeratePerDegree": 2
          },
          "expected": 8,
          "toleranceDecimalPlaces": 1,
          "unit": "kW at design",
          "confidence": "medium",
          "steps": [
            {
              "label": "Nameplate capacity at 7 °C",
              "value": 8,
              "unit": "kW"
            },
            {
              "label": "Capacity at the design temperature",
              "value": 6.4,
              "unit": "kW"
            },
            {
              "label": "Shortfall needing supplementary heat",
              "value": 1.5999999999999996,
              "unit": "kW"
            },
            {
              "label": "Balance point",
              "value": 0,
              "unit": "°C"
            },
            {
              "label": "Capacity retained at design",
              "value": 80,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A larger load reports a larger requirement",
          "inputs": {
            "designHeatLossKw": 12000,
            "designOutdoorC": -3,
            "ratedCapacityKw": 8000,
            "capacityDeratePerDegree": 2
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "kW at design",
          "confidence": "medium",
          "steps": [
            {
              "label": "Nameplate capacity at 7 °C",
              "value": 8,
              "unit": "kW"
            },
            {
              "label": "Capacity at the design temperature",
              "value": 6.4,
              "unit": "kW"
            },
            {
              "label": "Shortfall needing supplementary heat",
              "value": 5.6,
              "unit": "kW"
            },
            {
              "label": "Balance point",
              "value": 5,
              "unit": "°C"
            },
            {
              "label": "Capacity retained at design",
              "value": 80,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A colder design point",
          "inputs": {
            "designHeatLossKw": 8000,
            "designOutdoorC": -15,
            "ratedCapacityKw": 8000,
            "capacityDeratePerDegree": 2
          },
          "expected": 8,
          "toleranceDecimalPlaces": 1,
          "unit": "kW at design",
          "confidence": "medium",
          "steps": [
            {
              "label": "Nameplate capacity at 7 °C",
              "value": 8,
              "unit": "kW"
            },
            {
              "label": "Capacity at the design temperature",
              "value": 4.48,
              "unit": "kW"
            },
            {
              "label": "Shortfall needing supplementary heat",
              "value": 3.5199999999999996,
              "unit": "kW"
            },
            {
              "label": "Balance point",
              "value": -6,
              "unit": "°C"
            },
            {
              "label": "Capacity retained at design",
              "value": 56.00000000000001,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A small load",
          "inputs": {
            "designHeatLossKw": 4000,
            "designOutdoorC": -3,
            "ratedCapacityKw": 8000,
            "capacityDeratePerDegree": 2
          },
          "expected": 4,
          "toleranceDecimalPlaces": 1,
          "unit": "kW at design",
          "confidence": "medium",
          "steps": [
            {
              "label": "Nameplate capacity at 7 °C",
              "value": 8,
              "unit": "kW"
            },
            {
              "label": "Capacity at the design temperature",
              "value": 6.4,
              "unit": "kW"
            },
            {
              "label": "Shortfall needing supplementary heat",
              "value": 0,
              "unit": "kW"
            },
            {
              "label": "Balance point",
              "value": -10.5,
              "unit": "°C"
            },
            {
              "label": "Capacity retained at design",
              "value": 80,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "heat-trace-cable-calculator",
      "title": "Pipe Freeze Protection Heat Trace Cable Length Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/heat-trace-cable-calculator/",
      "sources": [
        "Total cable length = pipe length × (1 + fitting allowance) + valve count × extra cable per valve, accounting for the extra heat trace cable wrapped at valves and fittings beyond the base straight-run length"
      ],
      "vectors": [
        {
          "name": "50m pipe, 10% allowance, 3 valves",
          "inputs": {
            "pipeLength": 50,
            "fittingAllowancePercent": 10,
            "valveCount": 3,
            "extraPerValve": 0.5
          },
          "expected": 56.5,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "75m pipe, 10% allowance, 5 valves",
          "inputs": {
            "pipeLength": 75,
            "fittingAllowancePercent": 10,
            "valveCount": 5,
            "extraPerValve": 0.5
          },
          "expected": 85,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "heated-floor-mat-calculator",
      "title": "Heated Wire Floor Mat Coverage & Wattage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/heated-floor-mat-calculator/",
      "sources": [
        "Heated mat area = room area × usable coverage fraction (excluding areas under cabinets/fixtures where mats aren't installed); total wattage = mat area × the mat product's rated watts per m² (commonly ~150 W/m²)"
      ],
      "vectors": [
        {
          "name": "8m² room, 80% coverage, 150 W/m²",
          "inputs": {
            "roomArea": 8,
            "coveragePercent": 80,
            "wattsPerM2": 150
          },
          "expected": 960,
          "toleranceDecimalPlaces": 0,
          "unit": "W",
          "confidence": "medium",
          "steps": [
            {
              "label": "Heated mat area",
              "value": 6.4,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "12m² room, 75% coverage, 150 W/m²",
          "inputs": {
            "roomArea": 12,
            "coveragePercent": 75,
            "wattsPerM2": 150
          },
          "expected": 1350,
          "toleranceDecimalPlaces": 0,
          "unit": "W",
          "confidence": "medium",
          "steps": [
            {
              "label": "Heated mat area",
              "value": 9,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "heated-screed-volume-calculator",
      "title": "Heated Screed Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/heated-screed-volume-calculator/",
      "sources": [
        "Gross volume = floor area × (cover over the tube crown + tube outside diameter). Displaced volume = π/4 × diameter² × total tube length, with tube length taken as area ÷ tube centres. Net screed is the difference, before the waste allowance.",
        "BS 8204, Screeds, bases and in-situ floorings — the series covering screed thickness, strength and soundness over a heated build-up",
        "EN 1264, Water-based surface embedded heating and cooling systems — where the required cover over the tube comes from; take the figure from it or from the system supplier rather than assuming one here"
      ],
      "vectors": [
        {
          "name": "80 m² at 45 mm cover, 16 mm tube on 150 mm centres",
          "inputs": {
            "floorArea": 80,
            "coverDepth": 0.045,
            "tubeOuterDiameter": 0.016,
            "tubeCentres": 0.15,
            "screedDensity": 2100,
            "bagYield": 13,
            "wasteAllowance": 10
          },
          "expected": 5.25,
          "toleranceDecimalPlaces": 2,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Screed thickness over the substrate",
              "value": 61,
              "unit": "mm"
            },
            {
              "label": "Volume before the tube displacement is taken out",
              "value": 4.88,
              "unit": "m³"
            },
            {
              "label": "Volume displaced by the tube",
              "value": 0.10723302924253161,
              "unit": "m³"
            },
            {
              "label": "Length of tube in the floor",
              "value": 533.3333333333334,
              "unit": "m"
            },
            {
              "label": "Screed mass at the density entered",
              "value": 11.025091702449751,
              "unit": "tonnes"
            },
            {
              "label": "Bags to order",
              "value": 404,
              "unit": "bags"
            }
          ],
          "includesAllowance": {
            "label": "Substrate tolerance and waste allowance",
            "percent": 10
          },
          "basis": "ambiguous"
        },
        {
          "name": "120 m² at 50 mm cover, 20 mm tube on 200 mm centres, no waste",
          "inputs": {
            "floorArea": 120,
            "coverDepth": 0.05,
            "tubeOuterDiameter": 0.02,
            "tubeCentres": 0.2,
            "screedDensity": 2100,
            "bagYield": 13,
            "wasteAllowance": 0
          },
          "expected": 8.2115,
          "toleranceDecimalPlaces": 2,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Screed thickness over the substrate",
              "value": 70,
              "unit": "mm"
            },
            {
              "label": "Volume before the tube displacement is taken out",
              "value": 8.4,
              "unit": "m³"
            },
            {
              "label": "Volume displaced by the tube",
              "value": 0.18849555921538763,
              "unit": "m³"
            },
            {
              "label": "Length of tube in the floor",
              "value": 600,
              "unit": "m"
            },
            {
              "label": "Screed mass at the density entered",
              "value": 17.244159325647683,
              "unit": "tonnes"
            },
            {
              "label": "Bags to order",
              "value": 632,
              "unit": "bags"
            }
          ],
          "includesAllowance": {
            "label": "Substrate tolerance and waste allowance",
            "percent": 0
          },
          "basis": "ambiguous"
        },
        {
          "name": "Small bathroom zone, tight 100 mm centres",
          "inputs": {
            "floorArea": 30,
            "coverDepth": 0.065,
            "tubeOuterDiameter": 0.016,
            "tubeCentres": 0.1,
            "screedDensity": 2000,
            "bagYield": 13,
            "wasteAllowance": 5
          },
          "expected": 2.4882,
          "toleranceDecimalPlaces": 2,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Screed thickness over the substrate",
              "value": 81,
              "unit": "mm"
            },
            {
              "label": "Volume before the tube displacement is taken out",
              "value": 2.43,
              "unit": "m³"
            },
            {
              "label": "Volume displaced by the tube",
              "value": 0.060318578948924034,
              "unit": "m³"
            },
            {
              "label": "Length of tube in the floor",
              "value": 300,
              "unit": "m"
            },
            {
              "label": "Screed mass at the density entered",
              "value": 4.9763309842072605,
              "unit": "tonnes"
            },
            {
              "label": "Bags to order",
              "value": 192,
              "unit": "bags"
            }
          ],
          "includesAllowance": {
            "label": "Substrate tolerance and waste allowance",
            "percent": 5
          },
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "heating-circuit-flow-rate-calculator",
      "title": "Heating Circuit Flow Rate Calculator (Heat Output, ΔT and Pipe Velocity)",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/heating-circuit-flow-rate-calculator/",
      "sources": [
        "Heat carried by water: Q = ṁ × c × ΔT, so the flow is the heat output ÷ (4.186 kJ/kg·K × the design temperature drop), with a litre of water taken as a kilogram",
        "CIBSE Guide C, Reference data — the properties of water; BS EN 12828, Heating systems in buildings — Design for water-based heating systems",
        "Velocity in the pipe = the volume flow ÷ the bore's cross-sectional area, π × d² ÷ 4"
      ],
      "vectors": [
        {
          "name": "10 kW at a boiler's 20 K drop",
          "inputs": {
            "heatOutput": 10000,
            "deltaT": 20,
            "bore": 0.0136
          },
          "expected": 7.16675,
          "toleranceDecimalPlaces": 3,
          "unit": "L/min",
          "confidence": "high",
          "steps": [
            {
              "label": "The same flow in litres per second",
              "value": 0.11944577161968467,
              "unit": "L/s"
            },
            {
              "label": "Water velocity in the pipe",
              "value": 0.8222484854973375,
              "unit": "m/s"
            },
            {
              "label": "Mass of water per second",
              "value": 0.11944577161968467,
              "unit": "kg/s"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The same 10 kW at a heat pump's 5 K drop — four times the water",
          "inputs": {
            "heatOutput": 10000,
            "deltaT": 5,
            "bore": 0.0136
          },
          "expected": 28.66699,
          "toleranceDecimalPlaces": 3,
          "unit": "L/min",
          "confidence": "high",
          "steps": [
            {
              "label": "The same flow in litres per second",
              "value": 0.4777830864787387,
              "unit": "L/s"
            },
            {
              "label": "Water velocity in the pipe",
              "value": 3.28899394198935,
              "unit": "m/s"
            },
            {
              "label": "Mass of water per second",
              "value": 0.4777830864787387,
              "unit": "kg/s"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A 1.5 kW radiator at 20 K",
          "inputs": {
            "heatOutput": 1500,
            "deltaT": 20,
            "bore": 0.0136
          },
          "expected": 1.07501,
          "toleranceDecimalPlaces": 3,
          "unit": "L/min",
          "confidence": "high",
          "steps": [
            {
              "label": "The same flow in litres per second",
              "value": 0.0179168657429527,
              "unit": "L/s"
            },
            {
              "label": "Water velocity in the pipe",
              "value": 0.12333727282460061,
              "unit": "m/s"
            },
            {
              "label": "Mass of water per second",
              "value": 0.0179168657429527,
              "unit": "kg/s"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "hectares-to-acres-calculator",
      "title": "Hectares to Acres Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/hectares-to-acres-calculator/",
      "sources": [
        "1 hectare = 10,000 m^2 = 2.4710538147 acres"
      ],
      "vectors": [
        {
          "name": "5 ha converts correctly",
          "inputs": {
            "hectares": 5
          },
          "expected": 12.355269073499999,
          "toleranceDecimalPlaces": 6,
          "unit": "acres",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 2.4710538147,
              "unit": "acres per ha"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "hectares": 50
          },
          "expected": 123.552690735,
          "toleranceDecimalPlaces": 6,
          "unit": "acres",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 2.4710538147,
              "unit": "acres per ha"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "helical-anchor-pullout-calculator",
      "title": "Helical Screw Anchor Pull-Out Capacity Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/helical-anchor-pullout-calculator/",
      "sources": [
        "Torque correlation method (widely used across the helical pile/anchor industry): ultimate capacity Pu = Kt x T, where Kt is an empirical torque factor specific to the shaft geometry and T is the final installation torque"
      ],
      "vectors": [
        {
          "name": "5,000 ft-lb torque, Kt=7",
          "inputs": {
            "installationTorque": 5000,
            "torqueFactorKt": 7
          },
          "expected": 155.69,
          "toleranceDecimalPlaces": -1,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in lbs",
              "value": 35000,
              "unit": "lb"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "8,000 ft-lb torque, Kt=6",
          "inputs": {
            "installationTorque": 8000,
            "torqueFactorKt": 6
          },
          "expected": 213.51,
          "toleranceDecimalPlaces": -1,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in lbs",
              "value": 48000,
              "unit": "lb"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "hepa-filter-pressure-drop-calculator",
      "title": "HEPA Filter Bank Pressure Drop Estimator",
      "url": "https://craftquantities.com/calculators/materials-quantities/hepa-filter-pressure-drop-calculator/",
      "sources": [
        "Filter pressure drop is inherently manufacturer- and media-specific — there is no general industry formula analogous to a duct friction chart. This calculator interpolates between the filter manufacturer's rated clean (initial) pressure drop and its rated final (replacement) pressure drop, based on a user-estimated loading percentage: current ΔP = clean ΔP + (final ΔP − clean ΔP) × (loading % ÷ 100). Typical standard HEPA filters are commonly rated around 0.5-1.5 in. w.g. clean and roughly double that at final loading, but the specific filter's data sheet governs — these are not universal constants."
      ],
      "vectors": [
        {
          "name": "50% loaded, 1.0 to 2.0 in. w.g.",
          "inputs": {
            "cleanPressureDrop": 1,
            "finalPressureDrop": 2,
            "loadingPercent": 50
          },
          "expected": 1.5,
          "toleranceDecimalPlaces": 1,
          "unit": "in. w.g.",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "25% loaded, 0.8 to 1.8 in. w.g.",
          "inputs": {
            "cleanPressureDrop": 0.8,
            "finalPressureDrop": 1.8,
            "loadingPercent": 25
          },
          "expected": 1.05,
          "toleranceDecimalPlaces": 1,
          "unit": "in. w.g.",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "herringbone-pattern-waste-calculator",
      "title": "Herringbone/Chevron Pattern Flooring Waste Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/herringbone-pattern-waste-calculator/",
      "sources": [
        "Herringbone and chevron patterns require more angled cuts than a straight or standard diagonal layout, so they carry a higher typical waste allowance (commonly 15-20%) than either"
      ],
      "vectors": [
        {
          "name": "25m² floor, 20% waste",
          "inputs": {
            "floorArea": 25,
            "wastePercent": 20
          },
          "expected": 30,
          "toleranceDecimalPlaces": 0,
          "unit": "m²",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "35m² floor, 18% waste",
          "inputs": {
            "floorArea": 35,
            "wastePercent": 18
          },
          "expected": 41.3,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "hip-valley-rafter-cutlist-calculator",
      "title": "Hip/Valley Rafter Plumb Cut Angular Cutlist",
      "url": "https://craftquantities.com/calculators/materials-quantities/hip-valley-rafter-cutlist-calculator/",
      "sources": [
        "Standard carpentry hip/valley formula: for a 45° plan intersection, hip rafter length = common-rafter run × √(2 + (rise/12)²); plumb cut angle = arctan((rise/12)/√2)",
        "Compound cuts on an equal-pitch 45° hip: a side cut is arctan(cos θ) taken on that member's own pitch, and the backing bevel is arctan(sin θ) taken on the hip's — both reproduce the rafter tables printed on a framing square, which sets its hip figures out against 17 where the exact diagonal is 12√2 = 16.9706"
      ],
      "vectors": [
        {
          "name": "4m run, 6/12 pitch",
          "inputs": {
            "commonRafterRun": 4,
            "roofPitch": 6
          },
          "expected": 6,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Plumb cut angle, which is the hip's own inclination",
              "value": 19.47122063449069,
              "unit": "°"
            },
            {
              "label": "Cheek bevel, each side of the hip's ridge cut",
              "value": 43.31385665828305,
              "unit": "°"
            },
            {
              "label": "Backing bevel on the hip's top edge",
              "value": 18.43494882292201,
              "unit": "°"
            },
            {
              "label": "Drop, if the top is left square instead of backed",
              "value": null,
              "unit": "m"
            },
            {
              "label": "Jack rafter cheek bevel",
              "value": 41.810314895778596,
              "unit": "°"
            },
            {
              "label": "Jack rafters shorten by, each spacing",
              "value": null,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "5m run, 8/12 pitch",
          "inputs": {
            "commonRafterRun": 5,
            "roofPitch": 8
          },
          "expected": 7.817,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Plumb cut angle, which is the hip's own inclination",
              "value": 25.23940182067891,
              "unit": "°"
            },
            {
              "label": "Cheek bevel, each side of the hip's ridge cut",
              "value": 42.13041476136661,
              "unit": "°"
            },
            {
              "label": "Backing bevel on the hip's top edge",
              "value": 23.093469269798423,
              "unit": "°"
            },
            {
              "label": "Drop, if the top is left square instead of backed",
              "value": null,
              "unit": "m"
            },
            {
              "label": "Jack rafter cheek bevel",
              "value": 39.76215915180505,
              "unit": "°"
            },
            {
              "label": "Jack rafters shorten by, each spacing",
              "value": null,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "home-equity-loan-calculator",
      "title": "Home Equity Loan Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/home-equity-loan-calculator/",
      "sources": [
        "Combined loan-to-value limits of 80-85% are typical for home equity lending; the limit is a user input here because it varies by lender and market",
        "Repayment uses the standard amortisation formula"
      ],
      "vectors": [
        {
          "name": "400k value, 220k mortgage, 85% CLTV",
          "inputs": {
            "propertyValue": 400000,
            "mortgageBalance": 220000,
            "maxCltvPercent": 85,
            "annualRatePercent": 7,
            "years": 15
          },
          "expected": 120000,
          "toleranceDecimalPlaces": -4,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total equity in the property",
              "value": 180000,
              "unit": "currency"
            },
            {
              "label": "Maximum total borrowing at the stated CLTV",
              "value": 340000,
              "unit": "currency"
            },
            {
              "label": "Monthly payment if drawn in full",
              "value": 1078.5939250229098,
              "unit": "currency"
            },
            {
              "label": "Current loan-to-value",
              "value": 55.00000000000001,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A tighter 80% cap releases less",
          "inputs": {
            "propertyValue": 400000,
            "mortgageBalance": 220000,
            "maxCltvPercent": 80,
            "annualRatePercent": 7,
            "years": 15
          },
          "expected": 100000,
          "toleranceDecimalPlaces": -4,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total equity in the property",
              "value": 180000,
              "unit": "currency"
            },
            {
              "label": "Maximum total borrowing at the stated CLTV",
              "value": 320000,
              "unit": "currency"
            },
            {
              "label": "Monthly payment if drawn in full",
              "value": 898.8282708524249,
              "unit": "currency"
            },
            {
              "label": "Current loan-to-value",
              "value": 55.00000000000001,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Already above the cap releases nothing",
          "inputs": {
            "propertyValue": 400000,
            "mortgageBalance": 380000,
            "maxCltvPercent": 85,
            "annualRatePercent": 7,
            "years": 15
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total equity in the property",
              "value": 20000,
              "unit": "currency"
            },
            {
              "label": "Maximum total borrowing at the stated CLTV",
              "value": 340000,
              "unit": "currency"
            },
            {
              "label": "Monthly payment if drawn in full",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Current loan-to-value",
              "value": 95,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "No mortgage releases the full cap",
          "inputs": {
            "propertyValue": 400000,
            "mortgageBalance": 0,
            "maxCltvPercent": 85,
            "annualRatePercent": 7,
            "years": 15
          },
          "expected": 340000,
          "toleranceDecimalPlaces": -4,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total equity in the property",
              "value": 400000,
              "unit": "currency"
            },
            {
              "label": "Maximum total borrowing at the stated CLTV",
              "value": 340000,
              "unit": "currency"
            },
            {
              "label": "Monthly payment if drawn in full",
              "value": 3056.0161208982445,
              "unit": "currency"
            },
            {
              "label": "Current loan-to-value",
              "value": 0,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "home-extension-cost-calculator",
      "title": "Home Extension Cost Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/home-extension-cost-calculator/",
      "sources": [
        "Element-based build-up. Rates are user-supplied; no market data is embedded.",
        "Structural opening, party wall matters and making-good are extension-specific costs absent from new build"
      ],
      "vectors": [
        {
          "name": "30 m² extension fully built up",
          "inputs": {
            "extensionArea": 30,
            "buildRate": 2600,
            "structuralOpening": 6500,
            "makingGood": 4500,
            "professionalFees": 5500,
            "contingencyPercent": 15,
            "taxPercent": 0
          },
          "expected": 107850,
          "toleranceDecimalPlaces": -4,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Extension shell and fit-out",
              "value": 78000,
              "unit": "currency"
            },
            {
              "label": "Structural opening",
              "value": 6500,
              "unit": "currency"
            },
            {
              "label": "Making good the existing house",
              "value": 4500,
              "unit": "currency"
            },
            {
              "label": "Professional fees",
              "value": 5500,
              "unit": "currency"
            },
            {
              "label": "Contingency",
              "value": 13350,
              "unit": "currency"
            },
            {
              "label": "Tax",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "All-in cost per unit area",
              "value": 3595,
              "unit": "currency/m²"
            },
            {
              "label": "Non-shell share of the total",
              "value": 27.677329624478443,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "The shell alone",
          "inputs": {
            "extensionArea": 30,
            "buildRate": 2600,
            "structuralOpening": 0,
            "makingGood": 0,
            "professionalFees": 0,
            "contingencyPercent": 0,
            "taxPercent": 0
          },
          "expected": 78000,
          "toleranceDecimalPlaces": 2,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Extension shell and fit-out",
              "value": 78000,
              "unit": "currency"
            },
            {
              "label": "Structural opening",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Making good the existing house",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Professional fees",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Contingency",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Tax",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "All-in cost per unit area",
              "value": 2600,
              "unit": "currency/m²"
            },
            {
              "label": "Non-shell share of the total",
              "value": 0,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Tax on top",
          "inputs": {
            "extensionArea": 30,
            "buildRate": 2600,
            "structuralOpening": 6500,
            "makingGood": 4500,
            "professionalFees": 5500,
            "contingencyPercent": 15,
            "taxPercent": 20
          },
          "expected": 129420,
          "toleranceDecimalPlaces": -4,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Extension shell and fit-out",
              "value": 78000,
              "unit": "currency"
            },
            {
              "label": "Structural opening",
              "value": 6500,
              "unit": "currency"
            },
            {
              "label": "Making good the existing house",
              "value": 4500,
              "unit": "currency"
            },
            {
              "label": "Professional fees",
              "value": 5500,
              "unit": "currency"
            },
            {
              "label": "Contingency",
              "value": 13350,
              "unit": "currency"
            },
            {
              "label": "Tax",
              "value": 21570,
              "unit": "currency"
            },
            {
              "label": "All-in cost per unit area",
              "value": 4314,
              "unit": "currency/m²"
            },
            {
              "label": "Non-shell share of the total",
              "value": 39.7311080203987,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A larger extension",
          "inputs": {
            "extensionArea": 60,
            "buildRate": 2600,
            "structuralOpening": 6500,
            "makingGood": 4500,
            "professionalFees": 5500,
            "contingencyPercent": 15,
            "taxPercent": 0
          },
          "expected": 197550,
          "toleranceDecimalPlaces": -4,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Extension shell and fit-out",
              "value": 156000,
              "unit": "currency"
            },
            {
              "label": "Structural opening",
              "value": 6500,
              "unit": "currency"
            },
            {
              "label": "Making good the existing house",
              "value": 4500,
              "unit": "currency"
            },
            {
              "label": "Professional fees",
              "value": 5500,
              "unit": "currency"
            },
            {
              "label": "Contingency",
              "value": 25050,
              "unit": "currency"
            },
            {
              "label": "Tax",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "All-in cost per unit area",
              "value": 3292.5,
              "unit": "currency/m²"
            },
            {
              "label": "Non-shell share of the total",
              "value": 21.032649962034927,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "home-improvement-loan-payment-calculator",
      "title": "Home Improvement Loan Payment Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/home-improvement-loan-payment-calculator/",
      "sources": [
        "Standard fixed-rate loan amortization formula: M = P x r x (1+r)^n / ((1+r)^n - 1), where r is the monthly interest rate and n is the number of monthly payments"
      ],
      "vectors": [
        {
          "name": "$12,000, 0% APR, 1 year (promotional financing)",
          "inputs": {
            "loanAmount": 12000,
            "annualInterestRatePercent": 0,
            "loanTermYears": 1
          },
          "expected": 1000,
          "toleranceDecimalPlaces": 0,
          "unit": "currency/month",
          "confidence": "high",
          "steps": [
            {
              "label": "Total paid over loan term",
              "value": 12000,
              "unit": "$"
            },
            {
              "label": "Total interest paid",
              "value": 0,
              "unit": "$"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "$20,000, 8% APR, 5 years",
          "inputs": {
            "loanAmount": 20000,
            "annualInterestRatePercent": 8,
            "loanTermYears": 5
          },
          "expected": 405.5,
          "toleranceDecimalPlaces": -1,
          "unit": "currency/month",
          "confidence": "high",
          "steps": [
            {
              "label": "Total paid over loan term",
              "value": 24331.673146096626,
              "unit": "$"
            },
            {
              "label": "Total interest paid",
              "value": 4331.673146096626,
              "unit": "$"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "horizontal-cylinder-partial-fill-calculator",
      "title": "Horizontal Cylinder Tank Partial Fill Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/horizontal-cylinder-partial-fill-calculator/",
      "sources": [
        "The wetted cross-section of a horizontal cylinder is a circular segment, area r²·acos((r−h)/r) − (r−h)·√(2rh − h²). This is exact geometry rather than an approximation: it returns half the circle at half the diameter and the whole circle at full depth",
        "Two hemispherical heads together form one sphere, and a sphere filled to depth h contains πh²(3r − h)/3. A 2:1 elliptical dished head is half the depth of a hemisphere and contributes half the volume, which is the standard treatment for the common pressure-vessel head",
        "For fuel inventory, custody transfer or any regulated measurement, the governing figure comes from the tank's own calibrated STRAPPING TABLE rather than from geometry — a real tank is never exactly its drawing"
      ],
      "vectors": [
        {
          "name": "a 1.2 m tank, 2.5 m long, flat ends, one third of the way up",
          "inputs": {
            "tankDiameter": 1.2,
            "tankLength": 2.5,
            "liquidDepth": 0.4,
            "endType": "flat"
          },
          "expected": 217.95,
          "toleranceDecimalPlaces": 0,
          "unit": "gal",
          "confidence": "high",
          "steps": [
            {
              "label": "Tank capacity when full",
              "value": 746.9288810748875,
              "unit": "gal"
            },
            {
              "label": "Ullage — the empty space above",
              "value": 528.9814528402006,
              "unit": "gal"
            },
            {
              "label": "Depth as a proportion of the diameter",
              "value": 33.333333333333336,
              "unit": "%"
            },
            {
              "label": "Volume as a proportion of capacity",
              "value": 29.179140579092888,
              "unit": "%"
            },
            {
              "label": "In the cylindrical barrel",
              "value": 217.94742823468695,
              "unit": "gal"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "half depth really is half the volume, by symmetry",
          "inputs": {
            "tankDiameter": 1.2,
            "tankLength": 2.5,
            "liquidDepth": 0.6,
            "endType": "flat"
          },
          "expected": 373.46,
          "toleranceDecimalPlaces": 0,
          "unit": "gal",
          "confidence": "high",
          "steps": [
            {
              "label": "Tank capacity when full",
              "value": 746.9288810748875,
              "unit": "gal"
            },
            {
              "label": "Ullage — the empty space above",
              "value": 373.46444053744375,
              "unit": "gal"
            },
            {
              "label": "Depth as a proportion of the diameter",
              "value": 50,
              "unit": "%"
            },
            {
              "label": "Volume as a proportion of capacity",
              "value": 50,
              "unit": "%"
            },
            {
              "label": "In the cylindrical barrel",
              "value": 373.46444053744375,
              "unit": "gal"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "a tenth of the depth holds about a twentieth of the volume",
          "inputs": {
            "tankDiameter": 1.2,
            "tankLength": 2.5,
            "liquidDepth": 0.12,
            "endType": "flat"
          },
          "expected": 38.87,
          "toleranceDecimalPlaces": 0,
          "unit": "gal",
          "confidence": "high",
          "steps": [
            {
              "label": "Tank capacity when full",
              "value": 746.9288810748875,
              "unit": "gal"
            },
            {
              "label": "Ullage — the empty space above",
              "value": 708.0556999494082,
              "unit": "gal"
            },
            {
              "label": "Depth as a proportion of the diameter",
              "value": 10,
              "unit": "%"
            },
            {
              "label": "Volume as a proportion of capacity",
              "value": 5.204401933091389,
              "unit": "%"
            },
            {
              "label": "In the cylindrical barrel",
              "value": 38.87318112547933,
              "unit": "gal"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "hemispherical ends add a whole sphere of capacity",
          "inputs": {
            "tankDiameter": 1.2,
            "tankLength": 2.5,
            "liquidDepth": 0.6,
            "endType": "hemispherical"
          },
          "expected": 492.97,
          "toleranceDecimalPlaces": 0,
          "unit": "gal",
          "confidence": "high",
          "steps": [
            {
              "label": "Tank capacity when full",
              "value": 985.9461230188515,
              "unit": "gal"
            },
            {
              "label": "Ullage — the empty space above",
              "value": 492.97306150942575,
              "unit": "gal"
            },
            {
              "label": "Depth as a proportion of the diameter",
              "value": 50,
              "unit": "%"
            },
            {
              "label": "Volume as a proportion of capacity",
              "value": 50,
              "unit": "%"
            },
            {
              "label": "In the cylindrical barrel",
              "value": 373.46444053744375,
              "unit": "gal"
            },
            {
              "label": "In the two ends",
              "value": 119.50862097198198,
              "unit": "gal"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "house-wrap-calculator",
      "title": "House Wrap Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/house-wrap-calculator/",
      "sources": [
        "A standard house wrap roll (9 ft x 150 ft) covers approximately 1,350 sq ft, per common manufacturer roll sizes"
      ],
      "vectors": [
        {
          "name": "200m² wall area",
          "inputs": {
            "wallArea": 200
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Area to wrap (with overlap allowance)",
              "value": 2368.0602916761386,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "400m² wall area",
          "inputs": {
            "wallArea": 400
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Area to wrap (with overlap allowance)",
              "value": 4736.120583352277,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "250m² wall area with no lap allowance",
          "inputs": {
            "wallArea": 250,
            "overlapPercent": 0
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Area to wrap (with overlap allowance)",
              "value": 2690.9776041774303,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "hp-to-kw-calculator",
      "title": "Horsepower to kW Calculator",
      "url": "https://craftquantities.com/calculators/electrical/hp-to-kw-calculator/",
      "sources": [
        "Mechanical horsepower is defined as 550 ft-lbf/s = 745.699872 W exactly",
        "Metric horsepower (PS) differs at 735.49875 W and is not used here"
      ],
      "vectors": [
        {
          "name": "5 hp converts correctly",
          "inputs": {
            "horsepower": 5
          },
          "expected": 3.7284993579113515,
          "toleranceDecimalPlaces": 6,
          "unit": "kW",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.7456998715822702,
              "unit": "kW per hp"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "horsepower": 50
          },
          "expected": 37.28499357911351,
          "toleranceDecimalPlaces": 6,
          "unit": "kW",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.7456998715822702,
              "unit": "kW per hp"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "hss-composite-column-calculator",
      "title": "Concrete-Filled HSS Composite Column Capacity Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/hss-composite-column-calculator/",
      "sources": [
        "AISC 360 Chapter I (§I1.2a, §I2.2b): Pno = Fy×As + C2×f'c×Ac, where C2 = 0.85 for rectangular HSS and 0.95 for round HSS (confinement effect)"
      ],
      "vectors": [
        {
          "name": "Fy345, As5000, rect, f'c30, Ac40000",
          "inputs": {
            "steelYieldStrength": 345000000,
            "steelArea": 0.005,
            "shapeType": "0.85",
            "concreteStrength": 30000000,
            "concreteArea": 0.04
          },
          "expected": 2745,
          "toleranceDecimalPlaces": -1,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "phi_c x Pno (phi_c = 0.75, still before slenderness)",
              "value": 2058.75,
              "unit": "kN"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Fy345, As6000, round, f'c35, Ac60000",
          "inputs": {
            "steelYieldStrength": 345000000,
            "steelArea": 0.006,
            "shapeType": "0.95",
            "concreteStrength": 35000000,
            "concreteArea": 0.06
          },
          "expected": 4065,
          "toleranceDecimalPlaces": -1,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "phi_c x Pno (phi_c = 0.75, still before slenderness)",
              "value": 3048.75,
              "unit": "kN"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "hss-tube-weight-calculator",
      "title": "HSS (Square/Rectangular Tube) Weight Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/hss-tube-weight-calculator/",
      "sources": [
        "HSS cross-sectional area = outer area − inner area = (width × height) − ((width − 2×wall thickness) × (height − 2×wall thickness)); weight per unit length = area × steel density (7850 kg/m³)"
      ],
      "vectors": [
        {
          "name": "100x100x6 square HSS",
          "inputs": {
            "width": 0.1,
            "height": 0.1,
            "wallThickness": 0.006
          },
          "expected": 17.71,
          "toleranceDecimalPlaces": 2,
          "unit": "kg/m",
          "confidence": "high",
          "steps": [
            {
              "label": "Cross-sectional area",
              "value": 2256,
              "unit": "mm²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150x100x8 rectangular HSS",
          "inputs": {
            "width": 0.15,
            "height": 0.1,
            "wallThickness": 0.008
          },
          "expected": 29.39,
          "toleranceDecimalPlaces": 2,
          "unit": "kg/m",
          "confidence": "high",
          "steps": [
            {
              "label": "Cross-sectional area",
              "value": 3744,
              "unit": "mm²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "humidifier-capacity-calculator",
      "title": "Steam Humidifier Moisture Capacity Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/humidifier-capacity-calculator/",
      "sources": [
        "Moisture addition rate (lb/hr) = 4.5 × Airflow (CFM) × Humidity Ratio Change (grains of moisture per lb of dry air) ÷ 7,000, a standard simplified humidifier sizing formula derived from ASHRAE psychrometric relationships (7,000 grains = 1 lb) and widely used in commercial humidifier manufacturer sizing guides."
      ],
      "vectors": [
        {
          "name": "2,000 CFM, +30 grains/lb",
          "inputs": {
            "airflow": 943.8949,
            "humidityRatioChange": 30
          },
          "expected": 38.57,
          "toleranceDecimalPlaces": 1,
          "unit": "lb/hr",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "3,500 CFM, +25 grains/lb",
          "inputs": {
            "airflow": 1651.8161,
            "humidityRatioChange": 25
          },
          "expected": 56.25,
          "toleranceDecimalPlaces": 1,
          "unit": "lb/hr",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "hvac-condensate-drain-slope-calculator",
      "title": "HVAC Condensate Drain Pipe Slope Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/hvac-condensate-drain-slope-calculator/",
      "sources": [
        "Minimum condensate drain pipe slope of 1/8 inch per foot (≈1% grade) is the standard requirement referenced across the International Mechanical Code and manufacturer installation instructions for gravity-drained HVAC condensate lines, ensuring positive drainage to the termination point without standing water or biological growth."
      ],
      "vectors": [
        {
          "name": "20ft drain line at 1/8 in/ft",
          "inputs": {
            "drainLength": 6.096,
            "slopePerFoot": 0.125
          },
          "expected": 2.5,
          "toleranceDecimalPlaces": 1,
          "unit": "in",
          "confidence": "high",
          "steps": [
            {
              "label": "Drain line length",
              "value": 19.999999999999996,
              "unit": "ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "35ft drain line at 1/8 in/ft",
          "inputs": {
            "drainLength": 10.668,
            "slopePerFoot": 0.125
          },
          "expected": 4.375,
          "toleranceDecimalPlaces": 1,
          "unit": "in",
          "confidence": "high",
          "steps": [
            {
              "label": "Drain line length",
              "value": 34.99999999999999,
              "unit": "ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "hvac-duct-cfm-calculator",
      "title": "HVAC Duct Size Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/hvac-duct-cfm-calculator/",
      "sources": [
        "Standard duct sizing formula: cross-sectional area (sq ft) = CFM / velocity (ft/min); round duct diameter = sqrt(4 x area / pi)",
        "Common design velocity for residential supply ducts is roughly 700-900 ft/min; return ducts are often designed slightly lower"
      ],
      "vectors": [
        {
          "name": "400 CFM at 700 fpm",
          "inputs": {
            "cfm": 188.779,
            "targetVelocityFpm": 3.556
          },
          "expected": 10.236,
          "toleranceDecimalPlaces": 0.2,
          "unit": "in (round duct diameter)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Required cross-sectional area",
              "value": 0.5714286402013624,
              "unit": "sq ft"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "800 CFM at 900 fpm",
          "inputs": {
            "cfm": 377.558,
            "targetVelocityFpm": 4.572
          },
          "expected": 12.767,
          "toleranceDecimalPlaces": 0.2,
          "unit": "in (round duct diameter)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Required cross-sectional area",
              "value": 0.8888889958687859,
              "unit": "sq ft"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "hvac-equipment-pad-footprint-calculator",
      "title": "HVAC Equipment Pad/Curb Footprint Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/hvac-equipment-pad-footprint-calculator/",
      "sources": [
        "Pad/curb footprint = (Equipment Width + 2 × Clearance) × (Equipment Length + 2 × Clearance), applying the manufacturer's required service clearance evenly around the equipment's footprint — a standard equipment placement sizing method."
      ],
      "vectors": [
        {
          "name": "0.9m x 1.2m unit, 0.15m clearance",
          "inputs": {
            "equipmentWidth": 0.9,
            "equipmentLength": 1.2,
            "serviceClearance": 0.15
          },
          "expected": 1.8,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1.2m x 1.8m unit, 0.2m clearance",
          "inputs": {
            "equipmentWidth": 1.2,
            "equipmentLength": 1.8,
            "serviceClearance": 0.2
          },
          "expected": 3.52,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "hvac-thermal-load-calculator",
      "title": "HVAC Thermal Load (U-Value) Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/hvac-thermal-load-calculator/",
      "sources": [
        "Standard heat transmission formula: Q = U-value x surface area x temperature difference (ΔT), where U-value = 1 / R-value"
      ],
      "vectors": [
        {
          "name": "20m² wall, R13, 21°C indoor, -10°C outdoor",
          "inputs": {
            "surfaceArea": 20,
            "rValue": 13,
            "indoorTempC": 21,
            "outdoorTempC": -10
          },
          "expected": 923.9,
          "toleranceDecimalPlaces": -1,
          "unit": "BTU/hr",
          "confidence": "medium",
          "steps": [
            {
              "label": "U-value",
              "value": 0.07692307692307693,
              "unit": "BTU/hr·ft²·°F"
            },
            {
              "label": "Equivalent in watts",
              "value": 270.80948242233353,
              "unit": "W"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "10m² window, R2 (U-0.5), 21°C indoor, -5°C outdoor",
          "inputs": {
            "surfaceArea": 10,
            "rValue": 2,
            "indoorTempC": 21,
            "outdoorTempC": -5
          },
          "expected": 2518.8,
          "toleranceDecimalPlaces": -1,
          "unit": "BTU/hr",
          "confidence": "medium",
          "steps": [
            {
              "label": "U-value",
              "value": 0.5,
              "unit": "BTU/hr·ft²·°F"
            },
            {
              "label": "Equivalent in watts",
              "value": 738.1742343447478,
              "unit": "W"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "hydronic-expansion-tank-calculator",
      "title": "Hydronic Closed-Loop Expansion Tank Sizing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/hydronic-expansion-tank-calculator/",
      "sources": [
        "Simplified hydronic expansion tank sizing: required volume = system water volume × water expansion fraction (over the system's operating temperature range) ÷ tank acceptance factor, distinct from a domestic water heater's thermal expansion tank sizing since a hydronic system has a much larger water volume and different operating temperature range"
      ],
      "vectors": [
        {
          "name": "500L system, 4% expansion, 0.6 acceptance factor",
          "inputs": {
            "systemVolume": 500,
            "expansionFraction": 0.04,
            "acceptanceFactor": 0.6
          },
          "expected": 33.33,
          "toleranceDecimalPlaces": 1,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "800L system, 4.5% expansion, 0.6 acceptance factor",
          "inputs": {
            "systemVolume": 800,
            "expansionFraction": 0.045,
            "acceptanceFactor": 0.6
          },
          "expected": 60,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "i-joist-bearing-length-calculator",
      "title": "I-Joist Web Stiffener Bearing Length Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/i-joist-bearing-length-calculator/",
      "sources": [
        "Required bearing length = reaction load ÷ (allowable bearing stress × flange width); if the provided/actual bearing length is less than this, a web stiffener is typically required per the I-joist manufacturer's installation guide"
      ],
      "vectors": [
        {
          "name": "5000N reaction, 2.5MPa, 45mm flange",
          "inputs": {
            "reactionLoad": 5000,
            "allowableBearingStress": 2500000,
            "flangeWidth": 0.045
          },
          "expected": 44.44,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "8000N reaction, 3MPa, 57mm flange",
          "inputs": {
            "reactionLoad": 8000,
            "allowableBearingStress": 3000000,
            "flangeWidth": 0.057
          },
          "expected": 46.78,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "i-joist-minimum-depth-calculator",
      "title": "I-Joist Minimum Depth Selector",
      "url": "https://craftquantities.com/calculators/materials-quantities/i-joist-minimum-depth-calculator/",
      "sources": [
        "Rule-of-thumb residential floor joist span/depth ratio (~20:1) used as a preliminary sizing check; final I-joist selection must use the specific manufacturer's code-approved span table"
      ],
      "vectors": [
        {
          "name": "4m span, 20:1 ratio",
          "inputs": {
            "span": 4,
            "spanDepthRatio": 20
          },
          "expected": 7.87,
          "toleranceDecimalPlaces": 2,
          "unit": "in",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "5m span, 20:1 ratio",
          "inputs": {
            "span": 5,
            "spanDepthRatio": 20
          },
          "expected": 9.84,
          "toleranceDecimalPlaces": 2,
          "unit": "in",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "ice-water-shield-calculator",
      "title": "Ice & Water Shield Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/ice-water-shield-calculator/",
      "sources": [
        "A standard self-adhered ice & water shield roll (36 in wide) covers approximately 200 sq ft; area = eave length x membrane width"
      ],
      "vectors": [
        {
          "name": "15m eave, 36in coverage width",
          "inputs": {
            "eaveLength": 15,
            "shieldWidth": 0.914
          },
          "expected": 1,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "medium",
          "steps": [
            {
              "label": "Coverage area needed",
              "value": 162.3305329943993,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "40m eave, 36in coverage width",
          "inputs": {
            "eaveLength": 40,
            "shieldWidth": 0.914
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "medium",
          "steps": [
            {
              "label": "Coverage area needed",
              "value": 432.8814213183982,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "icf-block-count-calculator",
      "title": "Insulated Concrete Form (ICF) Block Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/icf-block-count-calculator/",
      "sources": [
        "Block count = ceil(wall area ÷ single block coverage area), the same coverage method used for CMU block, applied to the standard flat-wall ICF form size of 16 in × 48 in — 5.33 sq ft (0.4955 m²) of wall face per block"
      ],
      "vectors": [
        {
          "name": "60m² wall, 16x48in block (0.4955m²)",
          "inputs": {
            "wallArea": 60,
            "blockCoverage": 0.49548288
          },
          "expected": 122,
          "toleranceDecimalPlaces": 0,
          "unit": "blocks",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "85m² wall, 16x48in block (0.4955m²)",
          "inputs": {
            "wallArea": 85,
            "blockCoverage": 0.49548288
          },
          "expected": 172,
          "toleranceDecimalPlaces": 0,
          "unit": "blocks",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "igu-argon-fill-calculator",
      "title": "Insulated Glass Unit Argon Gas Fill Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/igu-argon-fill-calculator/",
      "sources": [
        "Argon fill volume = glass area × cavity gap thickness, the standard method for estimating inert gas fill volume in a sealed IGU cavity"
      ],
      "vectors": [
        {
          "name": "1.5m² glass, 12mm gap",
          "inputs": {
            "glassArea": 1.5,
            "gapThickness": 0.012
          },
          "expected": 18,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2.0m² glass, 16mm gap",
          "inputs": {
            "glassArea": 2,
            "gapThickness": 0.016
          },
          "expected": 32,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "igu-spacer-perimeter-calculator",
      "title": "Insulated Glass Unit (IGU) Spacer Bar Perimeter Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/igu-spacer-perimeter-calculator/",
      "sources": [
        "Total spacer bar length = unit perimeter (2×(width+height)) × number of units, the standard method for estimating IGU spacer bar material"
      ],
      "vectors": [
        {
          "name": "1.2m x 1.5m, 20 units",
          "inputs": {
            "unitWidth": 1.2,
            "unitHeight": 1.5,
            "unitCount": 20
          },
          "expected": 108,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Perimeter per unit",
              "value": 5.4,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1.0m x 1.8m, 15 units",
          "inputs": {
            "unitWidth": 1,
            "unitHeight": 1.8,
            "unitCount": 15
          },
          "expected": 84,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Perimeter per unit",
              "value": 5.6,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "igu-spacer-sizing-calculator",
      "title": "Insulated Glass Unit (IGU) Spacer Bar Sizing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/igu-spacer-sizing-calculator/",
      "sources": [
        "Spacer width = target overall IGU thickness − pane 1 thickness − pane 2 thickness, since the spacer bar occupies the remaining air/gas gap between the two panes"
      ],
      "vectors": [
        {
          "name": "24mm IGU, 4mm + 4mm panes",
          "inputs": {
            "targetThickness": 0.024,
            "pane1Thickness": 0.004,
            "pane2Thickness": 0.004
          },
          "expected": 16,
          "toleranceDecimalPlaces": 0,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Glass alone",
              "value": 8,
              "unit": "mm"
            },
            {
              "label": "Overall unit thickness targeted",
              "value": 24,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "28mm IGU, 6mm + 5mm panes",
          "inputs": {
            "targetThickness": 0.028,
            "pane1Thickness": 0.006,
            "pane2Thickness": 0.005
          },
          "expected": 17,
          "toleranceDecimalPlaces": 0,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Glass alone",
              "value": 11,
              "unit": "mm"
            },
            {
              "label": "Overall unit thickness targeted",
              "value": 28,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "imperial-gallons-to-liters-calculator",
      "title": "Imperial Gallons to Litres Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/imperial-gallons-to-liters-calculator/",
      "sources": [
        "Weights and Measures Act 1985 (UK): 1 imperial gallon = 4.54609 litres exactly",
        "NIST Handbook 44, Appendix C: 1 US liquid gallon = 231 in³ = 3.785411784 L exactly"
      ],
      "vectors": [
        {
          "name": "50 imp gal converts correctly",
          "inputs": {
            "imperialGallons": 50
          },
          "expected": 227.30450000000002,
          "toleranceDecimalPlaces": 6,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Same volume in US gallons",
              "value": 60.04749627524275,
              "unit": "US gal"
            },
            {
              "label": "Same volume in cubic metres",
              "value": 0.22730450000000002,
              "unit": "m³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "imperialGallons": 500
          },
          "expected": 2273.045,
          "toleranceDecimalPlaces": 6,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Same volume in US gallons",
              "value": 600.4749627524275,
              "unit": "US gal"
            },
            {
              "label": "Same volume in cubic metres",
              "value": 2.273045,
              "unit": "m³"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "inch-fraction-to-mm-calculator",
      "title": "Inch Fraction to Millimetres Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/inch-fraction-to-mm-calculator/",
      "sources": [
        "International yard and pound agreement (1959) — 1 inch = 25.4 mm exactly, adopted by NIST, BSI and Standards Australia"
      ],
      "vectors": [
        {
          "name": "3/4 in is 19.05 mm",
          "inputs": {
            "inches": 0.75
          },
          "expected": 19.05,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Inches entered",
              "value": 0.75,
              "unit": "in"
            },
            {
              "label": "Nearest sixteenth",
              "value": 0.75,
              "unit": "in"
            },
            {
              "label": "Centimetres",
              "value": 1.9049999999999998,
              "unit": "cm"
            },
            {
              "label": "Metres",
              "value": 0.019049999999999997,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1 in is exactly 25.4 mm",
          "inputs": {
            "inches": 1
          },
          "expected": 25.4,
          "toleranceDecimalPlaces": 1,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Inches entered",
              "value": 1,
              "unit": "in"
            },
            {
              "label": "Nearest sixteenth",
              "value": 1,
              "unit": "in"
            },
            {
              "label": "Centimetres",
              "value": 2.54,
              "unit": "cm"
            },
            {
              "label": "Metres",
              "value": 0.0254,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1/16 in is 1.5875 mm",
          "inputs": {
            "inches": 0.0625
          },
          "expected": 1.5875,
          "toleranceDecimalPlaces": 1,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Inches entered",
              "value": 0.0625,
              "unit": "in"
            },
            {
              "label": "Nearest sixteenth",
              "value": 0.0625,
              "unit": "in"
            },
            {
              "label": "Centimetres",
              "value": 0.15875,
              "unit": "cm"
            },
            {
              "label": "Metres",
              "value": 0.0015875,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "A 96 in sheet is 2438.4 mm",
          "inputs": {
            "inches": 96
          },
          "expected": 2438.4,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Inches entered",
              "value": 96,
              "unit": "in"
            },
            {
              "label": "Nearest sixteenth",
              "value": 96,
              "unit": "in"
            },
            {
              "label": "Centimetres",
              "value": 243.83999999999997,
              "unit": "cm"
            },
            {
              "label": "Metres",
              "value": 2.4383999999999997,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "inches-to-centimeters-calculator",
      "title": "Inches to Centimetres Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/inches-to-centimeters-calculator/",
      "sources": [
        "International yard and pound agreement (1959): 1 inch = 25.4 mm = 2.54 cm exactly"
      ],
      "vectors": [
        {
          "name": "36 in converts correctly",
          "inputs": {
            "inches": 36
          },
          "expected": 91.44,
          "toleranceDecimalPlaces": 6,
          "unit": "cm",
          "confidence": "high",
          "steps": [
            {
              "label": "Same length in millimetres",
              "value": 914.4,
              "unit": "mm"
            },
            {
              "label": "Same length in metres",
              "value": 0.9144,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "inches": 360
          },
          "expected": 914.4,
          "toleranceDecimalPlaces": 6,
          "unit": "cm",
          "confidence": "high",
          "steps": [
            {
              "label": "Same length in millimetres",
              "value": 9144,
              "unit": "mm"
            },
            {
              "label": "Same length in metres",
              "value": 9.144,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "inches-to-feet-calculator",
      "title": "Inches to Feet Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/inches-to-feet-calculator/",
      "sources": [
        "12 inches to the foot — NIST Handbook 44, Appendix C (units of length)",
        "International yard and pound agreement, 1959 — the inch is exactly 25.4 mm"
      ],
      "vectors": [
        {
          "name": "30 inches is 2.5 feet",
          "inputs": {
            "inches": 30
          },
          "expected": 2.5,
          "toleranceDecimalPlaces": 6,
          "unit": "ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Whole feet",
              "value": 2,
              "unit": "ft"
            },
            {
              "label": "Remaining inches",
              "value": 6,
              "unit": "in"
            },
            {
              "label": "Millimetres",
              "value": 762,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "12 inches is one foot",
          "inputs": {
            "inches": 12
          },
          "expected": 1,
          "toleranceDecimalPlaces": 8,
          "unit": "ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Whole feet",
              "value": 1,
              "unit": "ft"
            },
            {
              "label": "Remaining inches",
              "value": 0,
              "unit": "in"
            },
            {
              "label": "Millimetres",
              "value": 304.79999999999995,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "1 inch is 0.0833 feet",
          "inputs": {
            "inches": 1
          },
          "expected": 0.083333333,
          "toleranceDecimalPlaces": 7,
          "unit": "ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Whole feet",
              "value": 0,
              "unit": "ft"
            },
            {
              "label": "Remaining inches",
              "value": 1,
              "unit": "in"
            },
            {
              "label": "Millimetres",
              "value": 25.4,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "100 inches is 8.33 feet",
          "inputs": {
            "inches": 100
          },
          "expected": 8.3333333,
          "toleranceDecimalPlaces": 6,
          "unit": "ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Whole feet",
              "value": 8,
              "unit": "ft"
            },
            {
              "label": "Remaining inches",
              "value": 4,
              "unit": "in"
            },
            {
              "label": "Millimetres",
              "value": 2540,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "inches-to-millimeters-calculator",
      "title": "Inches to Millimetres Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/inches-to-millimeters-calculator/",
      "sources": [
        "International yard and pound agreement (1959): 1 inch = 25.4 mm exactly"
      ],
      "vectors": [
        {
          "name": "12 in converts correctly",
          "inputs": {
            "inches": 12
          },
          "expected": 304.79999999999995,
          "toleranceDecimalPlaces": 6,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 25.4,
              "unit": "mm per in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "inches": 120
          },
          "expected": 3048,
          "toleranceDecimalPlaces": 6,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 25.4,
              "unit": "mm per in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "infinite-slope-stability-calculator",
      "title": "Infinite Slope Stability Factor of Safety Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/infinite-slope-stability-calculator/",
      "sources": [
        "Infinite slope stability, dry cohesionless soil: FS = tan(φ) / tan(β), where φ is the soil's friction angle and β is the slope angle — the classic simplified case where slope length is much greater than the failure depth"
      ],
      "vectors": [
        {
          "name": "φ=32°, β=20° (pass)",
          "inputs": {
            "soilFrictionAngle": 32,
            "slopeAngle": 20
          },
          "expected": 1.717,
          "toleranceDecimalPlaces": 1,
          "unit": "(FS)",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "φ=28°, β=25° (marginal)",
          "inputs": {
            "soilFrictionAngle": 28,
            "slopeAngle": 25
          },
          "expected": 1.14,
          "toleranceDecimalPlaces": 1,
          "unit": "(FS)",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "insulation-batt-calculator",
      "title": "Insulation Batt Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/insulation-batt-calculator/",
      "sources": [
        "Batt/roll insulation coverage per package varies by R-value, thickness, and brand — always use the square footage printed on your specific product's packaging for an accurate count"
      ],
      "vectors": [
        {
          "name": "12x8 ft area, 100 sqft/package, 10% waste",
          "inputs": {
            "areaLength": 3.6576,
            "areaWidth": 2.4384,
            "coveragePerPackageSqft": 9.290304,
            "wasteFactorPercent": 10
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "packages",
          "confidence": "high",
          "steps": [
            {
              "label": "Area to insulate",
              "value": 96,
              "unit": "sq ft"
            },
            {
              "label": "Area with waste factor",
              "value": 105.60000000000001,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "20x15 ft area, 88.75 sqft/package, 10% waste",
          "inputs": {
            "areaLength": 6.096,
            "areaWidth": 4.572,
            "coveragePerPackageSqft": 8.245145,
            "wasteFactorPercent": 10
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "packages",
          "confidence": "high",
          "steps": [
            {
              "label": "Area to insulate",
              "value": 300,
              "unit": "sq ft"
            },
            {
              "label": "Area with waste factor",
              "value": 330,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "insulation-thickness-target-u-value-calculator",
      "title": "Insulation Thickness for a Target U-Value Calculator (BS EN ISO 6946)",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/insulation-thickness-target-u-value-calculator/",
      "sources": [
        "BS EN ISO 6946:2017, Building components and building elements — Thermal resistance and thermal transmittance: U = 1 ÷ (Rsi + ΣR + Rse), each layer's resistance its thickness ÷ λ; surface resistances in 6.8, a well-ventilated air layer in 6.9.4",
        "Surface resistances as tabulated for heat flow upwards 0.10, horizontal 0.13 and downwards 0.17 m²K/W, and 0.04 m²K/W outside (BS EN ISO 13788:2012 Table 2 and 4.4.1 carry the same values)",
        "Declared thermal conductivity λD from the product standards — BS EN 13165 (PIR and PUR), BS EN 13163 (EPS), BS EN 13162 (mineral wool)"
      ],
      "vectors": [
        {
          "name": "The sloping-ceiling guide: 0.18 target under a vented roof, 50 mm of PIR between the rafters",
          "inputs": {
            "targetU": 0.18,
            "heatFlow": "upward",
            "outerFace": "ventilated",
            "otherLayers": 2.272727272727273,
            "conductivity": 0.022,
            "boardThickness": 0
          },
          "expected": 67.8222,
          "toleranceDecimalPlaces": 3,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Total resistance the target asks for (1 ÷ U)",
              "value": 5.555555555555555,
              "unit": "m²K/W"
            },
            {
              "label": "Internal surface resistance",
              "value": 0.1,
              "unit": "m²K/W"
            },
            {
              "label": "External surface resistance",
              "value": 0.1,
              "unit": "m²K/W"
            },
            {
              "label": "The other layers",
              "value": 2.272727272727273,
              "unit": "m²K/W"
            },
            {
              "label": "Resistance the insulation has to supply",
              "value": 3.082828282828283,
              "unit": "m²K/W"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A wall at 0.18 with 0.5 m²K/W of other layers, PIR at 0.022",
          "inputs": {
            "targetU": 0.18,
            "heatFlow": "horizontal",
            "outerFace": "outside",
            "otherLayers": 0.5,
            "conductivity": 0.022,
            "boardThickness": 0
          },
          "expected": 107.4822,
          "toleranceDecimalPlaces": 3,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Total resistance the target asks for (1 ÷ U)",
              "value": 5.555555555555555,
              "unit": "m²K/W"
            },
            {
              "label": "Internal surface resistance",
              "value": 0.13,
              "unit": "m²K/W"
            },
            {
              "label": "External surface resistance",
              "value": 0.04,
              "unit": "m²K/W"
            },
            {
              "label": "The other layers",
              "value": 0.5,
              "unit": "m²K/W"
            },
            {
              "label": "Resistance the insulation has to supply",
              "value": 4.885555555555555,
              "unit": "m²K/W"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The same wall in EPS at 0.038 — the garage guide's 'roughly seventy per cent thicker'",
          "inputs": {
            "targetU": 0.18,
            "heatFlow": "horizontal",
            "outerFace": "outside",
            "otherLayers": 0.5,
            "conductivity": 0.038,
            "boardThickness": 0
          },
          "expected": 185.6511,
          "toleranceDecimalPlaces": 3,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Total resistance the target asks for (1 ÷ U)",
              "value": 5.555555555555555,
              "unit": "m²K/W"
            },
            {
              "label": "Internal surface resistance",
              "value": 0.13,
              "unit": "m²K/W"
            },
            {
              "label": "External surface resistance",
              "value": 0.04,
              "unit": "m²K/W"
            },
            {
              "label": "The other layers",
              "value": 0.5,
              "unit": "m²K/W"
            },
            {
              "label": "Resistance the insulation has to supply",
              "value": 4.885555555555555,
              "unit": "m²K/W"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "A floor over outside air: heat flows down, Rsi 0.17",
          "inputs": {
            "targetU": 0.18,
            "heatFlow": "downward",
            "outerFace": "outside",
            "otherLayers": 0.3,
            "conductivity": 0.032,
            "boardThickness": 0
          },
          "expected": 161.4578,
          "toleranceDecimalPlaces": 3,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Total resistance the target asks for (1 ÷ U)",
              "value": 5.555555555555555,
              "unit": "m²K/W"
            },
            {
              "label": "Internal surface resistance",
              "value": 0.17,
              "unit": "m²K/W"
            },
            {
              "label": "External surface resistance",
              "value": 0.04,
              "unit": "m²K/W"
            },
            {
              "label": "The other layers",
              "value": 0.3,
              "unit": "m²K/W"
            },
            {
              "label": "Resistance the insulation has to supply",
              "value": 5.045555555555556,
              "unit": "m²K/W"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A target the other layers already reach needs no insulation",
          "inputs": {
            "targetU": 1.5,
            "heatFlow": "horizontal",
            "outerFace": "outside",
            "otherLayers": 1,
            "conductivity": 0.022,
            "boardThickness": 0
          },
          "expected": 0,
          "toleranceDecimalPlaces": 3,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Total resistance the target asks for (1 ÷ U)",
              "value": 0.6666666666666666,
              "unit": "m²K/W"
            },
            {
              "label": "Internal surface resistance",
              "value": 0.13,
              "unit": "m²K/W"
            },
            {
              "label": "External surface resistance",
              "value": 0.04,
              "unit": "m²K/W"
            },
            {
              "label": "The other layers",
              "value": 1,
              "unit": "m²K/W"
            },
            {
              "label": "Resistance the insulation has to supply",
              "value": 0,
              "unit": "m²K/W"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "insurance-replacement-cost-calculator",
      "title": "Homeowners Insurance Replacement Cost Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/insurance-replacement-cost-calculator/",
      "sources": [
        "Replacement cost = conditioned floor area x local cost to rebuild per square foot"
      ],
      "vectors": [
        {
          "name": "150m² house, $150/sqft rebuild cost",
          "inputs": {
            "houseArea": 150,
            "rebuildCostPerSqft": 150
          },
          "expected": 242188.5,
          "toleranceDecimalPlaces": -1,
          "unit": "$ (estimated replacement cost)",
          "confidence": "low",
          "steps": [
            {
              "label": "House area",
              "value": 1614.5865625064582,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "200m² house, $180/sqft rebuild cost",
          "inputs": {
            "houseArea": 200,
            "rebuildCostPerSqft": 180
          },
          "expected": 387500.4,
          "toleranceDecimalPlaces": -1,
          "unit": "$ (estimated replacement cost)",
          "confidence": "low",
          "steps": [
            {
              "label": "House area",
              "value": 2152.782083341944,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "interim-payment-valuation-calculator",
      "title": "Interim Payment Valuation Calculator (Certificate Due)",
      "url": "https://craftquantities.com/calculators/financial-adjacent/interim-payment-valuation-calculator/",
      "sources": [
        "Standard forms of building contract (JCT, NEC, FIDIC and the AIA payment application) all value interim payments on the CUMULATIVE value of work properly executed to the valuation date, deduct retention from that cumulative figure, and then deduct the total previously certified — so an over- or under-measure in an earlier month self-corrects rather than compounding",
        "Retention is commonly deducted at 5% of the cumulative gross valuation, LIMITED to a total of 3% of the contract sum; once that limit is reached no further retention is withheld, however much work follows",
        "Materials and goods on site but not yet incorporated are payable in most standard forms where they are on site at the right time, adequately protected and reasonably brought there; title then passes TO the employer once the amount has been included in a certificate and paid. Materials stored OFF site are treated far more strictly and are commonly excluded entirely without a vesting agreement and a bond"
      ],
      "vectors": [
        {
          "name": "mid-job, retention still accruing below the cap",
          "inputs": {
            "contractSum": 900000,
            "workCompletedGross": 380000,
            "variationsAgreed": 24000,
            "materialsOnSite": 18000,
            "retentionPercent": 5,
            "retentionCapPercent": 3,
            "previouslyCertified": 300000,
            "contraCharges": 0
          },
          "expected": 100900,
          "toleranceDecimalPlaces": 0,
          "unit": "currency",
          "confidence": "high",
          "steps": [
            {
              "label": "Gross valuation to date",
              "value": 422000,
              "unit": "currency"
            },
            {
              "label": "Retention held",
              "value": 21100,
              "unit": "currency"
            },
            {
              "label": "Valuation less retention",
              "value": 400900,
              "unit": "currency"
            },
            {
              "label": "Less previously certified",
              "value": 300000,
              "unit": "currency"
            },
            {
              "label": "Less deductions",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Progress against the adjusted sum",
              "value": 45.67,
              "unit": "%"
            },
            {
              "label": "Net due, unrounded",
              "value": 100900,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "past the cap, where a flat 5% would under-value the certificate",
          "inputs": {
            "contractSum": 900000,
            "workCompletedGross": 700000,
            "variationsAgreed": 24000,
            "materialsOnSite": 0,
            "retentionPercent": 5,
            "retentionCapPercent": 3,
            "previouslyCertified": 400000,
            "contraCharges": 0
          },
          "expected": 297000,
          "toleranceDecimalPlaces": 0,
          "unit": "currency",
          "confidence": "high",
          "steps": [
            {
              "label": "Gross valuation to date",
              "value": 724000,
              "unit": "currency"
            },
            {
              "label": "Retention held",
              "value": 27000,
              "unit": "currency"
            },
            {
              "label": "Valuation less retention",
              "value": 697000,
              "unit": "currency"
            },
            {
              "label": "Less previously certified",
              "value": 400000,
              "unit": "currency"
            },
            {
              "label": "Less deductions",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Progress against the adjusted sum",
              "value": 78.35,
              "unit": "%"
            },
            {
              "label": "Net due, unrounded",
              "value": 297000,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "no retention limit in the contract",
          "inputs": {
            "contractSum": 900000,
            "workCompletedGross": 700000,
            "variationsAgreed": 24000,
            "materialsOnSite": 0,
            "retentionPercent": 5,
            "retentionCapPercent": 0,
            "previouslyCertified": 400000,
            "contraCharges": 0
          },
          "expected": 287800,
          "toleranceDecimalPlaces": 0,
          "unit": "currency",
          "confidence": "high",
          "steps": [
            {
              "label": "Gross valuation to date",
              "value": 724000,
              "unit": "currency"
            },
            {
              "label": "Retention held",
              "value": 36200,
              "unit": "currency"
            },
            {
              "label": "Valuation less retention",
              "value": 687800,
              "unit": "currency"
            },
            {
              "label": "Less previously certified",
              "value": 400000,
              "unit": "currency"
            },
            {
              "label": "Less deductions",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Progress against the adjusted sum",
              "value": 78.35,
              "unit": "%"
            },
            {
              "label": "Net due, unrounded",
              "value": 287800,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "an over-measure last month self-corrects into a negative certificate",
          "inputs": {
            "contractSum": 900000,
            "workCompletedGross": 300000,
            "variationsAgreed": 0,
            "materialsOnSite": 0,
            "retentionPercent": 5,
            "retentionCapPercent": 3,
            "previouslyCertified": 320000,
            "contraCharges": 0
          },
          "expected": -35000,
          "toleranceDecimalPlaces": 0,
          "unit": "currency",
          "confidence": "high",
          "steps": [
            {
              "label": "Gross valuation to date",
              "value": 300000,
              "unit": "currency"
            },
            {
              "label": "Retention held",
              "value": 15000,
              "unit": "currency"
            },
            {
              "label": "Valuation less retention",
              "value": 285000,
              "unit": "currency"
            },
            {
              "label": "Less previously certified",
              "value": 320000,
              "unit": "currency"
            },
            {
              "label": "Less deductions",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Progress against the adjusted sum",
              "value": 33.33,
              "unit": "%"
            },
            {
              "label": "Net due, unrounded",
              "value": -35000,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "intumescent-coating-volume-calculator",
      "title": "Intumescent Fireproof Coating Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/intumescent-coating-volume-calculator/",
      "sources": [
        "Wet film thickness = target dry film thickness ÷ product solids content; material volume = steel surface area × wet film thickness — the same wet/dry film relationship used for any solvent/water-based coating"
      ],
      "vectors": [
        {
          "name": "40m² steel, 25 mil DFT, 70% solids",
          "inputs": {
            "steelArea": 40,
            "targetDFT": 25,
            "solidsContent": 70
          },
          "expected": 36.29,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Required wet film thickness",
              "value": 35.714285714285715,
              "unit": "mils"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "60m² steel, 35 mil DFT, 65% solids",
          "inputs": {
            "steelArea": 60,
            "targetDFT": 35,
            "solidsContent": 65
          },
          "expected": 82.06,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Required wet film thickness",
              "value": 53.84615384615385,
              "unit": "mils"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "inverter-sizing-calculator",
      "title": "Solar Inverter Sizing Calculator",
      "url": "https://craftquantities.com/calculators/solar-energy/inverter-sizing-calculator/",
      "sources": [
        "DC-to-AC ratio (ILR) of 1.1-1.3 is standard practice; NREL SAM documentation and inverter manufacturers' design guides",
        "IEC 62109 and local wiring rules govern the electrical design; this sizes capacity only"
      ],
      "vectors": [
        {
          "name": "6 kW array at 1.2 ratio",
          "inputs": {
            "arrayWatts": 6000,
            "dcAcRatio": 1.2,
            "systemLossPercent": 14
          },
          "expected": 5000,
          "toleranceDecimalPlaces": 2,
          "unit": "W AC",
          "confidence": "medium",
          "steps": [
            {
              "label": "Inverter rating",
              "value": 5,
              "unit": "kW AC"
            },
            {
              "label": "Array DC rating",
              "value": 6,
              "unit": "kW DC"
            },
            {
              "label": "Realistic peak AC after losses",
              "value": 5.16,
              "unit": "kW"
            },
            {
              "label": "Headroom over realistic peak",
              "value": -3.10077519379845,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A 1:1 ratio matches the array",
          "inputs": {
            "arrayWatts": 6000,
            "dcAcRatio": 1,
            "systemLossPercent": 14
          },
          "expected": 6000,
          "toleranceDecimalPlaces": 2,
          "unit": "W AC",
          "confidence": "medium",
          "steps": [
            {
              "label": "Inverter rating",
              "value": 6,
              "unit": "kW AC"
            },
            {
              "label": "Array DC rating",
              "value": 6,
              "unit": "kW DC"
            },
            {
              "label": "Realistic peak AC after losses",
              "value": 5.16,
              "unit": "kW"
            },
            {
              "label": "Headroom over realistic peak",
              "value": 16.27906976744186,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A larger array scales the inverter",
          "inputs": {
            "arrayWatts": 12000,
            "dcAcRatio": 1.2,
            "systemLossPercent": 14
          },
          "expected": 10000,
          "toleranceDecimalPlaces": -3,
          "unit": "W AC",
          "confidence": "medium",
          "steps": [
            {
              "label": "Inverter rating",
              "value": 10,
              "unit": "kW AC"
            },
            {
              "label": "Array DC rating",
              "value": 12,
              "unit": "kW DC"
            },
            {
              "label": "Realistic peak AC after losses",
              "value": 10.32,
              "unit": "kW"
            },
            {
              "label": "Headroom over realistic peak",
              "value": -3.10077519379845,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A higher ratio needs a smaller inverter",
          "inputs": {
            "arrayWatts": 6000,
            "dcAcRatio": 1.5,
            "systemLossPercent": 14
          },
          "expected": 4000,
          "toleranceDecimalPlaces": 2,
          "unit": "W AC",
          "confidence": "medium",
          "steps": [
            {
              "label": "Inverter rating",
              "value": 4,
              "unit": "kW AC"
            },
            {
              "label": "Array DC rating",
              "value": 6,
              "unit": "kW DC"
            },
            {
              "label": "Realistic peak AC after losses",
              "value": 5.16,
              "unit": "kW"
            },
            {
              "label": "Headroom over realistic peak",
              "value": -22.48062015503876,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "irregular-area-offsets-coordinates-calculator",
      "title": "Irregular Area Calculator (Offsets and Coordinates)",
      "url": "https://craftquantities.com/calculators/measurements-conversions/irregular-area-offsets-coordinates-calculator/",
      "sources": [
        "Area by offsets from a straight baseline (Ghilani and Wolf, Elementary Surveying: An Introduction to Geomatics): trapezoidal rule A = d × (o1/2 + o2 + … + on−1 + on/2); Simpson's one-third rule A = (d/3) × (o1 + 4o2 + 2o3 + 4o4 + … + on) over an even number of intervals",
        "Area by coordinates, the shoelace formula: A = ½ × |Σ (xi × yi+1 − xi+1 × yi)| taken round the polygon in order (Ghilani and Wolf, Elementary Surveying)"
      ],
      "vectors": [
        {
          "name": "The plot guide's field by two offsets: 100 m and 60 m, 80 m apart",
          "inputs": {
            "measurement": "offsets",
            "rule": "trapezoidal",
            "interval": 80,
            "offsetCount": 2,
            "offset1": 100,
            "offset2": 60,
            "cornerCount": 4
          },
          "expected": 6400,
          "toleranceDecimalPlaces": 3,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Baseline length",
              "value": 80,
              "unit": "m"
            },
            {
              "label": "Area by the trapezoidal rule",
              "value": 6400,
              "unit": "m²"
            },
            {
              "label": "Area by Simpson's rule",
              "value": 6400,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The same field by its corners",
          "inputs": {
            "measurement": "coordinates",
            "rule": "trapezoidal",
            "interval": 2,
            "offsetCount": 2,
            "cornerCount": 4,
            "x1": 0,
            "y1": 0,
            "x2": 100,
            "y2": 0,
            "x3": 80,
            "y3": 80,
            "x4": 20,
            "y4": 80
          },
          "expected": 6400,
          "toleranceDecimalPlaces": 3,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Corners",
              "value": 4,
              "unit": "corners"
            },
            {
              "label": "Perimeter round the corners",
              "value": 324.9242250247064,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "The mulch guide's border: ten offsets at 2 m, trapezoidal",
          "inputs": {
            "measurement": "offsets",
            "rule": "trapezoidal",
            "interval": 2,
            "offsetCount": 10,
            "cornerCount": 4,
            "offset1": 0.6,
            "offset2": 1,
            "offset3": 1.4,
            "offset4": 1.8,
            "offset5": 2.5,
            "offset6": 2,
            "offset7": 1.5,
            "offset8": 1.1,
            "offset9": 0.9,
            "offset10": 0.7
          },
          "expected": 25.7,
          "toleranceDecimalPlaces": 3,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Baseline length",
              "value": 18,
              "unit": "m"
            },
            {
              "label": "Area by the trapezoidal rule",
              "value": 25.700000000000003,
              "unit": "m²"
            },
            {
              "label": "Area by Simpson's rule",
              "value": 25.53333333333333,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Seven offsets at 10 m by Simpson's rule",
          "inputs": {
            "measurement": "offsets",
            "rule": "simpson",
            "interval": 10,
            "offsetCount": 7,
            "cornerCount": 4,
            "offset1": 0,
            "offset2": 2.5,
            "offset3": 3.5,
            "offset4": 5,
            "offset5": 4.6,
            "offset6": 3.2,
            "offset7": 0
          },
          "expected": 196.6667,
          "toleranceDecimalPlaces": 3,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Baseline length",
              "value": 60,
              "unit": "m"
            },
            {
              "label": "Area by the trapezoidal rule",
              "value": 188,
              "unit": "m²"
            },
            {
              "label": "Area by Simpson's rule",
              "value": 196.66666666666669,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "An L-shaped plot by its six corners",
          "inputs": {
            "measurement": "coordinates",
            "rule": "trapezoidal",
            "interval": 2,
            "offsetCount": 2,
            "cornerCount": 6,
            "x1": 0,
            "y1": 0,
            "x2": 40,
            "y2": 0,
            "x3": 40,
            "y3": 20,
            "x4": 25,
            "y4": 20,
            "x5": 25,
            "y5": 35,
            "x6": 0,
            "y6": 35
          },
          "expected": 1175,
          "toleranceDecimalPlaces": 3,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Corners",
              "value": 6,
              "unit": "corners"
            },
            {
              "label": "Perimeter round the corners",
              "value": 150,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "irrigation-zone-calculator",
      "title": "Irrigation Zone Calculator",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/irrigation-zone-calculator/",
      "sources": [
        "Maximum heads per zone = available water flow ÷ flow rate per sprinkler head (both in the same flow unit)"
      ],
      "vectors": [
        {
          "name": "38 L/min (10 gal/min) available, 7.6 L/min heads",
          "inputs": {
            "availableFlow": 38,
            "headFlow": 7.6
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "heads per zone",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "60 L/min available, 10 L/min heads",
          "inputs": {
            "availableFlow": 60,
            "headFlow": 10
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "heads per zone",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "jersey-barrier-segment-calculator",
      "title": "Concrete Barrier (Jersey Barrier) Segment Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/jersey-barrier-segment-calculator/",
      "sources": [
        "Segment count = ceil(total run length ÷ standard segment length), the standard method for estimating precast Jersey barrier segments (commonly 3.05m/10ft each) along a run"
      ],
      "vectors": [
        {
          "name": "100m run, 3.05m segments",
          "inputs": {
            "totalLength": 100,
            "segmentLength": 3.05
          },
          "expected": 33,
          "toleranceDecimalPlaces": 0,
          "unit": "segments",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150m run, 3.05m segments",
          "inputs": {
            "totalLength": 150,
            "segmentLength": 3.05
          },
          "expected": 50,
          "toleranceDecimalPlaces": 0,
          "unit": "segments",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "kilograms-per-cubic-meter-to-pcf-calculator",
      "title": "kg/m³ to pcf Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/kilograms-per-cubic-meter-to-pcf-calculator/",
      "sources": [
        "1 lb = 0.45359237 kg exactly and 1 ft = 0.3048 m exactly (international yard and pound agreement, 1959), so 1 ft³ = 0.028316846592 m³ exactly and 1 lb/ft³ = 0.45359237 ÷ 0.028316846592 = 16.018463373960139… kg/m³. This page applies the reciprocal, 1 kg/m³ = 0.062427960576144612… lb/ft³. The ratio is fixed by definition, but its decimal expansion does not terminate — the value carried here is that exact ratio rounded, not a measured or approximate constant."
      ],
      "vectors": [
        {
          "name": "2400 kg/m³ converts correctly",
          "inputs": {
            "densityKgPerM3": 2400
          },
          "expected": 149.82710538237424,
          "toleranceDecimalPlaces": 6,
          "unit": "lb/ft³",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.06242796057598927,
              "unit": "lb/ft³ per kg/m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "densityKgPerM3": 24000
          },
          "expected": 1498.2710538237425,
          "toleranceDecimalPlaces": 6,
          "unit": "lb/ft³",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.06242796057598927,
              "unit": "lb/ft³ per kg/m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "kilograms-per-meter-to-pounds-per-foot-calculator",
      "title": "Kilograms per Metre to Pounds per Foot Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/kilograms-per-meter-to-pounds-per-foot-calculator/",
      "sources": [
        "Exact ratio. 1 lb = 0.45359237 kg and 1 ft = 0.3048 m, both by definition, so 1 kg/m = 0.3048 ÷ 0.45359237 lb/ft = 30480000/45359237. The fraction is exact; the decimal 0.671968975139506866… does not terminate, so the multiplier shown is that fraction rounded."
      ],
      "vectors": [
        {
          "name": "67 kg/m converts correctly",
          "inputs": {
            "kilogramsPerMetre": 67
          },
          "expected": 45.02192132132453,
          "toleranceDecimalPlaces": 6,
          "unit": "lb/ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.6719689749451422,
              "unit": "lb/ft per kg/m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "kilogramsPerMetre": 670
          },
          "expected": 450.21921321324527,
          "toleranceDecimalPlaces": 6,
          "unit": "lb/ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.6719689749451422,
              "unit": "lb/ft per kg/m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "kilograms-per-square-meter-to-pounds-per-square-foot-calculator",
      "title": "kg/m² to lb/ft² Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/kilograms-per-square-meter-to-pounds-per-square-foot-calculator/",
      "sources": [
        "One square foot is 0.09290304 m² and one pound is 0.45359237 kg, so a kilogram spread over a square metre is 0.20481614362252169277… lb/ft². The ratio is exact; the printed decimal is a truncation of it."
      ],
      "vectors": [
        {
          "name": "25 kg/m² converts correctly",
          "inputs": {
            "areaWeightKgPerM2": 25
          },
          "expected": 5.120403590964763,
          "toleranceDecimalPlaces": 6,
          "unit": "lb/ft²",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.20481614363859052,
              "unit": "lb/ft² per kg/m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "areaWeightKgPerM2": 250
          },
          "expected": 51.20403590964763,
          "toleranceDecimalPlaces": 6,
          "unit": "lb/ft²",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.20481614363859052,
              "unit": "lb/ft² per kg/m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "kilograms-to-pounds-calculator",
      "title": "Kilograms to Pounds Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/kilograms-to-pounds-calculator/",
      "sources": [
        "1 kg = 1 / 0.45359237 = 2.2046226218... lb"
      ],
      "vectors": [
        {
          "name": "50 kg converts correctly",
          "inputs": {
            "kilograms": 50
          },
          "expected": 110.23113109243879,
          "toleranceDecimalPlaces": 6,
          "unit": "lb",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 2.2046226218487757,
              "unit": "lb per kg"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "kilograms": 500
          },
          "expected": 1102.3113109243877,
          "toleranceDecimalPlaces": 6,
          "unit": "lb",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 2.2046226218487757,
              "unit": "lb per kg"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "kilometers-to-miles-calculator",
      "title": "Kilometres to Miles Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/kilometers-to-miles-calculator/",
      "sources": [
        "NIST SP 811, Appendix B — 1 km = 0.6213712 mile (international)",
        "International yard and pound agreement, 1959 — the foot is exactly 0.3048 m"
      ],
      "vectors": [
        {
          "name": "100 km is 62.14 miles",
          "inputs": {
            "kilometers": 100
          },
          "expected": 62.137119,
          "toleranceDecimalPlaces": 4,
          "unit": "mi",
          "confidence": "high",
          "steps": [
            {
              "label": "Kilometres entered",
              "value": 100,
              "unit": "km"
            },
            {
              "label": "Miles",
              "value": 62.13711922373339,
              "unit": "mi"
            },
            {
              "label": "Feet",
              "value": 328083.9895013123,
              "unit": "ft"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "1 km is 0.6214 miles",
          "inputs": {
            "kilometers": 1
          },
          "expected": 0.62137119,
          "toleranceDecimalPlaces": 6,
          "unit": "mi",
          "confidence": "high",
          "steps": [
            {
              "label": "Kilometres entered",
              "value": 1,
              "unit": "km"
            },
            {
              "label": "Miles",
              "value": 0.621371192237334,
              "unit": "mi"
            },
            {
              "label": "Feet",
              "value": 3280.839895013123,
              "unit": "ft"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "42.195 km is 26.22 miles",
          "inputs": {
            "kilometers": 42.195
          },
          "expected": 26.218757,
          "toleranceDecimalPlaces": 4,
          "unit": "mi",
          "confidence": "high",
          "steps": [
            {
              "label": "Kilometres entered",
              "value": 42.195,
              "unit": "km"
            },
            {
              "label": "Miles",
              "value": 26.218757456454306,
              "unit": "mi"
            },
            {
              "label": "Feet",
              "value": 138435.03937007874,
              "unit": "ft"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "5 km is 3.107 miles",
          "inputs": {
            "kilometers": 5
          },
          "expected": 3.106856,
          "toleranceDecimalPlaces": 5,
          "unit": "mi",
          "confidence": "high",
          "steps": [
            {
              "label": "Kilometres entered",
              "value": 5,
              "unit": "km"
            },
            {
              "label": "Miles",
              "value": 3.1068559611866697,
              "unit": "mi"
            },
            {
              "label": "Feet",
              "value": 16404.199475065616,
              "unit": "ft"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "king-post-truss-calculator",
      "title": "King Post Truss Member Length Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/king-post-truss-calculator/",
      "sources": [
        "King post truss geometry: top chord length = half-span × √(1+(pitch/12)²); king post (vertical) length equals the ridge rise = half-span × (pitch/12)"
      ],
      "vectors": [
        {
          "name": "8m span, 6/12 pitch",
          "inputs": {
            "span": 8,
            "roofPitch": 6
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Top chord length (each side)",
              "value": 4.47213595499958,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "10m span, 8/12 pitch",
          "inputs": {
            "span": 10,
            "roofPitch": 8
          },
          "expected": 3.333,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Top chord length (each side)",
              "value": 6.009252125773315,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "kips-to-kn-calculator",
      "title": "Kips to kN Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/kips-to-kn-calculator/",
      "sources": [
        "1 kip = 1,000 lbf = 4448.2216152605 N exactly, from the avoirdupois pound (0.45359237 kg) and standard gravity (9.80665 m/s²)"
      ],
      "vectors": [
        {
          "name": "22.5 kip converts correctly",
          "inputs": {
            "kips": 22.5
          },
          "expected": 100.08498634336124,
          "toleranceDecimalPlaces": 6,
          "unit": "kN",
          "confidence": "high",
          "steps": [
            {
              "label": "Same load in pounds-force",
              "value": 22500,
              "unit": "lbf"
            },
            {
              "label": "Mass that would weigh this under gravity",
              "value": 10205.828325,
              "unit": "kg"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "kips": 225
          },
          "expected": 1000.8498634336124,
          "toleranceDecimalPlaces": 6,
          "unit": "kN",
          "confidence": "high",
          "steps": [
            {
              "label": "Same load in pounds-force",
              "value": 225000,
              "unit": "lbf"
            },
            {
              "label": "Mass that would weigh this under gravity",
              "value": 102058.28325,
              "unit": "kg"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "kitchen-hood-exhaust-cfm-calculator",
      "title": "Commercial Kitchen Ventilation Hood Exhaust CFM Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/kitchen-hood-exhaust-cfm-calculator/",
      "sources": [
        "CFM = hood length (linear ft) x CFM-per-linear-foot rate, selected by hood style and cooking-duty classification, per International Mechanical Code (IMC) Table 507.5 (the code-minimum method for unlisted/field-fabricated Type I hoods; NFPA 96 references the same duty classifications). Listed hoods tested per UL 710 may use lower manufacturer-published rates instead — this table is the code-minimum for unlisted hood construction. When a hood covers mixed-duty appliances, code requires using the rate for the heaviest-duty appliance under the entire hood length."
      ],
      "vectors": [
        {
          "name": "8ft wall canopy hood, medium duty",
          "inputs": {
            "hoodLength": 2.4384,
            "hoodStyle": "wall-canopy",
            "dutyLevel": "medium"
          },
          "expected": 2400,
          "toleranceDecimalPlaces": -1,
          "unit": "CFM",
          "confidence": "high",
          "steps": [
            {
              "label": "Hood length in feet",
              "value": 7.999999999999999,
              "unit": "ft"
            },
            {
              "label": "CFM per linear foot rate used",
              "value": 300,
              "unit": "CFM/ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "10ft wall canopy hood, heavy duty",
          "inputs": {
            "hoodLength": 3.048,
            "hoodStyle": "wall-canopy",
            "dutyLevel": "heavy"
          },
          "expected": 4000,
          "toleranceDecimalPlaces": -1,
          "unit": "CFM",
          "confidence": "high",
          "steps": [
            {
              "label": "Hood length in feet",
              "value": 9.999999999999998,
              "unit": "ft"
            },
            {
              "label": "CFM per linear foot rate used",
              "value": 400,
              "unit": "CFM/ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "kitchen-remodel-cost-calculator",
      "title": "Kitchen Remodel Cost Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/kitchen-remodel-cost-calculator/",
      "sources": [
        "Element-based estimating; rates are user-supplied. No market data is embedded.",
        "Cabinetry is priced per linear metre of run; worktop per square metre; services per point"
      ],
      "vectors": [
        {
          "name": "A fully priced mid-range kitchen",
          "inputs": {
            "baseRunLength": 6,
            "baseRunRate": 650,
            "wallRunLength": 4,
            "wallRunRate": 380,
            "worktopArea": 4.5,
            "worktopRate": 420,
            "applianceAllowance": 3500,
            "servicesAllowance": 2800,
            "finishesAllowance": 2200,
            "contingencyPercent": 15
          },
          "expected": 18181.5,
          "toleranceDecimalPlaces": 2,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cabinetry",
              "value": 5420,
              "unit": "currency"
            },
            {
              "label": "Worktop",
              "value": 1890,
              "unit": "currency"
            },
            {
              "label": "Appliances",
              "value": 3500,
              "unit": "currency"
            },
            {
              "label": "Services behind the walls",
              "value": 2800,
              "unit": "currency"
            },
            {
              "label": "Finishes",
              "value": 2200,
              "unit": "currency"
            },
            {
              "label": "Contingency",
              "value": 2371.5,
              "unit": "currency"
            },
            {
              "label": "Cabinetry share of the total",
              "value": 29.81052168412947,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Cabinetry only",
          "inputs": {
            "baseRunLength": 6,
            "baseRunRate": 650,
            "wallRunLength": 4,
            "wallRunRate": 380,
            "worktopArea": 0,
            "worktopRate": 420,
            "applianceAllowance": 0,
            "servicesAllowance": 0,
            "finishesAllowance": 0,
            "contingencyPercent": 0
          },
          "expected": 5420,
          "toleranceDecimalPlaces": 2,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cabinetry",
              "value": 5420,
              "unit": "currency"
            },
            {
              "label": "Worktop",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Appliances",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Services behind the walls",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Finishes",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Contingency",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Cabinetry share of the total",
              "value": 100,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Zero rates give zero",
          "inputs": {
            "baseRunLength": 6,
            "baseRunRate": 0,
            "wallRunLength": 4,
            "wallRunRate": 0,
            "worktopArea": 4.5,
            "worktopRate": 0,
            "applianceAllowance": 0,
            "servicesAllowance": 0,
            "finishesAllowance": 0,
            "contingencyPercent": 15
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cabinetry",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Worktop",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Appliances",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Services behind the walls",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Finishes",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Contingency",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Cabinetry share of the total",
              "value": 0,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A longer run costs proportionally more",
          "inputs": {
            "baseRunLength": 12,
            "baseRunRate": 650,
            "wallRunLength": 4,
            "wallRunRate": 380,
            "worktopArea": 0,
            "worktopRate": 420,
            "applianceAllowance": 0,
            "servicesAllowance": 0,
            "finishesAllowance": 0,
            "contingencyPercent": 0
          },
          "expected": 9320,
          "toleranceDecimalPlaces": 2,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cabinetry",
              "value": 9320,
              "unit": "currency"
            },
            {
              "label": "Worktop",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Appliances",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Services behind the walls",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Finishes",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Contingency",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Cabinetry share of the total",
              "value": 100,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "kitchen-unit-run-calculator",
      "title": "Kitchen Unit and Cabinet Run Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/kitchen-unit-run-calculator/",
      "sources": [
        "CATAS, UNI EN 1116:2018 Coordinating sizes for kitchen furniture and kitchen appliances (A. Giavon, 2018), summarising the standard: worktop heights of 850, 900 and 950 mm, a worktop depth of at least 600 mm, wall units between 310 and 400 mm deep, at least 450 mm between the worktop and the underside of a wall unit, a plinth at least 80 mm high, and nominal unit widths of 400, 500, 600 and 900 mm for appliance housings. It co-ordinates sizes; it does not publish a ladder of unit widths",
        "Howdens, Kitchen installation manual, Guide - hints and tips and Cabinet overview: Hi-Line base units and full height wall units in 200, 300, 350, 400, 450, 500, 600, 700, 800, 900 and 1000 mm widths; installation starts in a corner and works out along the walls; plinths, pelmets and cornice are fitted at the end",
        "Cabinet Corp, Standard Cabinet Sizes and Dimensions Guide: US base and wall cabinets from 9 to 48 in wide in 3 in increments; base cabinets 34.5 in high; wall cabinets most commonly 12 in deep; filler cabinets in 3, 6 and 9 in widths",
        "American Woodmark, Simply Woodmark PRO Specification Guide (February 2025): base cabinets built with an inset toe kick; toe kick 4 in high and 94 in long; crown mouldings 94 in long; 3 in and 6 in fillers; at least a 1 in filler between the hinged side of a full overlay door and a wall, an appliance or a deeper cabinet",
        "DIY Kitchens, How to calculate plinth, cornice and pelmet requirements: plinth = the widths of the base units, tall units and integrated appliances plus a nominal 600 mm for each return, in 2600, 2750 or 3000 mm lengths; cornice = the widths of the wall units, tall units and dressers, and pelmet = the widths of the wall units, each plus 400 mm for each return, in 2700 or 3000 mm lengths; the total divided by the length and rounded up",
        "Wren Kitchens, Installation guides: four adjustable legs on cabinets up to 600 mm wide, with 800, 900 and 1000 mm cabinets given a number of their own and eight legs under a 972 mm L-shaped corner cabinet; a 150 mm plinth line; one continuous plinth fitted below the run once the base cabinets are level",
        "Screwfix, kitchen worktops by length: 600 × 38 mm laminate worktops listed in 3000 mm and 3600 mm lengths",
        "B&Q, 38 mm laminate kitchen worktop, 4100 × 600 mm",
        "Hunker, How to install post-form laminate countertops: post-form counters come in 8, 10 and 12 ft lengths (citing Norfolk Kitchen and Bath); corners are mitred at 45 degrees and drawn together with miter bolts",
        "Units: as many of the main width as fit, then at most two other standard widths to bring the leftover within the maximum filler. Worktop: at a butt joint the later run a worktop depth shorter, at a mitre each run its full wall length; each run in pieces of no more than the stock length less the allowance, joints at each full length, end pieces packed longest first, no two mitred pieces in one length. Plinth, cornice and pelmet: run plus returns, divided by the stock length, rounded up."
      ],
      "vectors": [
        {
          "name": "An 11 ft run with a 24 in integrated dishwasher, 24 in cabinets",
          "inputs": {
            "layout": "separate",
            "run1Length": 3.3528,
            "run2Length": 0,
            "run3Length": 0,
            "integratedSpaces": 0.6096,
            "freestandingSpaces": 0,
            "wall1Length": 2.7432,
            "wall2Length": 0,
            "wall3Length": 0,
            "mainWidth": "standard",
            "maxFiller": 0.1524,
            "baseDepth": 0.6096,
            "wallDepth": 0.3302,
            "openBaseEnds": 0,
            "openWallEnds": 2,
            "worktopStock": "long",
            "worktopAllowance": 0.01905,
            "trimStock": "standard",
            "trimStockLength": 2.7432,
            "support": "market",
            "cornerJoint": "market",
            "run1UnitsBefore": 0,
            "wall1UnitsBefore": 0,
            "headline": "base"
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "units",
          "confidence": "high",
          "steps": [
            {
              "label": "Base units",
              "value": 5,
              "unit": "units"
            },
            {
              "label": "24 in base units",
              "value": 4,
              "unit": "units"
            },
            {
              "label": "12 in base units",
              "value": 1,
              "unit": "units"
            },
            {
              "label": "Base fillers, one for each stretch left short",
              "value": 0,
              "unit": "fillers"
            },
            {
              "label": "Wall units",
              "value": 5,
              "unit": "units"
            },
            {
              "label": "24 in wall units",
              "value": 4,
              "unit": "units"
            },
            {
              "label": "12 in wall units",
              "value": 1,
              "unit": "units"
            },
            {
              "label": "Wall fillers, one for each stretch left short",
              "value": 0,
              "unit": "fillers"
            },
            {
              "label": "Worktop to cover, corners counted once",
              "value": 3.3528,
              "unit": "m"
            },
            {
              "label": "Worktop stock length",
              "value": 3.6576000000000004,
              "unit": "m"
            },
            {
              "label": "Worktop lengths to buy",
              "value": 1,
              "unit": "lengths"
            },
            {
              "label": "Worktop joints at corners",
              "value": 0,
              "unit": "joints"
            },
            {
              "label": "Worktop joints within a run",
              "value": 0,
              "unit": "joints"
            },
            {
              "label": "Plinth (toe kick), returns included",
              "value": 3.3528,
              "unit": "m"
            },
            {
              "label": "Plinth lengths to buy",
              "value": 2,
              "unit": "lengths"
            },
            {
              "label": "Cornice, and the same again for a light pelmet",
              "value": 3.4036,
              "unit": "m"
            },
            {
              "label": "Cornice lengths to buy, and the same for a pelmet",
              "value": 2,
              "unit": "lengths"
            },
            {
              "label": "Stock length of plinth, cornice and pelmet",
              "value": 94,
              "unit": "in"
            },
            {
              "label": "End panels on the base runs",
              "value": 0,
              "unit": "panels"
            },
            {
              "label": "End panels on the wall-unit runs",
              "value": 2,
              "unit": "panels"
            },
            {
              "label": "Legs — none, the toe kick is built in",
              "value": 0,
              "unit": "pieces"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "The same run's toe kick in 94 in lengths",
          "inputs": {
            "layout": "separate",
            "run1Length": 3.3528,
            "run2Length": 0,
            "run3Length": 0,
            "integratedSpaces": 0.6096,
            "freestandingSpaces": 0,
            "wall1Length": 2.7432,
            "wall2Length": 0,
            "wall3Length": 0,
            "mainWidth": "standard",
            "maxFiller": 0.1524,
            "baseDepth": 0.6096,
            "wallDepth": 0.3302,
            "openBaseEnds": 0,
            "openWallEnds": 2,
            "worktopStock": "long",
            "worktopAllowance": 0.01905,
            "trimStock": "standard",
            "trimStockLength": 2.7432,
            "support": "market",
            "cornerJoint": "market",
            "run1UnitsBefore": 0,
            "wall1UnitsBefore": 0,
            "headline": "plinth"
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "lengths",
          "confidence": "high",
          "steps": [
            {
              "label": "Base units",
              "value": 5,
              "unit": "units"
            },
            {
              "label": "24 in base units",
              "value": 4,
              "unit": "units"
            },
            {
              "label": "12 in base units",
              "value": 1,
              "unit": "units"
            },
            {
              "label": "Base fillers, one for each stretch left short",
              "value": 0,
              "unit": "fillers"
            },
            {
              "label": "Wall units",
              "value": 5,
              "unit": "units"
            },
            {
              "label": "24 in wall units",
              "value": 4,
              "unit": "units"
            },
            {
              "label": "12 in wall units",
              "value": 1,
              "unit": "units"
            },
            {
              "label": "Wall fillers, one for each stretch left short",
              "value": 0,
              "unit": "fillers"
            },
            {
              "label": "Worktop to cover, corners counted once",
              "value": 3.3528,
              "unit": "m"
            },
            {
              "label": "Worktop stock length",
              "value": 3.6576000000000004,
              "unit": "m"
            },
            {
              "label": "Worktop lengths to buy",
              "value": 1,
              "unit": "lengths"
            },
            {
              "label": "Worktop joints at corners",
              "value": 0,
              "unit": "joints"
            },
            {
              "label": "Worktop joints within a run",
              "value": 0,
              "unit": "joints"
            },
            {
              "label": "Plinth (toe kick), returns included",
              "value": 3.3528,
              "unit": "m"
            },
            {
              "label": "Plinth lengths to buy",
              "value": 2,
              "unit": "lengths"
            },
            {
              "label": "Cornice, and the same again for a light pelmet",
              "value": 3.4036,
              "unit": "m"
            },
            {
              "label": "Cornice lengths to buy, and the same for a pelmet",
              "value": 2,
              "unit": "lengths"
            },
            {
              "label": "Stock length of plinth, cornice and pelmet",
              "value": 94,
              "unit": "in"
            },
            {
              "label": "End panels on the base runs",
              "value": 0,
              "unit": "panels"
            },
            {
              "label": "End panels on the wall-unit runs",
              "value": 2,
              "unit": "panels"
            },
            {
              "label": "Legs — none, the toe kick is built in",
              "value": 0,
              "unit": "pieces"
            }
          ],
          "basis": "cited",
          "sourceIndex": 4
        },
        {
          "name": "A 110 in run with nothing in it — the 14 in left takes a 12 in cabinet",
          "inputs": {
            "layout": "separate",
            "run1Length": 2.794,
            "run2Length": 0,
            "run3Length": 0,
            "integratedSpaces": 0,
            "freestandingSpaces": 0,
            "wall1Length": 0,
            "wall2Length": 0,
            "wall3Length": 0,
            "mainWidth": "standard",
            "maxFiller": 0.1524,
            "baseDepth": 0.6096,
            "wallDepth": 0.3302,
            "openBaseEnds": 0,
            "openWallEnds": 0,
            "worktopStock": "long",
            "worktopAllowance": 0.01905,
            "trimStock": "standard",
            "trimStockLength": 2.7432,
            "support": "market",
            "cornerJoint": "market",
            "run1UnitsBefore": 0,
            "wall1UnitsBefore": 0,
            "headline": "base"
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "units",
          "confidence": "high",
          "steps": [
            {
              "label": "Base units",
              "value": 5,
              "unit": "units"
            },
            {
              "label": "24 in base units",
              "value": 4,
              "unit": "units"
            },
            {
              "label": "12 in base units",
              "value": 1,
              "unit": "units"
            },
            {
              "label": "Base fillers, one for each stretch left short",
              "value": 1,
              "unit": "fillers"
            },
            {
              "label": "Widest base filler",
              "value": 50.8,
              "unit": "mm"
            },
            {
              "label": "Wall units",
              "value": 0,
              "unit": "units"
            },
            {
              "label": "Wall fillers, one for each stretch left short",
              "value": 0,
              "unit": "fillers"
            },
            {
              "label": "Worktop to cover, corners counted once",
              "value": 2.794,
              "unit": "m"
            },
            {
              "label": "Worktop stock length",
              "value": 3.6576000000000004,
              "unit": "m"
            },
            {
              "label": "Worktop lengths to buy",
              "value": 1,
              "unit": "lengths"
            },
            {
              "label": "Worktop joints at corners",
              "value": 0,
              "unit": "joints"
            },
            {
              "label": "Worktop joints within a run",
              "value": 0,
              "unit": "joints"
            },
            {
              "label": "Plinth (toe kick), returns included",
              "value": 2.794,
              "unit": "m"
            },
            {
              "label": "Plinth lengths to buy",
              "value": 2,
              "unit": "lengths"
            },
            {
              "label": "Cornice, and the same again for a light pelmet",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Cornice lengths to buy, and the same for a pelmet",
              "value": 0,
              "unit": "lengths"
            },
            {
              "label": "Stock length of plinth, cornice and pelmet",
              "value": 94,
              "unit": "in"
            },
            {
              "label": "End panels on the base runs",
              "value": 0,
              "unit": "panels"
            },
            {
              "label": "End panels on the wall-unit runs",
              "value": 0,
              "unit": "panels"
            },
            {
              "label": "Legs — none, the toe kick is built in",
              "value": 0,
              "unit": "pieces"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "A 104 in run — an 8 in leftover no cabinet fits, so a 24 in gives way to a 30 in",
          "inputs": {
            "layout": "separate",
            "run1Length": 2.6416,
            "run2Length": 0,
            "run3Length": 0,
            "integratedSpaces": 0,
            "freestandingSpaces": 0,
            "wall1Length": 0,
            "wall2Length": 0,
            "wall3Length": 0,
            "mainWidth": "standard",
            "maxFiller": 0.1524,
            "baseDepth": 0.6096,
            "wallDepth": 0.3302,
            "openBaseEnds": 0,
            "openWallEnds": 0,
            "worktopStock": "long",
            "worktopAllowance": 0.01905,
            "trimStock": "standard",
            "trimStockLength": 2.7432,
            "support": "market",
            "cornerJoint": "market",
            "run1UnitsBefore": 0,
            "wall1UnitsBefore": 0,
            "headline": "base"
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "units",
          "confidence": "high",
          "steps": [
            {
              "label": "Base units",
              "value": 4,
              "unit": "units"
            },
            {
              "label": "30 in base units",
              "value": 1,
              "unit": "units"
            },
            {
              "label": "24 in base units",
              "value": 3,
              "unit": "units"
            },
            {
              "label": "Base fillers, one for each stretch left short",
              "value": 1,
              "unit": "fillers"
            },
            {
              "label": "Widest base filler",
              "value": 50.8,
              "unit": "mm"
            },
            {
              "label": "Wall units",
              "value": 0,
              "unit": "units"
            },
            {
              "label": "Wall fillers, one for each stretch left short",
              "value": 0,
              "unit": "fillers"
            },
            {
              "label": "Worktop to cover, corners counted once",
              "value": 2.6416,
              "unit": "m"
            },
            {
              "label": "Worktop stock length",
              "value": 3.6576000000000004,
              "unit": "m"
            },
            {
              "label": "Worktop lengths to buy",
              "value": 1,
              "unit": "lengths"
            },
            {
              "label": "Worktop joints at corners",
              "value": 0,
              "unit": "joints"
            },
            {
              "label": "Worktop joints within a run",
              "value": 0,
              "unit": "joints"
            },
            {
              "label": "Plinth (toe kick), returns included",
              "value": 2.6416,
              "unit": "m"
            },
            {
              "label": "Plinth lengths to buy",
              "value": 2,
              "unit": "lengths"
            },
            {
              "label": "Cornice, and the same again for a light pelmet",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Cornice lengths to buy, and the same for a pelmet",
              "value": 0,
              "unit": "lengths"
            },
            {
              "label": "Stock length of plinth, cornice and pelmet",
              "value": 94,
              "unit": "in"
            },
            {
              "label": "End panels on the base runs",
              "value": 0,
              "unit": "panels"
            },
            {
              "label": "End panels on the wall-unit runs",
              "value": 0,
              "unit": "panels"
            },
            {
              "label": "Legs — none, the toe kick is built in",
              "value": 0,
              "unit": "pieces"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "An L of 10 ft and 8 ft with a dishwasher in run 1 — base cabinets",
          "inputs": {
            "layout": "l",
            "run1Length": 3.048,
            "run2Length": 2.4384,
            "run3Length": 0,
            "integratedSpaces": 0.6096,
            "freestandingSpaces": 0,
            "wall1Length": 0,
            "wall2Length": 0,
            "wall3Length": 0,
            "mainWidth": "standard",
            "maxFiller": 0.1524,
            "baseDepth": 0.6096,
            "wallDepth": 0.3302,
            "openBaseEnds": 1,
            "openWallEnds": 0,
            "worktopStock": "short",
            "worktopAllowance": 0.01905,
            "trimStock": "standard",
            "trimStockLength": 2.7432,
            "support": "market",
            "cornerJoint": "market",
            "run1UnitsBefore": 0,
            "wall1UnitsBefore": 0,
            "headline": "base"
          },
          "expected": 7,
          "toleranceDecimalPlaces": 0,
          "unit": "units",
          "confidence": "high",
          "steps": [
            {
              "label": "Base units",
              "value": 7,
              "unit": "units"
            },
            {
              "label": "24 in base units",
              "value": 7,
              "unit": "units"
            },
            {
              "label": "Base fillers, one for each stretch left short",
              "value": 0,
              "unit": "fillers"
            },
            {
              "label": "Wall units",
              "value": 0,
              "unit": "units"
            },
            {
              "label": "Wall fillers, one for each stretch left short",
              "value": 0,
              "unit": "fillers"
            },
            {
              "label": "Worktop to cover, corners counted once",
              "value": 4.8768,
              "unit": "m"
            },
            {
              "label": "Worktop stock length",
              "value": 2.4384,
              "unit": "m"
            },
            {
              "label": "Worktop lengths to buy",
              "value": 3,
              "unit": "lengths"
            },
            {
              "label": "Worktop joints at corners",
              "value": 1,
              "unit": "joints"
            },
            {
              "label": "Worktop joints within a run",
              "value": 2,
              "unit": "joints"
            },
            {
              "label": "Joints within a run fall this far apart, from its mitre or its start",
              "value": 2.41935,
              "unit": "m"
            },
            {
              "label": "Plinth (toe kick), returns included",
              "value": 5.4864000000000015,
              "unit": "m"
            },
            {
              "label": "Plinth lengths to buy",
              "value": 3,
              "unit": "lengths"
            },
            {
              "label": "Cornice, and the same again for a light pelmet",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Cornice lengths to buy, and the same for a pelmet",
              "value": 0,
              "unit": "lengths"
            },
            {
              "label": "Stock length of plinth, cornice and pelmet",
              "value": 94,
              "unit": "in"
            },
            {
              "label": "End panels on the base runs",
              "value": 1,
              "unit": "panels"
            },
            {
              "label": "End panels on the wall-unit runs",
              "value": 0,
              "unit": "panels"
            },
            {
              "label": "Legs — none, the toe kick is built in",
              "value": 0,
              "unit": "pieces"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "The same L's countertop in 8 ft lengths, mitred — a joint in each run",
          "inputs": {
            "layout": "l",
            "run1Length": 3.048,
            "run2Length": 2.4384,
            "run3Length": 0,
            "integratedSpaces": 0.6096,
            "freestandingSpaces": 0,
            "wall1Length": 0,
            "wall2Length": 0,
            "wall3Length": 0,
            "mainWidth": "standard",
            "maxFiller": 0.1524,
            "baseDepth": 0.6096,
            "wallDepth": 0.3302,
            "openBaseEnds": 1,
            "openWallEnds": 0,
            "worktopStock": "short",
            "worktopAllowance": 0.01905,
            "trimStock": "standard",
            "trimStockLength": 2.7432,
            "support": "market",
            "cornerJoint": "market",
            "run1UnitsBefore": 0,
            "wall1UnitsBefore": 0,
            "headline": "worktop"
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "lengths",
          "confidence": "high",
          "steps": [
            {
              "label": "Base units",
              "value": 7,
              "unit": "units"
            },
            {
              "label": "24 in base units",
              "value": 7,
              "unit": "units"
            },
            {
              "label": "Base fillers, one for each stretch left short",
              "value": 0,
              "unit": "fillers"
            },
            {
              "label": "Wall units",
              "value": 0,
              "unit": "units"
            },
            {
              "label": "Wall fillers, one for each stretch left short",
              "value": 0,
              "unit": "fillers"
            },
            {
              "label": "Worktop to cover, corners counted once",
              "value": 4.8768,
              "unit": "m"
            },
            {
              "label": "Worktop stock length",
              "value": 2.4384,
              "unit": "m"
            },
            {
              "label": "Worktop lengths to buy",
              "value": 3,
              "unit": "lengths"
            },
            {
              "label": "Worktop joints at corners",
              "value": 1,
              "unit": "joints"
            },
            {
              "label": "Worktop joints within a run",
              "value": 2,
              "unit": "joints"
            },
            {
              "label": "Joints within a run fall this far apart, from its mitre or its start",
              "value": 2.41935,
              "unit": "m"
            },
            {
              "label": "Plinth (toe kick), returns included",
              "value": 5.4864000000000015,
              "unit": "m"
            },
            {
              "label": "Plinth lengths to buy",
              "value": 3,
              "unit": "lengths"
            },
            {
              "label": "Cornice, and the same again for a light pelmet",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Cornice lengths to buy, and the same for a pelmet",
              "value": 0,
              "unit": "lengths"
            },
            {
              "label": "Stock length of plinth, cornice and pelmet",
              "value": 94,
              "unit": "in"
            },
            {
              "label": "End panels on the base runs",
              "value": 1,
              "unit": "panels"
            },
            {
              "label": "End panels on the wall-unit runs",
              "value": 0,
              "unit": "panels"
            },
            {
              "label": "Legs — none, the toe kick is built in",
              "value": 0,
              "unit": "pieces"
            }
          ],
          "basis": "cited",
          "sourceIndex": 8
        },
        {
          "name": "A U of wall cabinets, 72, 96 and 60 in, 13 in deep",
          "inputs": {
            "layout": "u",
            "run1Length": 3.048,
            "run2Length": 3.048,
            "run3Length": 2.4384,
            "integratedSpaces": 0,
            "freestandingSpaces": 0,
            "wall1Length": 1.8288,
            "wall2Length": 2.4384,
            "wall3Length": 1.524,
            "mainWidth": "standard",
            "maxFiller": 0.1524,
            "baseDepth": 0.6096,
            "wallDepth": 0.3302,
            "openBaseEnds": 0,
            "openWallEnds": 2,
            "worktopStock": "long",
            "worktopAllowance": 0.01905,
            "trimStock": "standard",
            "trimStockLength": 2.7432,
            "support": "market",
            "cornerJoint": "market",
            "run1UnitsBefore": 0,
            "wall1UnitsBefore": 0,
            "headline": "wall"
          },
          "expected": 9,
          "toleranceDecimalPlaces": 0,
          "unit": "units",
          "confidence": "high",
          "steps": [
            {
              "label": "Base units",
              "value": 12,
              "unit": "units"
            },
            {
              "label": "24 in base units",
              "value": 12,
              "unit": "units"
            },
            {
              "label": "Base fillers, one for each stretch left short",
              "value": 0,
              "unit": "fillers"
            },
            {
              "label": "Wall units",
              "value": 9,
              "unit": "units"
            },
            {
              "label": "24 in wall units",
              "value": 7,
              "unit": "units"
            },
            {
              "label": "21 in wall units",
              "value": 1,
              "unit": "units"
            },
            {
              "label": "9 in wall units",
              "value": 1,
              "unit": "units"
            },
            {
              "label": "Wall fillers, one for each stretch left short",
              "value": 2,
              "unit": "fillers"
            },
            {
              "label": "Widest wall filler",
              "value": 50.8,
              "unit": "mm"
            },
            {
              "label": "Worktop to cover, corners counted once",
              "value": 7.3152,
              "unit": "m"
            },
            {
              "label": "Worktop stock length",
              "value": 3.6576000000000004,
              "unit": "m"
            },
            {
              "label": "Worktop lengths to buy",
              "value": 3,
              "unit": "lengths"
            },
            {
              "label": "Worktop joints at corners",
              "value": 2,
              "unit": "joints"
            },
            {
              "label": "Worktop joints within a run",
              "value": 0,
              "unit": "joints"
            },
            {
              "label": "Plinth (toe kick), returns included",
              "value": 7.3152,
              "unit": "m"
            },
            {
              "label": "Plinth lengths to buy",
              "value": 4,
              "unit": "lengths"
            },
            {
              "label": "Cornice, and the same again for a light pelmet",
              "value": 5.791200000000001,
              "unit": "m"
            },
            {
              "label": "Cornice lengths to buy, and the same for a pelmet",
              "value": 3,
              "unit": "lengths"
            },
            {
              "label": "Stock length of plinth, cornice and pelmet",
              "value": 94,
              "unit": "in"
            },
            {
              "label": "End panels on the base runs",
              "value": 0,
              "unit": "panels"
            },
            {
              "label": "End panels on the wall-unit runs",
              "value": 2,
              "unit": "panels"
            },
            {
              "label": "Legs — none, the toe kick is built in",
              "value": 0,
              "unit": "pieces"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "The same U's crown, returns at two open ends, in 94 in lengths",
          "inputs": {
            "layout": "u",
            "run1Length": 3.048,
            "run2Length": 3.048,
            "run3Length": 2.4384,
            "integratedSpaces": 0,
            "freestandingSpaces": 0,
            "wall1Length": 1.8288,
            "wall2Length": 2.4384,
            "wall3Length": 1.524,
            "mainWidth": "standard",
            "maxFiller": 0.1524,
            "baseDepth": 0.6096,
            "wallDepth": 0.3302,
            "openBaseEnds": 0,
            "openWallEnds": 2,
            "worktopStock": "long",
            "worktopAllowance": 0.01905,
            "trimStock": "standard",
            "trimStockLength": 2.7432,
            "support": "market",
            "cornerJoint": "market",
            "run1UnitsBefore": 0,
            "wall1UnitsBefore": 0,
            "headline": "trim"
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "lengths",
          "confidence": "high",
          "steps": [
            {
              "label": "Base units",
              "value": 12,
              "unit": "units"
            },
            {
              "label": "24 in base units",
              "value": 12,
              "unit": "units"
            },
            {
              "label": "Base fillers, one for each stretch left short",
              "value": 0,
              "unit": "fillers"
            },
            {
              "label": "Wall units",
              "value": 9,
              "unit": "units"
            },
            {
              "label": "24 in wall units",
              "value": 7,
              "unit": "units"
            },
            {
              "label": "21 in wall units",
              "value": 1,
              "unit": "units"
            },
            {
              "label": "9 in wall units",
              "value": 1,
              "unit": "units"
            },
            {
              "label": "Wall fillers, one for each stretch left short",
              "value": 2,
              "unit": "fillers"
            },
            {
              "label": "Widest wall filler",
              "value": 50.8,
              "unit": "mm"
            },
            {
              "label": "Worktop to cover, corners counted once",
              "value": 7.3152,
              "unit": "m"
            },
            {
              "label": "Worktop stock length",
              "value": 3.6576000000000004,
              "unit": "m"
            },
            {
              "label": "Worktop lengths to buy",
              "value": 3,
              "unit": "lengths"
            },
            {
              "label": "Worktop joints at corners",
              "value": 2,
              "unit": "joints"
            },
            {
              "label": "Worktop joints within a run",
              "value": 0,
              "unit": "joints"
            },
            {
              "label": "Plinth (toe kick), returns included",
              "value": 7.3152,
              "unit": "m"
            },
            {
              "label": "Plinth lengths to buy",
              "value": 4,
              "unit": "lengths"
            },
            {
              "label": "Cornice, and the same again for a light pelmet",
              "value": 5.791200000000001,
              "unit": "m"
            },
            {
              "label": "Cornice lengths to buy, and the same for a pelmet",
              "value": 3,
              "unit": "lengths"
            },
            {
              "label": "Stock length of plinth, cornice and pelmet",
              "value": 94,
              "unit": "in"
            },
            {
              "label": "End panels on the base runs",
              "value": 0,
              "unit": "panels"
            },
            {
              "label": "End panels on the wall-unit runs",
              "value": 2,
              "unit": "panels"
            },
            {
              "label": "Legs — none, the toe kick is built in",
              "value": 0,
              "unit": "pieces"
            }
          ],
          "basis": "cited",
          "sourceIndex": 4
        },
        {
          "name": "A galley of two 10 ft runs, 12 ft lengths — one length each side",
          "inputs": {
            "layout": "separate",
            "run1Length": 3.048,
            "run2Length": 3.048,
            "run3Length": 0,
            "integratedSpaces": 0.6096,
            "freestandingSpaces": 0,
            "wall1Length": 0,
            "wall2Length": 0,
            "wall3Length": 0,
            "mainWidth": "standard",
            "maxFiller": 0.1524,
            "baseDepth": 0.6096,
            "wallDepth": 0.3302,
            "openBaseEnds": 0,
            "openWallEnds": 0,
            "worktopStock": "long",
            "worktopAllowance": 0.01905,
            "trimStock": "standard",
            "trimStockLength": 2.7432,
            "support": "market",
            "cornerJoint": "market",
            "run1UnitsBefore": 0,
            "wall1UnitsBefore": 0,
            "headline": "worktop"
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "lengths",
          "confidence": "high",
          "steps": [
            {
              "label": "Base units",
              "value": 9,
              "unit": "units"
            },
            {
              "label": "24 in base units",
              "value": 9,
              "unit": "units"
            },
            {
              "label": "Base fillers, one for each stretch left short",
              "value": 0,
              "unit": "fillers"
            },
            {
              "label": "Wall units",
              "value": 0,
              "unit": "units"
            },
            {
              "label": "Wall fillers, one for each stretch left short",
              "value": 0,
              "unit": "fillers"
            },
            {
              "label": "Worktop to cover, corners counted once",
              "value": 6.096,
              "unit": "m"
            },
            {
              "label": "Worktop stock length",
              "value": 3.6576000000000004,
              "unit": "m"
            },
            {
              "label": "Worktop lengths to buy",
              "value": 2,
              "unit": "lengths"
            },
            {
              "label": "Worktop joints at corners",
              "value": 0,
              "unit": "joints"
            },
            {
              "label": "Worktop joints within a run",
              "value": 0,
              "unit": "joints"
            },
            {
              "label": "Plinth (toe kick), returns included",
              "value": 6.096,
              "unit": "m"
            },
            {
              "label": "Plinth lengths to buy",
              "value": 3,
              "unit": "lengths"
            },
            {
              "label": "Cornice, and the same again for a light pelmet",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Cornice lengths to buy, and the same for a pelmet",
              "value": 0,
              "unit": "lengths"
            },
            {
              "label": "Stock length of plinth, cornice and pelmet",
              "value": 94,
              "unit": "in"
            },
            {
              "label": "End panels on the base runs",
              "value": 0,
              "unit": "panels"
            },
            {
              "label": "End panels on the wall-unit runs",
              "value": 0,
              "unit": "panels"
            },
            {
              "label": "Legs — none, the toe kick is built in",
              "value": 0,
              "unit": "pieces"
            }
          ],
          "basis": "cited",
          "sourceIndex": 8
        },
        {
          "name": "An L of 80 in and 60 in in 10 ft lengths, mitred — each mitred piece needs its own length",
          "inputs": {
            "layout": "l",
            "run1Length": 2.032,
            "run2Length": 1.524,
            "run3Length": 0,
            "integratedSpaces": 0,
            "freestandingSpaces": 0,
            "wall1Length": 0,
            "wall2Length": 0,
            "wall3Length": 0,
            "mainWidth": "standard",
            "maxFiller": 0.1524,
            "baseDepth": 0.6096,
            "wallDepth": 0.3302,
            "openBaseEnds": 1,
            "openWallEnds": 0,
            "worktopStock": "mid",
            "worktopAllowance": 0.01905,
            "trimStock": "standard",
            "trimStockLength": 2.7432,
            "support": "legs",
            "cornerJoint": "market",
            "run1UnitsBefore": 0,
            "wall1UnitsBefore": 0,
            "headline": "worktop"
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "lengths",
          "confidence": "high",
          "steps": [
            {
              "label": "Base units",
              "value": 5,
              "unit": "units"
            },
            {
              "label": "30 in base units",
              "value": 1,
              "unit": "units"
            },
            {
              "label": "24 in base units",
              "value": 3,
              "unit": "units"
            },
            {
              "label": "12 in base units",
              "value": 1,
              "unit": "units"
            },
            {
              "label": "Base fillers, one for each stretch left short",
              "value": 1,
              "unit": "fillers"
            },
            {
              "label": "Widest base filler",
              "value": 50.8,
              "unit": "mm"
            },
            {
              "label": "Wall units",
              "value": 0,
              "unit": "units"
            },
            {
              "label": "Wall fillers, one for each stretch left short",
              "value": 0,
              "unit": "fillers"
            },
            {
              "label": "Worktop to cover, corners counted once",
              "value": 2.9464,
              "unit": "m"
            },
            {
              "label": "Worktop stock length",
              "value": 3.048,
              "unit": "m"
            },
            {
              "label": "Worktop lengths to buy",
              "value": 2,
              "unit": "lengths"
            },
            {
              "label": "Worktop joints at corners",
              "value": 1,
              "unit": "joints"
            },
            {
              "label": "Worktop joints within a run",
              "value": 0,
              "unit": "joints"
            },
            {
              "label": "Plinth (toe kick), returns included",
              "value": 3.556,
              "unit": "m"
            },
            {
              "label": "Plinth lengths to buy",
              "value": 2,
              "unit": "lengths"
            },
            {
              "label": "Cornice, and the same again for a light pelmet",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Cornice lengths to buy, and the same for a pelmet",
              "value": 0,
              "unit": "lengths"
            },
            {
              "label": "Stock length of plinth, cornice and pelmet",
              "value": 94,
              "unit": "in"
            },
            {
              "label": "End panels on the base runs",
              "value": 1,
              "unit": "panels"
            },
            {
              "label": "End panels on the wall-unit runs",
              "value": 0,
              "unit": "panels"
            },
            {
              "label": "Legs, four a base unit",
              "value": 20,
              "unit": "pieces"
            }
          ],
          "basis": "cited",
          "sourceIndex": 8
        },
        {
          "name": "A 10 ft run in 18 in cabinets — the 12 in left takes a 12 in cabinet",
          "inputs": {
            "layout": "separate",
            "run1Length": 3.048,
            "run2Length": 0,
            "run3Length": 0,
            "integratedSpaces": 0,
            "freestandingSpaces": 0,
            "wall1Length": 0,
            "wall2Length": 0,
            "wall3Length": 0,
            "mainWidth": "narrow",
            "maxFiller": 0.1524,
            "baseDepth": 0.6096,
            "wallDepth": 0.3302,
            "openBaseEnds": 0,
            "openWallEnds": 0,
            "worktopStock": "mid",
            "worktopAllowance": 0.01905,
            "trimStock": "standard",
            "trimStockLength": 2.7432,
            "support": "legs",
            "cornerJoint": "market",
            "run1UnitsBefore": 0,
            "wall1UnitsBefore": 0,
            "headline": "base"
          },
          "expected": 7,
          "toleranceDecimalPlaces": 0,
          "unit": "units",
          "confidence": "high",
          "steps": [
            {
              "label": "Base units",
              "value": 7,
              "unit": "units"
            },
            {
              "label": "18 in base units",
              "value": 6,
              "unit": "units"
            },
            {
              "label": "12 in base units",
              "value": 1,
              "unit": "units"
            },
            {
              "label": "Base fillers, one for each stretch left short",
              "value": 0,
              "unit": "fillers"
            },
            {
              "label": "Wall units",
              "value": 0,
              "unit": "units"
            },
            {
              "label": "Wall fillers, one for each stretch left short",
              "value": 0,
              "unit": "fillers"
            },
            {
              "label": "Worktop to cover, corners counted once",
              "value": 3.048,
              "unit": "m"
            },
            {
              "label": "Worktop stock length",
              "value": 3.048,
              "unit": "m"
            },
            {
              "label": "Worktop lengths to buy",
              "value": 2,
              "unit": "lengths"
            },
            {
              "label": "Worktop joints at corners",
              "value": 0,
              "unit": "joints"
            },
            {
              "label": "Worktop joints within a run",
              "value": 1,
              "unit": "joints"
            },
            {
              "label": "Joints within a run fall this far apart, from its mitre or its start",
              "value": 3.02895,
              "unit": "m"
            },
            {
              "label": "Plinth (toe kick), returns included",
              "value": 3.048,
              "unit": "m"
            },
            {
              "label": "Plinth lengths to buy",
              "value": 2,
              "unit": "lengths"
            },
            {
              "label": "Cornice, and the same again for a light pelmet",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Cornice lengths to buy, and the same for a pelmet",
              "value": 0,
              "unit": "lengths"
            },
            {
              "label": "Stock length of plinth, cornice and pelmet",
              "value": 94,
              "unit": "in"
            },
            {
              "label": "End panels on the base runs",
              "value": 0,
              "unit": "panels"
            },
            {
              "label": "End panels on the wall-unit runs",
              "value": 0,
              "unit": "panels"
            },
            {
              "label": "Legs, four a base unit",
              "value": 28,
              "unit": "pieces"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "A 100 in run in 30 in cabinets, a 96 in toe kick typed in, one open end",
          "inputs": {
            "layout": "separate",
            "run1Length": 2.54,
            "run2Length": 0,
            "run3Length": 0,
            "integratedSpaces": 0,
            "freestandingSpaces": 0,
            "wall1Length": 0,
            "wall2Length": 0,
            "wall3Length": 0,
            "mainWidth": "wide",
            "maxFiller": 0.1524,
            "baseDepth": 0.6096,
            "wallDepth": 0.3302,
            "openBaseEnds": 1,
            "openWallEnds": 0,
            "worktopStock": "long",
            "worktopAllowance": 0.01905,
            "trimStock": "custom",
            "trimStockLength": 2.4384,
            "support": "box",
            "cornerJoint": "market",
            "run1UnitsBefore": 0,
            "wall1UnitsBefore": 0,
            "headline": "plinth"
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "lengths",
          "confidence": "high",
          "steps": [
            {
              "label": "Base units",
              "value": 4,
              "unit": "units"
            },
            {
              "label": "30 in base units",
              "value": 3,
              "unit": "units"
            },
            {
              "label": "9 in base units",
              "value": 1,
              "unit": "units"
            },
            {
              "label": "Base fillers, one for each stretch left short",
              "value": 1,
              "unit": "fillers"
            },
            {
              "label": "Widest base filler",
              "value": 25.4,
              "unit": "mm"
            },
            {
              "label": "Wall units",
              "value": 0,
              "unit": "units"
            },
            {
              "label": "Wall fillers, one for each stretch left short",
              "value": 0,
              "unit": "fillers"
            },
            {
              "label": "Worktop to cover, corners counted once",
              "value": 2.54,
              "unit": "m"
            },
            {
              "label": "Worktop stock length",
              "value": 3.6576000000000004,
              "unit": "m"
            },
            {
              "label": "Worktop lengths to buy",
              "value": 1,
              "unit": "lengths"
            },
            {
              "label": "Worktop joints at corners",
              "value": 0,
              "unit": "joints"
            },
            {
              "label": "Worktop joints within a run",
              "value": 0,
              "unit": "joints"
            },
            {
              "label": "Plinth (toe kick), returns included",
              "value": 3.1496,
              "unit": "m"
            },
            {
              "label": "Plinth lengths to buy",
              "value": 2,
              "unit": "lengths"
            },
            {
              "label": "Cornice, and the same again for a light pelmet",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Cornice lengths to buy, and the same for a pelmet",
              "value": 0,
              "unit": "lengths"
            },
            {
              "label": "Stock length of plinth, cornice and pelmet",
              "value": 96,
              "unit": "in"
            },
            {
              "label": "End panels on the base runs",
              "value": 1,
              "unit": "panels"
            },
            {
              "label": "End panels on the wall-unit runs",
              "value": 0,
              "unit": "panels"
            },
            {
              "label": "Legs — none, the toe kick is built in",
              "value": 0,
              "unit": "pieces"
            }
          ],
          "basis": "cited",
          "sourceIndex": 4
        },
        {
          "name": "A 150 in run in 36 in cabinets — the 6 in left is exactly the largest filler",
          "inputs": {
            "layout": "separate",
            "run1Length": 3.81,
            "run2Length": 0,
            "run3Length": 0,
            "integratedSpaces": 0,
            "freestandingSpaces": 0,
            "wall1Length": 0,
            "wall2Length": 0,
            "wall3Length": 0,
            "mainWidth": "widest",
            "maxFiller": 0.1524,
            "baseDepth": 0.6096,
            "wallDepth": 0.3302,
            "openBaseEnds": 0,
            "openWallEnds": 0,
            "worktopStock": "long",
            "worktopAllowance": 0.01905,
            "trimStock": "standard",
            "trimStockLength": 2.7432,
            "support": "box",
            "cornerJoint": "market",
            "run1UnitsBefore": 0,
            "wall1UnitsBefore": 0,
            "headline": "base"
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "units",
          "confidence": "high",
          "steps": [
            {
              "label": "Base units",
              "value": 4,
              "unit": "units"
            },
            {
              "label": "36 in base units",
              "value": 4,
              "unit": "units"
            },
            {
              "label": "Base fillers, one for each stretch left short",
              "value": 1,
              "unit": "fillers"
            },
            {
              "label": "Widest base filler",
              "value": 152.4,
              "unit": "mm"
            },
            {
              "label": "Wall units",
              "value": 0,
              "unit": "units"
            },
            {
              "label": "Wall fillers, one for each stretch left short",
              "value": 0,
              "unit": "fillers"
            },
            {
              "label": "Worktop to cover, corners counted once",
              "value": 3.81,
              "unit": "m"
            },
            {
              "label": "Worktop stock length",
              "value": 3.6576000000000004,
              "unit": "m"
            },
            {
              "label": "Worktop lengths to buy",
              "value": 2,
              "unit": "lengths"
            },
            {
              "label": "Worktop joints at corners",
              "value": 0,
              "unit": "joints"
            },
            {
              "label": "Worktop joints within a run",
              "value": 1,
              "unit": "joints"
            },
            {
              "label": "Joints within a run fall this far apart, from its mitre or its start",
              "value": 3.6385500000000004,
              "unit": "m"
            },
            {
              "label": "Plinth (toe kick), returns included",
              "value": 3.81,
              "unit": "m"
            },
            {
              "label": "Plinth lengths to buy",
              "value": 2,
              "unit": "lengths"
            },
            {
              "label": "Cornice, and the same again for a light pelmet",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Cornice lengths to buy, and the same for a pelmet",
              "value": 0,
              "unit": "lengths"
            },
            {
              "label": "Stock length of plinth, cornice and pelmet",
              "value": 94,
              "unit": "in"
            },
            {
              "label": "End panels on the base runs",
              "value": 0,
              "unit": "panels"
            },
            {
              "label": "End panels on the wall-unit runs",
              "value": 0,
              "unit": "panels"
            },
            {
              "label": "Legs — none, the toe kick is built in",
              "value": 0,
              "unit": "pieces"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "The 80 in and 60 in L butt-jointed — the shorter piece shares the length",
          "inputs": {
            "layout": "l",
            "run1Length": 2.032,
            "run2Length": 1.524,
            "run3Length": 0,
            "integratedSpaces": 0,
            "freestandingSpaces": 0,
            "wall1Length": 0,
            "wall2Length": 0,
            "wall3Length": 0,
            "mainWidth": "standard",
            "maxFiller": 0.1524,
            "baseDepth": 0.6096,
            "wallDepth": 0.3302,
            "openBaseEnds": 1,
            "openWallEnds": 0,
            "worktopStock": "mid",
            "worktopAllowance": 0.01905,
            "trimStock": "standard",
            "trimStockLength": 2.7432,
            "support": "legs",
            "cornerJoint": "butt",
            "run1UnitsBefore": 0,
            "wall1UnitsBefore": 0,
            "headline": "worktop"
          },
          "expected": 1,
          "toleranceDecimalPlaces": 0,
          "unit": "lengths",
          "confidence": "high",
          "steps": [
            {
              "label": "Base units",
              "value": 5,
              "unit": "units"
            },
            {
              "label": "30 in base units",
              "value": 1,
              "unit": "units"
            },
            {
              "label": "24 in base units",
              "value": 3,
              "unit": "units"
            },
            {
              "label": "12 in base units",
              "value": 1,
              "unit": "units"
            },
            {
              "label": "Base fillers, one for each stretch left short",
              "value": 1,
              "unit": "fillers"
            },
            {
              "label": "Widest base filler",
              "value": 50.8,
              "unit": "mm"
            },
            {
              "label": "Wall units",
              "value": 0,
              "unit": "units"
            },
            {
              "label": "Wall fillers, one for each stretch left short",
              "value": 0,
              "unit": "fillers"
            },
            {
              "label": "Worktop to cover, corners counted once",
              "value": 2.9464,
              "unit": "m"
            },
            {
              "label": "Worktop stock length",
              "value": 3.048,
              "unit": "m"
            },
            {
              "label": "Worktop lengths to buy",
              "value": 1,
              "unit": "lengths"
            },
            {
              "label": "Worktop joints at corners",
              "value": 1,
              "unit": "joints"
            },
            {
              "label": "Worktop joints within a run",
              "value": 0,
              "unit": "joints"
            },
            {
              "label": "Plinth (toe kick), returns included",
              "value": 3.556,
              "unit": "m"
            },
            {
              "label": "Plinth lengths to buy",
              "value": 2,
              "unit": "lengths"
            },
            {
              "label": "Cornice, and the same again for a light pelmet",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Cornice lengths to buy, and the same for a pelmet",
              "value": 0,
              "unit": "lengths"
            },
            {
              "label": "Stock length of plinth, cornice and pelmet",
              "value": 94,
              "unit": "in"
            },
            {
              "label": "End panels on the base runs",
              "value": 1,
              "unit": "panels"
            },
            {
              "label": "End panels on the wall-unit runs",
              "value": 0,
              "unit": "panels"
            },
            {
              "label": "Legs, four a base unit",
              "value": 20,
              "unit": "pieces"
            }
          ],
          "basis": "cited",
          "sourceIndex": 9
        },
        {
          "name": "A U of 60, 96 and 60 in mitred, 12 ft lengths — three mitred pieces, three lengths",
          "inputs": {
            "layout": "u",
            "run1Length": 1.524,
            "run2Length": 2.4384,
            "run3Length": 1.524,
            "integratedSpaces": 0,
            "freestandingSpaces": 0,
            "wall1Length": 0,
            "wall2Length": 0,
            "wall3Length": 0,
            "mainWidth": "standard",
            "maxFiller": 0.1524,
            "baseDepth": 0.6096,
            "wallDepth": 0.3302,
            "openBaseEnds": 0,
            "openWallEnds": 0,
            "worktopStock": "long",
            "worktopAllowance": 0.01905,
            "trimStock": "standard",
            "trimStockLength": 2.7432,
            "support": "box",
            "cornerJoint": "mitre",
            "run1UnitsBefore": 0,
            "wall1UnitsBefore": 0,
            "headline": "worktop"
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "lengths",
          "confidence": "high",
          "steps": [
            {
              "label": "Base units",
              "value": 8,
              "unit": "units"
            },
            {
              "label": "24 in base units",
              "value": 6,
              "unit": "units"
            },
            {
              "label": "12 in base units",
              "value": 2,
              "unit": "units"
            },
            {
              "label": "Base fillers, one for each stretch left short",
              "value": 0,
              "unit": "fillers"
            },
            {
              "label": "Wall units",
              "value": 0,
              "unit": "units"
            },
            {
              "label": "Wall fillers, one for each stretch left short",
              "value": 0,
              "unit": "fillers"
            },
            {
              "label": "Worktop to cover, corners counted once",
              "value": 4.2672,
              "unit": "m"
            },
            {
              "label": "Worktop stock length",
              "value": 3.6576000000000004,
              "unit": "m"
            },
            {
              "label": "Worktop lengths to buy",
              "value": 3,
              "unit": "lengths"
            },
            {
              "label": "Worktop joints at corners",
              "value": 2,
              "unit": "joints"
            },
            {
              "label": "Worktop joints within a run",
              "value": 0,
              "unit": "joints"
            },
            {
              "label": "Plinth (toe kick), returns included",
              "value": 4.2672,
              "unit": "m"
            },
            {
              "label": "Plinth lengths to buy",
              "value": 2,
              "unit": "lengths"
            },
            {
              "label": "Cornice, and the same again for a light pelmet",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Cornice lengths to buy, and the same for a pelmet",
              "value": 0,
              "unit": "lengths"
            },
            {
              "label": "Stock length of plinth, cornice and pelmet",
              "value": 94,
              "unit": "in"
            },
            {
              "label": "End panels on the base runs",
              "value": 0,
              "unit": "panels"
            },
            {
              "label": "End panels on the wall-unit runs",
              "value": 0,
              "unit": "panels"
            },
            {
              "label": "Legs — none, the toe kick is built in",
              "value": 0,
              "unit": "pieces"
            }
          ],
          "basis": "cited",
          "sourceIndex": 8
        },
        {
          "name": "An 11 ft run with the dishwasher in the middle — two 54 in stretches take four cabinets",
          "inputs": {
            "layout": "separate",
            "run1Length": 3.3528,
            "run2Length": 0,
            "run3Length": 0,
            "integratedSpaces": 0.6096,
            "freestandingSpaces": 0,
            "wall1Length": 0,
            "wall2Length": 0,
            "wall3Length": 0,
            "mainWidth": "standard",
            "maxFiller": 0.1524,
            "baseDepth": 0.6096,
            "wallDepth": 0.3302,
            "openBaseEnds": 0,
            "openWallEnds": 0,
            "worktopStock": "long",
            "worktopAllowance": 0.01905,
            "trimStock": "standard",
            "trimStockLength": 2.7432,
            "support": "market",
            "cornerJoint": "market",
            "run1UnitsBefore": 1.3716,
            "wall1UnitsBefore": 0,
            "headline": "base"
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "units",
          "confidence": "high",
          "steps": [
            {
              "label": "Base units",
              "value": 4,
              "unit": "units"
            },
            {
              "label": "24 in base units",
              "value": 4,
              "unit": "units"
            },
            {
              "label": "Base fillers, one for each stretch left short",
              "value": 2,
              "unit": "fillers"
            },
            {
              "label": "Widest base filler",
              "value": 152.4,
              "unit": "mm"
            },
            {
              "label": "Wall units",
              "value": 0,
              "unit": "units"
            },
            {
              "label": "Wall fillers, one for each stretch left short",
              "value": 0,
              "unit": "fillers"
            },
            {
              "label": "Worktop to cover, corners counted once",
              "value": 3.3528,
              "unit": "m"
            },
            {
              "label": "Worktop stock length",
              "value": 3.6576000000000004,
              "unit": "m"
            },
            {
              "label": "Worktop lengths to buy",
              "value": 1,
              "unit": "lengths"
            },
            {
              "label": "Worktop joints at corners",
              "value": 0,
              "unit": "joints"
            },
            {
              "label": "Worktop joints within a run",
              "value": 0,
              "unit": "joints"
            },
            {
              "label": "Plinth (toe kick), returns included",
              "value": 3.3528,
              "unit": "m"
            },
            {
              "label": "Plinth lengths to buy",
              "value": 2,
              "unit": "lengths"
            },
            {
              "label": "Cornice, and the same again for a light pelmet",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Cornice lengths to buy, and the same for a pelmet",
              "value": 0,
              "unit": "lengths"
            },
            {
              "label": "Stock length of plinth, cornice and pelmet",
              "value": 94,
              "unit": "in"
            },
            {
              "label": "End panels on the base runs",
              "value": 0,
              "unit": "panels"
            },
            {
              "label": "End panels on the wall-unit runs",
              "value": 0,
              "unit": "panels"
            },
            {
              "label": "Legs — none, the toe kick is built in",
              "value": 0,
              "unit": "pieces"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "110 in of wall cabinets split by a hood at 55 in — each side takes a 24 in and a 30 in",
          "inputs": {
            "layout": "separate",
            "run1Length": 3.3528,
            "run2Length": 0,
            "run3Length": 0,
            "integratedSpaces": 0,
            "freestandingSpaces": 0,
            "wall1Length": 2.794,
            "wall2Length": 0,
            "wall3Length": 0,
            "mainWidth": "standard",
            "maxFiller": 0.1524,
            "baseDepth": 0.6096,
            "wallDepth": 0.3302,
            "openBaseEnds": 0,
            "openWallEnds": 2,
            "worktopStock": "long",
            "worktopAllowance": 0.01905,
            "trimStock": "standard",
            "trimStockLength": 2.7432,
            "support": "market",
            "cornerJoint": "market",
            "run1UnitsBefore": 0,
            "wall1UnitsBefore": 1.397,
            "headline": "wall"
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "units",
          "confidence": "high",
          "steps": [
            {
              "label": "Base units",
              "value": 6,
              "unit": "units"
            },
            {
              "label": "24 in base units",
              "value": 5,
              "unit": "units"
            },
            {
              "label": "12 in base units",
              "value": 1,
              "unit": "units"
            },
            {
              "label": "Base fillers, one for each stretch left short",
              "value": 0,
              "unit": "fillers"
            },
            {
              "label": "Wall units",
              "value": 4,
              "unit": "units"
            },
            {
              "label": "30 in wall units",
              "value": 2,
              "unit": "units"
            },
            {
              "label": "24 in wall units",
              "value": 2,
              "unit": "units"
            },
            {
              "label": "Wall fillers, one for each stretch left short",
              "value": 2,
              "unit": "fillers"
            },
            {
              "label": "Widest wall filler",
              "value": 25.4,
              "unit": "mm"
            },
            {
              "label": "Worktop to cover, corners counted once",
              "value": 3.3528,
              "unit": "m"
            },
            {
              "label": "Worktop stock length",
              "value": 3.6576000000000004,
              "unit": "m"
            },
            {
              "label": "Worktop lengths to buy",
              "value": 1,
              "unit": "lengths"
            },
            {
              "label": "Worktop joints at corners",
              "value": 0,
              "unit": "joints"
            },
            {
              "label": "Worktop joints within a run",
              "value": 0,
              "unit": "joints"
            },
            {
              "label": "Plinth (toe kick), returns included",
              "value": 3.3528,
              "unit": "m"
            },
            {
              "label": "Plinth lengths to buy",
              "value": 2,
              "unit": "lengths"
            },
            {
              "label": "Cornice, and the same again for a light pelmet",
              "value": 3.4544,
              "unit": "m"
            },
            {
              "label": "Cornice lengths to buy, and the same for a pelmet",
              "value": 2,
              "unit": "lengths"
            },
            {
              "label": "Stock length of plinth, cornice and pelmet",
              "value": 94,
              "unit": "in"
            },
            {
              "label": "End panels on the base runs",
              "value": 0,
              "unit": "panels"
            },
            {
              "label": "End panels on the wall-unit runs",
              "value": 2,
              "unit": "panels"
            },
            {
              "label": "Legs — none, the toe kick is built in",
              "value": 0,
              "unit": "pieces"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "kn-to-kips-calculator",
      "title": "kN to Kips Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/kn-to-kips-calculator/",
      "sources": [
        "1 lbf = 4.4482216152605 N exactly, from the avoirdupois pound (0.45359237 kg) and standard gravity (9.80665 m/s²); 1 kip = 1,000 lbf"
      ],
      "vectors": [
        {
          "name": "100 kN converts correctly",
          "inputs": {
            "kilonewtons": 100
          },
          "expected": 22.48089430997105,
          "toleranceDecimalPlaces": 6,
          "unit": "kip",
          "confidence": "high",
          "steps": [
            {
              "label": "Same load in pounds-force",
              "value": 22480.8943099711,
              "unit": "lbf"
            },
            {
              "label": "Same load in newtons",
              "value": 100000,
              "unit": "N"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "kilonewtons": 1000
          },
          "expected": 224.8089430997105,
          "toleranceDecimalPlaces": 6,
          "unit": "kip",
          "confidence": "high",
          "steps": [
            {
              "label": "Same load in pounds-force",
              "value": 224808.943099711,
              "unit": "lbf"
            },
            {
              "label": "Same load in newtons",
              "value": 1000000,
              "unit": "N"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "kn-to-pounds-force-calculator",
      "title": "kN to Pounds-Force Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/kn-to-pounds-force-calculator/",
      "sources": [
        "1 lbf = 4.4482216152605 N exactly, so 1 kN = 224.808943 lbf"
      ],
      "vectors": [
        {
          "name": "5 kN converts correctly",
          "inputs": {
            "kilonewtons": 5
          },
          "expected": 1124.044715498555,
          "toleranceDecimalPlaces": 6,
          "unit": "lbf",
          "confidence": "high",
          "steps": [
            {
              "label": "Same load in kips",
              "value": 1.1240447154985524,
              "unit": "kip"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "kilonewtons": 50
          },
          "expected": 11240.44715498555,
          "toleranceDecimalPlaces": 6,
          "unit": "lbf",
          "confidence": "high",
          "steps": [
            {
              "label": "Same load in kips",
              "value": 11.240447154985524,
              "unit": "kip"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "kpa-to-psf-calculator",
      "title": "kPa to psf Bearing Pressure Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/kpa-to-psf-calculator/",
      "sources": [
        "1 lbf = 4.4482216152605 N exactly, from 1 lb = 0.45359237 kg and g₀ = 9.80665 m/s², both exact; 1 ft² = 0.09290304 m² exactly. So 1 kPa = 1000 × 0.09290304 ÷ 4.4482216152605 = 20.885434233150127… psf. The ratio is exact by definition and its decimal expansion repeats, so the trailing digits are the exact quotient carried out, not an estimate."
      ],
      "vectors": [
        {
          "name": "150 kPa converts correctly",
          "inputs": {
            "kilopascals": 150
          },
          "expected": 3132.8151349725194,
          "toleranceDecimalPlaces": 6,
          "unit": "psf",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 20.88543423315013,
              "unit": "psf per kPa"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "kilopascals": 1500
          },
          "expected": 31328.151349725194,
          "toleranceDecimalPlaces": 6,
          "unit": "psf",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 20.88543423315013,
              "unit": "psf per kPa"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "kva-to-kw-calculator",
      "title": "kVA to kW Calculator",
      "url": "https://craftquantities.com/calculators/electrical/kva-to-kw-calculator/",
      "sources": [
        "Real power = apparent power x power factor; kW = kVA x PF, and the reactive part is kVA x √(1 − PF²)",
        "Cummins Inc., 2022 Global Product Guide — Power Generation Products (GLM-5763-EN): the diesel sets are listed with their kWe at 0.8 of their kVA (the C20D6 at 25 kVA and 20 kWe standby, the C30D6 at 37.5 kVA and 30 kWe), the three-phase convention the opening 0.8 follows; the single-phase sets are listed in kW with a current that is the kW divided by the volts, so their kVA and kW are the same number (the RV QG 2800 at 2.8 kW and 23.3 A on 120 V, the RV QG 2300 at 2.3 kW and 10 A on 230 V, the QD5000 at 4.8 kW and 21 A on 230 V)",
        "Cummins Inc., Pre-Configured Diesel generator sets, specification sheet NAS-6437-EN (12/19): the C20 D6 set for 120/240 V, 1 phase, is 20 kW and 20 kVA standby at 60 Hz — the model the 2022 guide lists at 25 kVA and 20 kWe"
      ],
      "vectors": [
        {
          "name": "100 kVA at the opening 0.8 is 80 kW",
          "inputs": {
            "kva": 100,
            "powerFactor": 0.8
          },
          "expected": 80,
          "toleranceDecimalPlaces": 6,
          "unit": "kW",
          "confidence": "high",
          "steps": [
            {
              "label": "Power factor applied",
              "value": 0.8
            },
            {
              "label": "Reactive power, kVA × √(1 − PF²)",
              "value": 59.999999999999986,
              "unit": "kvar"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a saved line with no power factor is still read at 0.8",
          "inputs": {
            "kva": 100
          },
          "expected": 80,
          "toleranceDecimalPlaces": 6,
          "unit": "kW",
          "confidence": "high",
          "steps": [
            {
              "label": "Power factor applied",
              "value": 0.8
            },
            {
              "label": "Reactive power, kVA × √(1 − PF²)",
              "value": 59.999999999999986,
              "unit": "kvar"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "power factor 1: the kW equal the kVA",
          "inputs": {
            "kva": 250,
            "powerFactor": 1
          },
          "expected": 250,
          "toleranceDecimalPlaces": 6,
          "unit": "kW",
          "confidence": "high",
          "steps": [
            {
              "label": "Power factor applied",
              "value": 1
            },
            {
              "label": "Reactive power, kVA × √(1 − PF²)",
              "value": 0,
              "unit": "kvar"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a 25 kVA set at 0.8 is the 20 kW its badge pairs with it",
          "inputs": {
            "kva": 25,
            "powerFactor": 0.8
          },
          "expected": 20,
          "toleranceDecimalPlaces": 6,
          "unit": "kW",
          "confidence": "high",
          "steps": [
            {
              "label": "Power factor applied",
              "value": 0.8
            },
            {
              "label": "Reactive power, kVA × √(1 − PF²)",
              "value": 14.999999999999996,
              "unit": "kvar"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "1,000 kVA at 0.92 is 920 kW",
          "inputs": {
            "kva": 1000,
            "powerFactor": 0.92
          },
          "expected": 920,
          "toleranceDecimalPlaces": 6,
          "unit": "kW",
          "confidence": "high",
          "steps": [
            {
              "label": "Power factor applied",
              "value": 0.92
            },
            {
              "label": "Reactive power, kVA × √(1 − PF²)",
              "value": 391.91835884530843,
              "unit": "kvar"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "kw-to-btu-calculator",
      "title": "kW to BTU/hr Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/kw-to-btu-calculator/",
      "sources": [
        "1 BTU/h is defined as 0.29307107017222 W (International Table), so 1 kW = 3412.1416 BTU/h",
        "Nominal cooling tonnage: 1 ton of refrigeration = 12,000 BTU/h"
      ],
      "vectors": [
        {
          "name": "3.5 kW converts correctly",
          "inputs": {
            "kilowatts": 3.5
          },
          "expected": 11942.495715947887,
          "toleranceDecimalPlaces": 6,
          "unit": "BTU/hr",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 3412.141633127968,
              "unit": "BTU/hr per kW"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "kilowatts": 35
          },
          "expected": 119424.95715947887,
          "toleranceDecimalPlaces": 6,
          "unit": "BTU/hr",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 3412.141633127968,
              "unit": "BTU/hr per kW"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "kw-to-hp-calculator",
      "title": "kW to Horsepower Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/kw-to-hp-calculator/",
      "sources": [
        "1 mechanical horsepower = 550 ft·lbf/s = 745.699872 watts, exactly"
      ],
      "vectors": [
        {
          "name": "5 kW to HP",
          "inputs": {
            "value": 5,
            "fromUnit": "kw"
          },
          "expected": 6.705,
          "toleranceDecimalPlaces": 0.5,
          "unit": "HP",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "10 HP to kW",
          "inputs": {
            "value": 10,
            "fromUnit": "hp"
          },
          "expected": 7.457,
          "toleranceDecimalPlaces": 0.5,
          "unit": "kW",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "kw-to-kva-calculator",
      "title": "kW to kVA Calculator",
      "url": "https://craftquantities.com/calculators/electrical/kw-to-kva-calculator/",
      "sources": [
        "Apparent power = real power / power factor; kVA = kW / PF, and the reactive part is kW x tan(arccos PF)",
        "Cummins Inc., 2022 Global Product Guide — Power Generation Products (GLM-5763-EN): the diesel sets are listed with their kWe at 0.8 of their kVA (the C20D6 at 25 kVA and 20 kWe standby, the C30D6 at 37.5 kVA and 30 kWe), the three-phase convention the opening 0.8 follows; the single-phase sets are listed in kW with a current that is the kW divided by the volts, so their kVA and kW are the same number (the RV QG 2800 at 2.8 kW and 23.3 A on 120 V, the RV QG 2300 at 2.3 kW and 10 A on 230 V, the QD5000 at 4.8 kW and 21 A on 230 V)",
        "Cummins Inc., Pre-Configured Diesel generator sets, specification sheet NAS-6437-EN (12/19): the C20 D6 set for 120/240 V, 1 phase, is 20 kW and 20 kVA standby at 60 Hz — the model the 2022 guide lists at 25 kVA and 20 kWe"
      ],
      "vectors": [
        {
          "name": "80 kW at the opening 0.8 is 100 kVA",
          "inputs": {
            "kw": 80,
            "powerFactor": 0.8
          },
          "expected": 100,
          "toleranceDecimalPlaces": 6,
          "unit": "kVA",
          "confidence": "high",
          "steps": [
            {
              "label": "Real power entered",
              "value": 80,
              "unit": "kW"
            },
            {
              "label": "Power factor applied",
              "value": 0.8
            },
            {
              "label": "Reactive power, kW × tan(arccos PF)",
              "value": 59.99999999999998,
              "unit": "kvar"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a saved line with no power factor is still read at 0.8",
          "inputs": {
            "kw": 80
          },
          "expected": 100,
          "toleranceDecimalPlaces": 6,
          "unit": "kVA",
          "confidence": "high",
          "steps": [
            {
              "label": "Real power entered",
              "value": 80,
              "unit": "kW"
            },
            {
              "label": "Power factor applied",
              "value": 0.8
            },
            {
              "label": "Reactive power, kW × tan(arccos PF)",
              "value": 59.99999999999998,
              "unit": "kvar"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "power factor 1: the kVA equal the kW",
          "inputs": {
            "kw": 45,
            "powerFactor": 1
          },
          "expected": 45,
          "toleranceDecimalPlaces": 6,
          "unit": "kVA",
          "confidence": "high",
          "steps": [
            {
              "label": "Real power entered",
              "value": 45,
              "unit": "kW"
            },
            {
              "label": "Power factor applied",
              "value": 1
            },
            {
              "label": "Reactive power, kW × tan(arccos PF)",
              "value": 0,
              "unit": "kvar"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a 20 kW load at 0.8 needs the 25 kVA a C20D6 is badged at",
          "inputs": {
            "kw": 20,
            "powerFactor": 0.8
          },
          "expected": 25,
          "toleranceDecimalPlaces": 6,
          "unit": "kVA",
          "confidence": "high",
          "steps": [
            {
              "label": "Real power entered",
              "value": 20,
              "unit": "kW"
            },
            {
              "label": "Power factor applied",
              "value": 0.8
            },
            {
              "label": "Reactive power, kW × tan(arccos PF)",
              "value": 14.999999999999995,
              "unit": "kvar"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "50 kW at 0.7 is 71.43 kVA",
          "inputs": {
            "kw": 50,
            "powerFactor": 0.7
          },
          "expected": 71.428571,
          "toleranceDecimalPlaces": 5,
          "unit": "kVA",
          "confidence": "high",
          "steps": [
            {
              "label": "Real power entered",
              "value": 50,
              "unit": "kW"
            },
            {
              "label": "Power factor applied",
              "value": 0.7
            },
            {
              "label": "Reactive power, kW × tan(arccos PF)",
              "value": 51.010203061020356,
              "unit": "kvar"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "kwh-to-running-cost-calculator",
      "title": "kWh to Running Cost Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/kwh-to-running-cost-calculator/",
      "sources": [
        "Running cost is the product of energy consumed in kilowatt-hours and the unit rate charged per kilowatt-hour",
        "Unit rates are set per supplier and per tariff and are not standardised; several markets now vary them by time of day. Take the figure from your own bill."
      ],
      "vectors": [
        {
          "name": "100 kWh at 0.25 per kWh costs 25",
          "inputs": {
            "kwh": 100,
            "ratePerKwh": 0.25
          },
          "expected": 25,
          "toleranceDecimalPlaces": 6,
          "unit": "currency",
          "confidence": "high",
          "steps": [
            {
              "label": "Energy consumed",
              "value": 100,
              "unit": "kWh"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1,000 kWh at 0.15 per kWh costs 150",
          "inputs": {
            "kwh": 1000,
            "ratePerKwh": 0.15
          },
          "expected": 150,
          "toleranceDecimalPlaces": 6,
          "unit": "currency",
          "confidence": "high",
          "steps": [
            {
              "label": "Energy consumed",
              "value": 1000,
              "unit": "kWh"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Energy at a zero rate costs nothing",
          "inputs": {
            "kwh": 500,
            "ratePerKwh": 0
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "currency",
          "confidence": "high",
          "steps": [
            {
              "label": "Energy consumed",
              "value": 500,
              "unit": "kWh"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "kwh-to-therms-calculator",
      "title": "kWh to Therms Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/kwh-to-therms-calculator/",
      "sources": [
        "1 therm = 100,000 BTU (IT); 1 BTU (IT) = 1055.05585262 J (NIST SP 811, Appendix B)",
        "NIST SP 811 — 1 kWh = 3.6 MJ exactly"
      ],
      "vectors": [
        {
          "name": "500 kWh is 17.06 therms",
          "inputs": {
            "kilowattHours": 500
          },
          "expected": 17.060708,
          "toleranceDecimalPlaces": 5,
          "unit": "therms",
          "confidence": "high",
          "steps": [
            {
              "label": "Kilowatt-hours entered",
              "value": 500,
              "unit": "kWh"
            },
            {
              "label": "Therms",
              "value": 17.060708165639838,
              "unit": "therms"
            },
            {
              "label": "BTU",
              "value": 1706070.8165639837,
              "unit": "BTU"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "1 kWh is 0.03412 therms",
          "inputs": {
            "kilowattHours": 1
          },
          "expected": 0.034121416,
          "toleranceDecimalPlaces": 7,
          "unit": "therms",
          "confidence": "high",
          "steps": [
            {
              "label": "Kilowatt-hours entered",
              "value": 1,
              "unit": "kWh"
            },
            {
              "label": "Therms",
              "value": 0.03412141633127968,
              "unit": "therms"
            },
            {
              "label": "BTU",
              "value": 3412.141633127968,
              "unit": "BTU"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "29.307107 kWh is exactly one therm",
          "inputs": {
            "kilowattHours": 29.307107
          },
          "expected": 1,
          "toleranceDecimalPlaces": 6,
          "unit": "therms",
          "confidence": "high",
          "steps": [
            {
              "label": "Kilowatt-hours entered",
              "value": 29.307107,
              "unit": "kWh"
            },
            {
              "label": "Therms",
              "value": 0.999999999412361,
              "unit": "therms"
            },
            {
              "label": "BTU",
              "value": 99999.99994123609,
              "unit": "BTU"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "1000 kWh is 34.12 therms",
          "inputs": {
            "kilowattHours": 1000
          },
          "expected": 34.121416,
          "toleranceDecimalPlaces": 5,
          "unit": "therms",
          "confidence": "high",
          "steps": [
            {
              "label": "Kilowatt-hours entered",
              "value": 1000,
              "unit": "kWh"
            },
            {
              "label": "Therms",
              "value": 34.121416331279676,
              "unit": "therms"
            },
            {
              "label": "BTU",
              "value": 3412141.6331279674,
              "unit": "BTU"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "labor-cost-calculator",
      "title": "Labor Cost Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/labor-cost-calculator/",
      "sources": [
        "Total labor cost = estimated hours x hourly rate x crew size"
      ],
      "vectors": [
        {
          "name": "40 hours, $45/hr, 2-person crew",
          "inputs": {
            "estimatedHours": 40,
            "hourlyRate": 45,
            "crewSize": 2
          },
          "expected": 3600,
          "toleranceDecimalPlaces": 0,
          "unit": "$ (estimated labor cost)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total crew-hours",
              "value": 80,
              "unit": "hours"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "20 hours, $60/hr, solo",
          "inputs": {
            "estimatedHours": 20,
            "hourlyRate": 60,
            "crewSize": 1
          },
          "expected": 1200,
          "toleranceDecimalPlaces": 0,
          "unit": "$ (estimated labor cost)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total crew-hours",
              "value": 20,
              "unit": "hours"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "ladder-setup-angle-calculator",
      "title": "Extension Ladder Setup Angle & Placement Safety Checker",
      "url": "https://craftquantities.com/calculators/materials-quantities/ladder-setup-angle-calculator/",
      "sources": [
        "Per OSHA 29 CFR 1926.1053(b)(5)(i) (verified against the regulatory text): 'Non-self-supporting ladders shall be used at an angle such that the horizontal distance from the top support to the foot of the ladder is approximately one-quarter of the working length of the ladder' — the standard 4:1 ratio, corresponding to a ladder angle of approximately 75.5° from horizontal. Per 1926.1053(b)(1) (verified): when used for access to an upper landing surface, 'the ladder side rails shall extend at least 3 feet (.9 m) above the upper landing surface.'"
      ],
      "vectors": [
        {
          "name": "8ft working length, 2ft base distance, 1.0m landing extension (compliant)",
          "inputs": {
            "workingLength": 8,
            "baseDistance": 2,
            "landingExtension": 1
          },
          "expected": 4,
          "toleranceDecimalPlaces": 1,
          "unit": ":1 (target 4:1)",
          "confidence": "high",
          "steps": [
            {
              "label": "Resulting ladder angle from horizontal",
              "value": 75.52248781407008,
              "unit": "°(target ~75.5°)"
            },
            {
              "label": "Landing extension",
              "value": 3.280839895013123,
              "unit": "ft (OSHA min 3 ft)"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "10ft working length, 2.2ft base distance, 0.8m landing extension (extension fails)",
          "inputs": {
            "workingLength": 10,
            "baseDistance": 2.2,
            "landingExtension": 0.8
          },
          "expected": 4.545,
          "toleranceDecimalPlaces": 1,
          "unit": ":1 (target 4:1)",
          "confidence": "low",
          "steps": [
            {
              "label": "Resulting ladder angle from horizontal",
              "value": 77.29096700560457,
              "unit": "°(target ~75.5°)"
            },
            {
              "label": "Landing extension",
              "value": 2.6246719160104988,
              "unit": "ft (OSHA min 3 ft)"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "land-area-converter",
      "title": "Land Area Converter",
      "url": "https://craftquantities.com/calculators/measurements-conversions/land-area-converter/",
      "sources": [
        "Exact conversion factors: 1 acre = 43,560 sq ft = 4,046.8564224 m² = 0.404685642 hectares"
      ],
      "vectors": [
        {
          "name": "1 acre to other units",
          "inputs": {
            "value": 1,
            "fromUnit": "acre"
          },
          "expected": 1,
          "toleranceDecimalPlaces": 5,
          "unit": "acres",
          "confidence": "high",
          "steps": [
            {
              "label": "Hectares",
              "value": 0.404685642,
              "unit": "ha"
            },
            {
              "label": "Square feet",
              "value": 43560,
              "unit": "sq ft"
            },
            {
              "label": "Square meters",
              "value": 4046.8564224,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "10000 sq m to acres",
          "inputs": {
            "value": 10000,
            "fromUnit": "sqm"
          },
          "expected": 2.4711,
          "toleranceDecimalPlaces": 3,
          "unit": "acres",
          "confidence": "high",
          "steps": [
            {
              "label": "Hectares",
              "value": 0.9999999994069471,
              "unit": "ha"
            },
            {
              "label": "Square feet",
              "value": 107639.10416709722,
              "unit": "sq ft"
            },
            {
              "label": "Square meters",
              "value": 10000,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "land-clearing-debris-volume-calculator",
      "title": "Land Clearing & Grubbing Debris Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/land-clearing-debris-volume-calculator/",
      "sources": [
        "Debris volume = Cleared Area × Average Brush/Root Mat Depth — a standard area-times-depth volumetric estimate applied to land clearing and grubbing debris, analogous to any other area-times-depth material takeoff (e.g. topsoil stripping)."
      ],
      "vectors": [
        {
          "name": "2000m² area, 0.6m average depth",
          "inputs": {
            "clearedArea": 2000,
            "avgDebrisDepth": 0.6
          },
          "expected": 1200,
          "toleranceDecimalPlaces": 0,
          "unit": "m³",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "5000m² area, 0.9m average depth",
          "inputs": {
            "clearedArea": 5000,
            "avgDebrisDepth": 0.9
          },
          "expected": 4500,
          "toleranceDecimalPlaces": 0,
          "unit": "m³",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "landfill-tipping-fee-calculator",
      "title": "Landfill Tipping Fee Cost Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/landfill-tipping-fee-calculator/",
      "sources": [
        "Total disposal cost = Debris Weight × Tipping Fee Rate per US short ton — tipping fees are set individually by each landfill/transfer station/facility and vary widely by region, facility type, and material category (e.g. clean concrete/asphalt recycling fees are often much lower than mixed C&D landfill rates)."
      ],
      "vectors": [
        {
          "name": "12 tons at $65/ton",
          "inputs": {
            "debrisWeight": 10886.21688,
            "feePerTon": 65
          },
          "expected": 780,
          "toleranceDecimalPlaces": 0,
          "unit": "$",
          "confidence": "medium",
          "steps": [
            {
              "label": "Debris weight",
              "value": 10886.21688,
              "unit": "kg"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "20 tons at $85/ton",
          "inputs": {
            "debrisWeight": 18143.6948,
            "feePerTon": 85
          },
          "expected": 1700,
          "toleranceDecimalPlaces": 0,
          "unit": "$",
          "confidence": "medium",
          "steps": [
            {
              "label": "Debris weight",
              "value": 18143.6948,
              "unit": "kg"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "landscape-fabric-calculator",
      "title": "Landscape Fabric Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/landscape-fabric-calculator/",
      "sources": [
        "A standard landscape/weed barrier fabric roll covers approximately 300 sq ft, per common retail roll sizes"
      ],
      "vectors": [
        {
          "name": "40m² bed area",
          "inputs": {
            "bedArea": 40
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Area to cover (with overlap allowance)",
              "value": 473.6120583352278,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "80m² bed area",
          "inputs": {
            "bedArea": 80
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Area to cover (with overlap allowance)",
              "value": 947.2241166704556,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "80m² bed with no overlap allowance",
          "inputs": {
            "bedArea": 80,
            "overlapPercent": 0
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Area to cover (with overlap allowance)",
              "value": 861.1128333367777,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "landscape-lighting-transformer-calculator",
      "title": "Landscape Lighting Transformer Calculator",
      "url": "https://craftquantities.com/calculators/electrical/landscape-lighting-transformer-calculator/",
      "sources": [
        "Recommended transformer wattage = total connected fixture wattage x (1 + safety margin), rounded up to the nearest standard transformer size (150, 300, 600, 900, 1200 W)"
      ],
      "vectors": [
        {
          "name": "300W fixtures, 20% margin",
          "inputs": {
            "totalFixtureWatts": 300,
            "safetyMarginPercent": 20
          },
          "expected": 600,
          "toleranceDecimalPlaces": 0,
          "unit": "W",
          "confidence": "high",
          "steps": [
            {
              "label": "Minimum required capacity",
              "value": 360,
              "unit": "W"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "100W fixtures, 20% margin",
          "inputs": {
            "totalFixtureWatts": 100,
            "safetyMarginPercent": 20
          },
          "expected": 150,
          "toleranceDecimalPlaces": 0,
          "unit": "W",
          "confidence": "high",
          "steps": [
            {
              "label": "Minimum required capacity",
              "value": 120,
              "unit": "W"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "landscape-lighting-wire-calculator",
      "title": "Landscape Lighting Wire Calculator",
      "url": "https://craftquantities.com/calculators/electrical/landscape-lighting-wire-calculator/",
      "sources": [
        "Voltage drop (round trip) = 2 x current (A) x resistance per foot x length (ft), using standard uncoated-copper DC resistance at 25 C: 1.02, 1.62, 2.58 and 4.09 ohms per 1000 ft for 10, 12, 14 and 16 AWG",
        "For 12V landscape lighting, keeping voltage drop under about 10% (1.2V) is a common guideline to avoid dim or flickering fixtures"
      ],
      "vectors": [
        {
          "name": "60W load, 15m run, 12 AWG",
          "inputs": {
            "totalWatts": 60,
            "runLength": 15,
            "wireGauge": "12"
          },
          "expected": 0.8,
          "toleranceDecimalPlaces": 1,
          "unit": "V drop",
          "confidence": "medium",
          "steps": [
            {
              "label": "Current draw",
              "value": 5,
              "unit": "A"
            },
            {
              "label": "Voltage drop",
              "value": 6.643700787401576,
              "unit": "%"
            },
            {
              "label": "Voltage at fixture",
              "value": 11.202755905511811,
              "unit": "V"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "100W load, 30m run, 16 AWG",
          "inputs": {
            "totalWatts": 100,
            "runLength": 30,
            "wireGauge": "16"
          },
          "expected": 6.71,
          "toleranceDecimalPlaces": 1,
          "unit": "V drop",
          "confidence": "low",
          "steps": [
            {
              "label": "Current draw",
              "value": 8.333333333333334,
              "unit": "A"
            },
            {
              "label": "Voltage drop",
              "value": 55.91097987751531,
              "unit": "%"
            },
            {
              "label": "Voltage at fixture",
              "value": 5.290682414698163,
              "unit": "V"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "lap-siding-fastener-schedule-calculator",
      "title": "Lap Siding Fastener Schedule Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/lap-siding-fastener-schedule-calculator/",
      "sources": [
        "Courses = wall height ÷ exposure, rounded up. Fastening points per course = the stud lines the elevation crosses, plus one for the far end, times the fasteners each pattern drives at a stud, plus any high-wind extras you enter.",
        "The manufacturer's evaluation report is the fastening schedule of record for fibre cement and engineered lap cladding — fastener type, length, penetration and pattern are product-specific and none of them is assumed here.",
        "ASCE/SEI 7, Minimum Design Loads and Associated Criteria for Buildings and Other Structures — the source of the component and cladding pressure that decides whether a high-wind pattern applies to this elevation"
      ],
      "vectors": [
        {
          "name": "2.7 m by 12 m elevation, blind nailed at 406 mm centres",
          "inputs": {
            "wallHeight": 2.7,
            "wallLength": 12,
            "exposure": 0.1778,
            "studSpacing": 0.4064,
            "fastenerPattern": "blind",
            "extraPerCourse": 0,
            "fastenersPerBox": 800,
            "wastePercent": 10
          },
          "expected": 546,
          "toleranceDecimalPlaces": 0,
          "unit": "fasteners",
          "confidence": "high",
          "steps": [
            {
              "label": "Courses on this elevation",
              "value": 16,
              "unit": "courses"
            },
            {
              "label": "Stud lines the elevation crosses",
              "value": 31,
              "unit": "studs"
            },
            {
              "label": "Fastening points per course",
              "value": 31,
              "unit": "fasteners"
            },
            {
              "label": "Count before the waste allowance",
              "value": 496,
              "unit": "fasteners"
            },
            {
              "label": "Boxes to order",
              "value": 1,
              "unit": "boxes"
            }
          ],
          "includesAllowance": {
            "label": "Dropped and misfired fixing allowance",
            "percent": 10
          },
          "basis": "ambiguous"
        },
        {
          "name": "Same elevation blind and face nailed",
          "inputs": {
            "wallHeight": 2.7,
            "wallLength": 12,
            "exposure": 0.1778,
            "studSpacing": 0.4064,
            "fastenerPattern": "both",
            "extraPerCourse": 0,
            "fastenersPerBox": 800,
            "wastePercent": 10
          },
          "expected": 1092,
          "toleranceDecimalPlaces": 0,
          "unit": "fasteners",
          "confidence": "high",
          "steps": [
            {
              "label": "Courses on this elevation",
              "value": 16,
              "unit": "courses"
            },
            {
              "label": "Stud lines the elevation crosses",
              "value": 31,
              "unit": "studs"
            },
            {
              "label": "Fastening points per course",
              "value": 62,
              "unit": "fasteners"
            },
            {
              "label": "Count before the waste allowance",
              "value": 992,
              "unit": "fasteners"
            },
            {
              "label": "Boxes to order",
              "value": 2,
              "unit": "boxes"
            }
          ],
          "includesAllowance": {
            "label": "Dropped and misfired fixing allowance",
            "percent": 10
          },
          "basis": "ambiguous"
        },
        {
          "name": "3 m by 9 m at 610 mm centres, one high-wind extra, no waste",
          "inputs": {
            "wallHeight": 3,
            "wallLength": 9,
            "exposure": 0.2032,
            "studSpacing": 0.6096,
            "fastenerPattern": "face",
            "extraPerCourse": 1,
            "fastenersPerBox": 500,
            "wastePercent": 0
          },
          "expected": 255,
          "toleranceDecimalPlaces": 0,
          "unit": "fasteners",
          "confidence": "high",
          "steps": [
            {
              "label": "Courses on this elevation",
              "value": 15,
              "unit": "courses"
            },
            {
              "label": "Stud lines the elevation crosses",
              "value": 16,
              "unit": "studs"
            },
            {
              "label": "Fastening points per course",
              "value": 17,
              "unit": "fasteners"
            },
            {
              "label": "Count before the waste allowance",
              "value": 255,
              "unit": "fasteners"
            },
            {
              "label": "Boxes to order",
              "value": 1,
              "unit": "boxes"
            }
          ],
          "includesAllowance": {
            "label": "Dropped and misfired fixing allowance",
            "percent": 0
          },
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "lawn-edging-calculator",
      "title": "Lawn Edging Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/lawn-edging-calculator/",
      "sources": [
        "Open run: pieces = (edge length - overlap) / (piece length - overlap), rounded up; closed loop: pieces = edge length / (piece length - overlap), rounded up. Joints = pieces - 1 open, pieces closed. Stakes = edge length / stake spacing, rounded up, plus one on an open run."
      ],
      "vectors": [
        {
          "name": "20 m open edge, 6.1 m coils, butt connectors",
          "inputs": {
            "edgeLength": 20,
            "runShape": "open",
            "product": "coil",
            "pieceLength": 6.1,
            "jointOverlap": 0,
            "stakeSpacing": 0.9
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "coils",
          "confidence": "high",
          "steps": [
            {
              "label": "Coil size",
              "value": 6.1,
              "unit": "m"
            },
            {
              "label": "Edging bought",
              "value": 24.4,
              "unit": "m"
            },
            {
              "label": "Connectors, one per joint",
              "value": 3
            },
            {
              "label": "Left over after the last cut",
              "value": 4.399999999999999,
              "unit": "m"
            },
            {
              "label": "Stakes",
              "value": 24
            },
            {
              "label": "Stake centres, as set out",
              "value": 0.8695652173913043,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "12 m bed loop, 2.4 m straight lengths lapped 100 mm",
          "inputs": {
            "edgeLength": 12,
            "runShape": "loop",
            "product": "straight",
            "pieceLength": 2.4,
            "jointOverlap": 0.1,
            "stakeSpacing": 0.75
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "lengths",
          "confidence": "high",
          "steps": [
            {
              "label": "Length size",
              "value": 2.4,
              "unit": "m"
            },
            {
              "label": "Edging bought",
              "value": 14.399999999999999,
              "unit": "m"
            },
            {
              "label": "Joints between lengths",
              "value": 6
            },
            {
              "label": "Lost to overlaps",
              "value": 0.6000000000000001,
              "unit": "m"
            },
            {
              "label": "Left over after the last cut",
              "value": 1.7999999999999985,
              "unit": "m"
            },
            {
              "label": "Stakes",
              "value": 16
            },
            {
              "label": "Stake centres, as set out",
              "value": 0.75,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "20 m open edge, 6.1 m coils lapped 150 mm",
          "inputs": {
            "edgeLength": 20,
            "runShape": "open",
            "product": "coil",
            "pieceLength": 6.1,
            "jointOverlap": 0.15,
            "stakeSpacing": 0.9
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "coils",
          "confidence": "high",
          "steps": [
            {
              "label": "Coil size",
              "value": 6.1,
              "unit": "m"
            },
            {
              "label": "Edging bought",
              "value": 24.4,
              "unit": "m"
            },
            {
              "label": "Connectors, one per joint",
              "value": 3
            },
            {
              "label": "Lost to overlaps",
              "value": 0.44999999999999996,
              "unit": "m"
            },
            {
              "label": "Left over after the last cut",
              "value": 3.9499999999999984,
              "unit": "m"
            },
            {
              "label": "Stakes",
              "value": 24
            },
            {
              "label": "Stake centres, as set out",
              "value": 0.8695652173913043,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "12 m open edge, 3 m lengths, no overlap — an exact multiple adds no piece",
          "inputs": {
            "edgeLength": 12,
            "runShape": "open",
            "product": "straight",
            "pieceLength": 3,
            "jointOverlap": 0,
            "stakeSpacing": 1
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "lengths",
          "confidence": "high",
          "steps": [
            {
              "label": "Length size",
              "value": 3,
              "unit": "m"
            },
            {
              "label": "Edging bought",
              "value": 12,
              "unit": "m"
            },
            {
              "label": "Joints between lengths",
              "value": 3
            },
            {
              "label": "Left over after the last cut",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Stakes",
              "value": 13
            },
            {
              "label": "Stake centres, as set out",
              "value": 1,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "18 m open edge, 6 m lengths lapped 300 mm — the overlaps cost a fourth length",
          "inputs": {
            "edgeLength": 18,
            "runShape": "open",
            "product": "straight",
            "pieceLength": 6,
            "jointOverlap": 0.3,
            "stakeSpacing": 1
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "lengths",
          "confidence": "high",
          "steps": [
            {
              "label": "Length size",
              "value": 6,
              "unit": "m"
            },
            {
              "label": "Edging bought",
              "value": 24,
              "unit": "m"
            },
            {
              "label": "Joints between lengths",
              "value": 3
            },
            {
              "label": "Lost to overlaps",
              "value": 0.8999999999999999,
              "unit": "m"
            },
            {
              "label": "Left over after the last cut",
              "value": 5.1,
              "unit": "m"
            },
            {
              "label": "Stakes",
              "value": 19
            },
            {
              "label": "Stake centres, as set out",
              "value": 1,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "lawn-fertiliser-calculator",
      "title": "Lawn Fertiliser Calculator",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/lawn-fertiliser-calculator/",
      "sources": [
        "Typical cool-season lawn nitrogen rate: 25-50 kg N per hectare per application (0.5-1.0 lb N per 1000 ft²) — university turf extension guidance",
        "Product application rate = target N rate ÷ (N percentage ÷ 100)"
      ],
      "vectors": [
        {
          "name": "200 m², 20% N, 0.35 kg/100 m²",
          "inputs": {
            "area": 200,
            "nitrogenPercent": 20,
            "targetNitrogenRate": 0.35
          },
          "expected": 3.5,
          "toleranceDecimalPlaces": 1,
          "unit": "kg of product",
          "confidence": "medium",
          "steps": [
            {
              "label": "Nitrogen delivered",
              "value": 0.7,
              "unit": "kg N"
            },
            {
              "label": "Product in pounds",
              "value": 7.716179176470714,
              "unit": "lb"
            },
            {
              "label": "Rate per 100 m²",
              "value": 1.7499999999999998,
              "unit": "kg/100 m²"
            },
            {
              "label": "Rate per 1000 ft²",
              "value": 3.5842825133941285,
              "unit": "lb/1000 ft²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A weaker product needs more of it",
          "inputs": {
            "area": 200,
            "nitrogenPercent": 10,
            "targetNitrogenRate": 0.35
          },
          "expected": 7,
          "toleranceDecimalPlaces": 1,
          "unit": "kg of product",
          "confidence": "medium",
          "steps": [
            {
              "label": "Nitrogen delivered",
              "value": 0.7,
              "unit": "kg N"
            },
            {
              "label": "Product in pounds",
              "value": 15.432358352941428,
              "unit": "lb"
            },
            {
              "label": "Rate per 100 m²",
              "value": 3.4999999999999996,
              "unit": "kg/100 m²"
            },
            {
              "label": "Rate per 1000 ft²",
              "value": 7.168565026788257,
              "unit": "lb/1000 ft²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A higher target rate",
          "inputs": {
            "area": 200,
            "nitrogenPercent": 20,
            "targetNitrogenRate": 0.5
          },
          "expected": 5,
          "toleranceDecimalPlaces": 1,
          "unit": "kg of product",
          "confidence": "medium",
          "steps": [
            {
              "label": "Nitrogen delivered",
              "value": 1,
              "unit": "kg N"
            },
            {
              "label": "Product in pounds",
              "value": 11.023113109243878,
              "unit": "lb"
            },
            {
              "label": "Rate per 100 m²",
              "value": 2.5,
              "unit": "kg/100 m²"
            },
            {
              "label": "Rate per 1000 ft²",
              "value": 5.120403590563042,
              "unit": "lb/1000 ft²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Zero area needs no product",
          "inputs": {
            "area": 0,
            "nitrogenPercent": 20,
            "targetNitrogenRate": 0.35
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "kg of product",
          "confidence": "medium",
          "steps": [
            {
              "label": "Nitrogen delivered",
              "value": 0,
              "unit": "kg N"
            },
            {
              "label": "Product in pounds",
              "value": 0,
              "unit": "lb"
            },
            {
              "label": "Rate per 100 m²",
              "value": 0,
              "unit": "kg/100 m²"
            },
            {
              "label": "Rate per 1000 ft²",
              "value": 0,
              "unit": "lb/1000 ft²"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "lawn-mowing-time-calculator",
      "title": "Lawn Mowing Time Calculator",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/lawn-mowing-time-calculator/",
      "sources": [
        "Mowing time = lawn area / (effective mower width x speed); effective width accounts for overlap and turns lost during mowing"
      ],
      "vectors": [
        {
          "name": "1000m² lawn, 22in mower, 2.5mph, 85% efficiency",
          "inputs": {
            "lawnArea": 1000,
            "mowerWidth": 0.559,
            "mowingSpeedMph": 2.5,
            "overlapEfficiencyPercent": 85
          },
          "expected": 31.4,
          "toleranceDecimalPlaces": 1,
          "unit": "minutes",
          "confidence": "medium",
          "steps": [
            {
              "label": "Effective coverage rate",
              "value": 342.95603674540683,
              "unit": "sq ft/min"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2000m² lawn, 24in mower, 3mph, 80% efficiency",
          "inputs": {
            "lawnArea": 2000,
            "mowerWidth": 0.6096,
            "mowingSpeedMph": 3,
            "overlapEfficiencyPercent": 80
          },
          "expected": 50.97,
          "toleranceDecimalPlaces": 2,
          "unit": "minutes",
          "confidence": "medium",
          "steps": [
            {
              "label": "Effective coverage rate",
              "value": 422.40000000000003,
              "unit": "sq ft/min"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "layout-squaring-calculator",
      "title": "Squaring Calculator for Layout and Setting Out (3-4-5 Rule)",
      "url": "https://craftquantities.com/calculators/measurements-conversions/layout-squaring-calculator/",
      "sources": [
        "Euclid, Elements, Book I, Proposition 48 (D. E. Joyce's edition, Clark University): if the square on one side of a triangle equals the squares on the other two together, the angle between those two is right — which is why any multiple of 3, 4 and 5 makes a square corner — and Proposition 47, its converse, which gives the expected diagonal √(a² + b²)",
        "The QUIKRETE Companies, Layout Basics for Slabs and Footers: stake out with the 3-4-5 triangular method, any multiple such as 6-8-10 or 9-12-15 giving the same result, then double-check for squareness by measuring the diagonals between opposite corners, which should be equal; batter boards set back from the work keep the lines",
        "NIST Digital Library of Mathematical Functions, §4.42 Solution of Triangles, the law of cosines (4.42.5): the corner angle from its two sides and the diagonal across it, and, applied to the two halves of a parallelogram, d₁² + d₂² = 2(a² + b²) and d₁² − d₂² = 4ab·cos θ, from which the racked shift and angle follow"
      ],
      "vectors": [
        {
          "name": "3 and 4 from the corner: the diagonal reads 5",
          "inputs": {
            "baseSide": 4,
            "otherSide": 3,
            "checkBy": "one",
            "measuredDiagonal": 5
          },
          "expected": 5,
          "toleranceDecimalPlaces": 9,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Squaring triangle: leg along the longer side",
              "value": 12,
              "unit": "ft"
            },
            {
              "label": "Squaring triangle: leg along the shorter side",
              "value": 9,
              "unit": "ft"
            },
            {
              "label": "Squaring triangle: diagonal between the two marks",
              "value": 15,
              "unit": "ft"
            },
            {
              "label": "Measured diagonal less the square figure",
              "value": 0,
              "unit": "mm"
            },
            {
              "label": "Angle at the corner",
              "value": 90,
              "unit": "°"
            },
            {
              "label": "Corner out of square by",
              "value": 0,
              "unit": "°"
            },
            {
              "label": "Move the far end of the second side by",
              "value": 0,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "the setting-out guide's 8 by 5 base reads 9.434 corner to corner",
          "inputs": {
            "baseSide": 8,
            "otherSide": 5,
            "checkBy": "one",
            "measuredDiagonal": 9.45
          },
          "expected": 9.433981,
          "toleranceDecimalPlaces": 5,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Squaring triangle: leg along the longer side",
              "value": 20,
              "unit": "ft"
            },
            {
              "label": "Squaring triangle: leg along the shorter side",
              "value": 15,
              "unit": "ft"
            },
            {
              "label": "Squaring triangle: diagonal between the two marks",
              "value": 25,
              "unit": "ft"
            },
            {
              "label": "Measured diagonal less the square figure",
              "value": 16.01886794339613,
              "unit": "mm"
            },
            {
              "label": "Angle at the corner",
              "value": 90.21665018255794,
              "unit": "°"
            },
            {
              "label": "Corner out of square by",
              "value": 0.21665018255794166,
              "unit": "°"
            },
            {
              "label": "Move the far end of the second side by",
              "value": 18.906249999998792,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a 24 by 16 ft (7.32 by 4.88 m) slab reads 28.844 ft (8.792 m) corner to corner",
          "inputs": {
            "baseSide": 7.3152,
            "otherSide": 4.8768,
            "checkBy": "two",
            "diagonalDifference": 0.0127
          },
          "expected": 8.791776,
          "toleranceDecimalPlaces": 5,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Squaring triangle: leg along the longer side",
              "value": 20,
              "unit": "ft"
            },
            {
              "label": "Squaring triangle: leg along the shorter side",
              "value": 15,
              "unit": "ft"
            },
            {
              "label": "Squaring triangle: diagonal between the two marks",
              "value": 25,
              "unit": "ft"
            },
            {
              "label": "Longer diagonal the sides and the difference imply",
              "value": 8.798123936896921,
              "unit": "m"
            },
            {
              "label": "Shorter diagonal the sides and the difference imply",
              "value": 8.785423936896922,
              "unit": "m"
            },
            {
              "label": "Corners out of square by",
              "value": 0.08966271759396992,
              "unit": "°"
            },
            {
              "label": "Slide the far side along the base line by",
              "value": 7.631748209111912,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "learning-curve-repetition-calculator",
      "title": "Repetition Learning Curve Calculator (Wright and Crawford)",
      "url": "https://craftquantities.com/calculators/financial-adjacent/learning-curve-repetition-calculator/",
      "sources": [
        "Crawford's unit learning curve: the time for the nth unit is T1 × n^b, where b = log(learning rate) ÷ log 2, so each doubling of the quantity multiplies the unit time by the learning rate; the run's total is the sum of the unit times",
        "Wright's cumulative average learning curve (T. P. Wright, 1936, Factors Affecting the Cost of Airplanes): the average time over the first n units is T1 × n^b, so the run's total is n times that average and the nth unit takes the difference between successive totals; the same rate gives a different answer under the two models"
      ],
      "vectors": [
        {
          "name": "The defaults: 20 units at 90%, Crawford",
          "inputs": {
            "firstUnit": 40,
            "rate": 90,
            "units": 20,
            "model": "crawford"
          },
          "expected": 584.310379,
          "toleranceDecimalPlaces": 3,
          "unit": "hours",
          "confidence": "medium",
          "steps": [
            {
              "label": "Time for unit 20, the last",
              "value": 25.368769782444453,
              "unit": "hours"
            },
            {
              "label": "Average time per unit",
              "value": 29.215518966080232,
              "unit": "hours"
            },
            {
              "label": "Time the run would take with no learning",
              "value": 800,
              "unit": "hours"
            },
            {
              "label": "Time the learning saves",
              "value": 215.68962067839539,
              "unit": "hours"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The same run under Wright's model",
          "inputs": {
            "firstUnit": 40,
            "rate": 90,
            "units": 20,
            "model": "wright"
          },
          "expected": 507.375396,
          "toleranceDecimalPlaces": 3,
          "unit": "hours",
          "confidence": "medium",
          "steps": [
            {
              "label": "Time for unit 20, the last",
              "value": 21.596001187014622,
              "unit": "hours"
            },
            {
              "label": "Average time per unit",
              "value": 25.368769782444453,
              "unit": "hours"
            },
            {
              "label": "Time the run would take with no learning",
              "value": 800,
              "unit": "hours"
            },
            {
              "label": "Time the learning saves",
              "value": 292.6246043511109,
              "unit": "hours"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Eight units at 85%, Crawford",
          "inputs": {
            "firstUnit": 120,
            "rate": 85,
            "units": 8,
            "model": "crawford"
          },
          "expected": 712.301398,
          "toleranceDecimalPlaces": 3,
          "unit": "hours",
          "confidence": "medium",
          "steps": [
            {
              "label": "Time for unit 8, the last",
              "value": 73.695,
              "unit": "hours"
            },
            {
              "label": "Average time per unit",
              "value": 89.03767469339871,
              "unit": "hours"
            },
            {
              "label": "Time the run would take with no learning",
              "value": 960,
              "unit": "hours"
            },
            {
              "label": "Time the learning saves",
              "value": 247.6986024528103,
              "unit": "hours"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Eight units at 85%, Wright",
          "inputs": {
            "firstUnit": 120,
            "rate": 85,
            "units": 8,
            "model": "wright"
          },
          "expected": 589.56,
          "toleranceDecimalPlaces": 3,
          "unit": "hours",
          "confidence": "medium",
          "steps": [
            {
              "label": "Time for unit 8, the last",
              "value": 57.28856511007291,
              "unit": "hours"
            },
            {
              "label": "Average time per unit",
              "value": 73.695,
              "unit": "hours"
            },
            {
              "label": "Time the run would take with no learning",
              "value": 960,
              "unit": "hours"
            },
            {
              "label": "Time the learning saves",
              "value": 370.44000000000005,
              "unit": "hours"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "No learning at 100%",
          "inputs": {
            "firstUnit": 10,
            "rate": 100,
            "units": 12,
            "model": "crawford"
          },
          "expected": 120,
          "toleranceDecimalPlaces": 3,
          "unit": "hours",
          "confidence": "medium",
          "steps": [
            {
              "label": "Time for unit 12, the last",
              "value": 10,
              "unit": "hours"
            },
            {
              "label": "Average time per unit",
              "value": 10,
              "unit": "hours"
            },
            {
              "label": "Time the run would take with no learning",
              "value": 120,
              "unit": "hours"
            },
            {
              "label": "Time the learning saves",
              "value": 0,
              "unit": "hours"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Two units at 80%, Wright",
          "inputs": {
            "firstUnit": 60,
            "rate": 80,
            "units": 2,
            "model": "wright"
          },
          "expected": 96,
          "toleranceDecimalPlaces": 3,
          "unit": "hours",
          "confidence": "medium",
          "steps": [
            {
              "label": "Time for unit 2, the last",
              "value": 36,
              "unit": "hours"
            },
            {
              "label": "Average time per unit",
              "value": 48,
              "unit": "hours"
            },
            {
              "label": "Time the run would take with no learning",
              "value": 120,
              "unit": "hours"
            },
            {
              "label": "Time the learning saves",
              "value": 24,
              "unit": "hours"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "led-strip-power-supply-calculator",
      "title": "LED Strip Power Supply Calculator",
      "url": "https://craftquantities.com/calculators/electrical/led-strip-power-supply-calculator/",
      "sources": [
        "Total load = strip length x watts per foot (from the strip's spec sheet); a safety margin keeps the power supply from running at its rated maximum continuously"
      ],
      "vectors": [
        {
          "name": "5m strip, 2.4 W/ft, 20% margin",
          "inputs": {
            "stripLength": 5,
            "wattsPerFoot": 2.4,
            "safetyMarginPercent": 20
          },
          "expected": 47.24,
          "toleranceDecimalPlaces": 0.5,
          "unit": "W (recommended supply rating)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Raw strip load",
              "value": 39.37007874015748,
              "unit": "W"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "10m strip, 3 W/ft, 25% margin",
          "inputs": {
            "stripLength": 10,
            "wattsPerFoot": 3,
            "safetyMarginPercent": 25
          },
          "expected": 123.03,
          "toleranceDecimalPlaces": 1,
          "unit": "W (recommended supply rating)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Raw strip load",
              "value": 98.4251968503937,
              "unit": "W"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "ledger-lag-screw-count-calculator",
      "title": "Ledger Lag Screw Shear Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/ledger-lag-screw-count-calculator/",
      "sources": [
        "Deck ledger lag screw shear capacity is governed by NDS/IRC fastener tables specific to screw diameter, species, and ledger/rim board thickness — this calculator divides your total required shear load by your own fastener's rated capacity from that table"
      ],
      "vectors": [
        {
          "name": "15kN load, 1.8kN per screw",
          "inputs": {
            "totalLoad": 15000,
            "perFastenerCapacity": 1800
          },
          "expected": 9,
          "toleranceDecimalPlaces": 0,
          "unit": "screws",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "25kN load, 1.9kN per screw",
          "inputs": {
            "totalLoad": 25000,
            "perFastenerCapacity": 1900
          },
          "expected": 14,
          "toleranceDecimalPlaces": 0,
          "unit": "screws",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "leed-recycled-content-value-calculator",
      "title": "LEED Recycled Content Value Calculator",
      "url": "https://craftquantities.com/calculators/sustainability-compliance/leed-recycled-content-value-calculator/",
      "sources": [
        "Recycled content value = (post-consumer fraction + ½ pre-consumer fraction) × material cost — the ISO 14021 based convention used in LEED materials credits",
        "Mechanical, electrical and plumbing components are excluded from the materials cost denominator in LEED calculations"
      ],
      "vectors": [
        {
          "name": "25% post-consumer and 20% pre-consumer on $50,000",
          "inputs": {
            "materialCost": 50000,
            "postConsumer": 25,
            "preConsumer": 20,
            "totalMaterialsCost": 800000
          },
          "expected": 17500,
          "toleranceDecimalPlaces": 2,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weighted recycled fraction",
              "value": 35,
              "unit": "%"
            },
            {
              "label": "Share of total materials cost",
              "value": 2.1875,
              "unit": "%"
            },
            {
              "label": "Post-consumer contribution",
              "value": 12500,
              "unit": "currency"
            },
            {
              "label": "Pre-consumer contribution at half weight",
              "value": 5000,
              "unit": "currency"
            },
            {
              "label": "Total materials cost",
              "value": 800000,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Pre-consumer alone counts at half",
          "inputs": {
            "materialCost": 50000,
            "postConsumer": 0,
            "preConsumer": 20,
            "totalMaterialsCost": 800000
          },
          "expected": 5000,
          "toleranceDecimalPlaces": -2,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weighted recycled fraction",
              "value": 10,
              "unit": "%"
            },
            {
              "label": "Share of total materials cost",
              "value": 0.625,
              "unit": "%"
            },
            {
              "label": "Post-consumer contribution",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Pre-consumer contribution at half weight",
              "value": 5000,
              "unit": "currency"
            },
            {
              "label": "Total materials cost",
              "value": 800000,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Post-consumer alone counts in full",
          "inputs": {
            "materialCost": 50000,
            "postConsumer": 25,
            "preConsumer": 0,
            "totalMaterialsCost": 800000
          },
          "expected": 12500,
          "toleranceDecimalPlaces": 2,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weighted recycled fraction",
              "value": 25,
              "unit": "%"
            },
            {
              "label": "Share of total materials cost",
              "value": 1.5625,
              "unit": "%"
            },
            {
              "label": "Post-consumer contribution",
              "value": 12500,
              "unit": "currency"
            },
            {
              "label": "Pre-consumer contribution at half weight",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Total materials cost",
              "value": 800000,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Fully post-consumer material",
          "inputs": {
            "materialCost": 50000,
            "postConsumer": 100,
            "preConsumer": 0,
            "totalMaterialsCost": 800000
          },
          "expected": 50000,
          "toleranceDecimalPlaces": 2,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weighted recycled fraction",
              "value": 100,
              "unit": "%"
            },
            {
              "label": "Share of total materials cost",
              "value": 6.25,
              "unit": "%"
            },
            {
              "label": "Post-consumer contribution",
              "value": 50000,
              "unit": "currency"
            },
            {
              "label": "Pre-consumer contribution at half weight",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Total materials cost",
              "value": 800000,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "light-gauge-track-linear-footage-calculator",
      "title": "Light-Gauge Steel Track Linear Footage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/light-gauge-track-linear-footage-calculator/",
      "sources": [
        "A stud wall requires one continuous track at the top and one at the bottom of the same length: total track length = 2 × wall length × (1 + waste allowance)"
      ],
      "vectors": [
        {
          "name": "10m wall, 5% waste",
          "inputs": {
            "wallLength": 10,
            "wastePercent": 5
          },
          "expected": 21,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15m wall, 8% waste",
          "inputs": {
            "wallLength": 15,
            "wastePercent": 8
          },
          "expected": 32.4,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "lighting-circuit-load-calculator",
      "title": "Lighting Circuit Connected Load Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/lighting-circuit-load-calculator/",
      "sources": [
        "Connected load = fixture count × watts per fixture; per NEC 210.19/210.20, a continuously-loaded branch circuit's total load must not exceed 80% of the breaker's rating (equivalently, the breaker must be rated at least load ÷ 0.8)"
      ],
      "vectors": [
        {
          "name": "12 fixtures, 60W, 120V, 20A breaker (pass)",
          "inputs": {
            "fixtureCount": 12,
            "wattsPerFixture": 60,
            "circuitVoltage": 120,
            "breakerRating": 20
          },
          "expected": 720,
          "toleranceDecimalPlaces": 0,
          "unit": "W",
          "confidence": "medium",
          "steps": [
            {
              "label": "Circuit current draw",
              "value": 6,
              "unit": "A"
            },
            {
              "label": "Maximum continuous load (80% of breaker)",
              "value": 16,
              "unit": "A"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "20 fixtures, 75W, 120V, 20A breaker (pass)",
          "inputs": {
            "fixtureCount": 20,
            "wattsPerFixture": 75,
            "circuitVoltage": 120,
            "breakerRating": 20
          },
          "expected": 1500,
          "toleranceDecimalPlaces": 0,
          "unit": "W",
          "confidence": "medium",
          "steps": [
            {
              "label": "Circuit current draw",
              "value": 12.5,
              "unit": "A"
            },
            {
              "label": "Maximum continuous load (80% of breaker)",
              "value": 16,
              "unit": "A"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "10 downlights, 10W, 230V, 6A MCB (UK lighting circuit)",
          "inputs": {
            "fixtureCount": 10,
            "wattsPerFixture": 10,
            "circuitVoltage": 230,
            "breakerRating": 6
          },
          "expected": 100,
          "toleranceDecimalPlaces": 0,
          "unit": "W",
          "confidence": "medium",
          "steps": [
            {
              "label": "Circuit current draw",
              "value": 0.43478260869565216,
              "unit": "A"
            },
            {
              "label": "Maximum continuous load (80% of breaker)",
              "value": 4.800000000000001,
              "unit": "A"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "40 halogens, 50W, 230V, 6A MCB (fails)",
          "inputs": {
            "fixtureCount": 40,
            "wattsPerFixture": 50,
            "circuitVoltage": 230,
            "breakerRating": 6
          },
          "expected": 2000,
          "toleranceDecimalPlaces": 0,
          "unit": "W",
          "confidence": "medium",
          "steps": [
            {
              "label": "Circuit current draw",
              "value": 8.695652173913043,
              "unit": "A"
            },
            {
              "label": "Maximum continuous load (80% of breaker)",
              "value": 4.800000000000001,
              "unit": "A"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "lighting-illuminance-calculator",
      "title": "Lighting Illuminance (Lux) Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/lighting-illuminance-calculator/",
      "sources": [
        "Illuminance = total lumens ÷ illuminated area, the basic photometric relationship defining lux (lumens per square meter)"
      ],
      "vectors": [
        {
          "name": "4000 lm over 20 m²",
          "inputs": {
            "totalLumens": 4000,
            "roomArea": 20
          },
          "expected": 200,
          "toleranceDecimalPlaces": 0,
          "unit": "lux",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "6000 lm over 25 m²",
          "inputs": {
            "totalLumens": 6000,
            "roomArea": 25
          },
          "expected": 240,
          "toleranceDecimalPlaces": 0,
          "unit": "lux",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "lightning-rod-protection-calculator",
      "title": "Lightning Rod (Air Terminal) Cone of Protection Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/lightning-rod-protection-calculator/",
      "sources": [
        "Classical cone-of-protection method: protected radius = rod height × tan(protection angle), where the protection angle depends on the terminal's height and the desired protection class per NFPA 780 (this simplified cone method is a traditional approach; NFPA 780 also provides the more comprehensive rolling sphere method for modern lightning protection system design)"
      ],
      "vectors": [
        {
          "name": "10m terminal, 45° protection angle",
          "inputs": {
            "rodHeight": 10,
            "protectionAngle": 45
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15m terminal, 60° protection angle",
          "inputs": {
            "rodHeight": 15,
            "protectionAngle": 60
          },
          "expected": 25.98,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "lime-mortar-mix-calculator",
      "title": "Lime Mortar Mix Calculator (NHL and Lime Putty)",
      "url": "https://craftquantities.com/calculators/materials-quantities/lime-mortar-mix-calculator/",
      "sources": [
        "NHL yield: Hanson Natural Hydraulic Lime NHL 3,5 Technical Data Sheet (updated April 2020), standard mixes per 25 kg bag, measured with heavy-duty 15 litre buckets of sand at 7% moisture: 6, 7 and 9 buckets of sand at 1 : 2, 1 : 2½ and 1 : 3 make 0.09, 0.10 and 0.12 m³ of mortar, so a volume of sand makes 1.00, 0.95 and 0.89 of its own volume in mortar. The same sheet gives the working temperatures and says mortar should in general be weaker than the masonry it is used with",
        "Putty yield: Hanson Castle Lime Putty technical data sheet (L006(Hc)/08/09), BS EN 459-1 CL 90: proportioned with 2½ to 3 parts sand by volume, the putty fills the spaces between the sand particles without adding to the overall volume, so the coarse stuff equals the volume of sand used. Bulk density 1,220 to 1,320 kg/m³; sold in 17 litre tubs",
        "NHL 3.5 density and the default ratio: Saint-Astier NHL 3.5 technical data sheet (édition Décembre 2023, 23346): bulk density 0.45 to 0.75 kg/l under BS EN 459, typical 0.65 kg/l; 25 kg bag; pointing medium to soft natural stone and brick at 1 NHL 3.5 to 2.5 sand; not below 8 °C or above 30 °C, wet mortar protected from frost for at least 10 days",
        "NHL 2 density: Saint-Astier NHL 2 technical data sheet (édition Décembre 2023, 23346): bulk density 0.4 to 0.7 kg/l under BS EN 459, typical 0.5 kg/l; 25 kg bag; pointing medium to soft stone and brick at 1 NHL 2 to 2.5 sand",
        "NHL 5 density and the North American bag: Saint-Astier NHL 5 technical data sheet, US distributor edition (édition Octobre 2024, 24277): bulk density 0.5 to 0.8 kg/l under NF EN 459, typical 0.7 kg/l (43.7 lb/ft³); packed as a 25 kg bag labelled 55 lb",
        "Sand, putty and hydrate densities, and what the mortar types contain: ASTM C270-19a, Standard Specification for Mortar for Unit Masonry, 6.1.1 and Note 9: lime putty 80 pcf (1,280 kg/m³); hydrated lime 40 pcf (640 kg/m³); sand 80 pcf, the weight of dry sand in one cubic foot of damp, loose sand. Aggregate is measured damp and loose. Section 5.1 permits each of Types M, S, N and O as a cement-lime, mortar cement or masonry cement mortar, and Table 2's cement-lime Type O carries over 1¼ to 2½ parts hydrated lime per part of portland cement",
        "US putty bucket and a caution on fixed ratios: Lancaster Lime Works, Architectural Lime Putty, 5 gallon bucket, listed weight 58 lb (product listing, which does not say whether the pail is included); and Proper Ratio of Lime to Sand (16 April 2022): the putty must fill the void space within the sand, the right proportion varies from sand to sand and load to load and is found by testing the sand's voids, and specifications calling for fixed ratios such as 1:2 or 1:3 are described as misleading",
        "UK putty tub: Cornish Lime, Mature Lime Putty (product listing): 10 kg and 25 kg tubs, approximate bulk density 1,350 kg/m³, usually mixed at 1 : 3 or 2 : 5",
        "Who decides the mortar: NPS Preservation Brief 2, Repointing Mortar Joints in Historic Masonry Buildings (Robert C. Mack and John P. Speweik, October 1998): the new mortar must be as vapor permeable as, and as soft or softer than, the historic mortar; for repointing, hydrated lime should conform to ASTM C 207, Type S or Type SA",
        "Dry hydrated lime: National Lime Association, Fact Sheet: Hydrated Lime for Masonry Purposes (June 2002): ASTM C207 Type S and SA, approximate bulk density 40 lb/ft³, packed in 50 lb (22.7 kg) bags"
      ],
      "vectors": [
        {
          "name": "100 L of NHL 3.5 at 1 : 2½, 10% waste, 25 kg bags",
          "inputs": {
            "mortarVolume": 100,
            "binder": "nhl35",
            "ratio": "2.5",
            "nhl35Density": 650,
            "sandDensity": 1280,
            "bagMass": 25,
            "tubMass": 25,
            "wastePercent": 10
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "bags",
          "confidence": "high",
          "steps": [
            {
              "label": "Mortar to make, waste included",
              "value": 110.00000000000001,
              "unit": "L"
            },
            {
              "label": "Lime by volume",
              "value": 46.20000000000001,
              "unit": "L"
            },
            {
              "label": "Lime by weight",
              "value": 30.03000000000001,
              "unit": "kg"
            },
            {
              "label": "Sand by volume, damp and loose",
              "value": 115.50000000000003,
              "unit": "L"
            },
            {
              "label": "Sand by weight, dry",
              "value": 0.14784000000000003,
              "unit": "t"
            },
            {
              "label": "Lime and sand together, by weight",
              "value": 0.17787000000000003,
              "unit": "t"
            },
            {
              "label": "Mortar each bag or tub makes",
              "value": 91.57509157509158,
              "unit": "L"
            }
          ],
          "includesAllowance": {
            "label": "Waste allowance",
            "percent": 10
          },
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "200 L of lime putty at 1 : 3, no waste, 25 kg tubs",
          "inputs": {
            "mortarVolume": 200,
            "binder": "putty",
            "ratio": "3",
            "puttyDensity": 1280,
            "sandDensity": 1280,
            "bagMass": 25,
            "tubMass": 25,
            "wastePercent": 0
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "tubs",
          "confidence": "high",
          "steps": [
            {
              "label": "Mortar to make, waste included",
              "value": 200,
              "unit": "L"
            },
            {
              "label": "Lime by volume",
              "value": 66.66666666666667,
              "unit": "L"
            },
            {
              "label": "Lime by weight",
              "value": 85.33333333333333,
              "unit": "kg"
            },
            {
              "label": "Sand by volume, damp and loose",
              "value": 200,
              "unit": "L"
            },
            {
              "label": "Sand by weight, dry",
              "value": 0.256,
              "unit": "t"
            },
            {
              "label": "Lime and sand together, by weight",
              "value": 0.3413333333333333,
              "unit": "t"
            },
            {
              "label": "Mortar each bag or tub makes",
              "value": 58.59375,
              "unit": "L"
            }
          ],
          "includesAllowance": {
            "label": "Waste allowance",
            "percent": 0
          },
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "250 L of NHL 2 at 1 : 2, 10% waste, 25 kg bags",
          "inputs": {
            "mortarVolume": 250,
            "binder": "nhl2",
            "ratio": "2",
            "nhl2Density": 500,
            "sandDensity": 1280,
            "bagMass": 25,
            "tubMass": 25,
            "wastePercent": 10
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "bags",
          "confidence": "high",
          "steps": [
            {
              "label": "Mortar to make, waste included",
              "value": 275,
              "unit": "L"
            },
            {
              "label": "Lime by volume",
              "value": 137.5,
              "unit": "L"
            },
            {
              "label": "Lime by weight",
              "value": 68.75,
              "unit": "kg"
            },
            {
              "label": "Sand by volume, damp and loose",
              "value": 275,
              "unit": "L"
            },
            {
              "label": "Sand by weight, dry",
              "value": 0.352,
              "unit": "t"
            },
            {
              "label": "Lime and sand together, by weight",
              "value": 0.42074999999999996,
              "unit": "t"
            },
            {
              "label": "Mortar each bag or tub makes",
              "value": 100,
              "unit": "L"
            }
          ],
          "includesAllowance": {
            "label": "Waste allowance",
            "percent": 10
          },
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1 m³ of NHL 5 at 1 : 3, 5% waste, 25 kg bags",
          "inputs": {
            "mortarVolume": 1000,
            "binder": "nhl5",
            "ratio": "3",
            "nhl5Density": 700,
            "sandDensity": 1280,
            "bagMass": 25,
            "tubMass": 25,
            "wastePercent": 5
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "bags",
          "confidence": "high",
          "steps": [
            {
              "label": "Mortar to make, waste included",
              "value": 1050,
              "unit": "L"
            },
            {
              "label": "Lime by volume",
              "value": 393.75,
              "unit": "L"
            },
            {
              "label": "Lime by weight",
              "value": 275.625,
              "unit": "kg"
            },
            {
              "label": "Sand by volume, damp and loose",
              "value": 1181.25,
              "unit": "L"
            },
            {
              "label": "Sand by weight, dry",
              "value": 1.512,
              "unit": "t"
            },
            {
              "label": "Lime and sand together, by weight",
              "value": 1.787625,
              "unit": "t"
            },
            {
              "label": "Mortar each bag or tub makes",
              "value": 95.23809523809523,
              "unit": "L"
            }
          ],
          "includesAllowance": {
            "label": "Waste allowance",
            "percent": 5
          },
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "lime-stabilization-calculator",
      "title": "Soil Stabilization Lime Content Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/lime-stabilization-calculator/",
      "sources": [
        "Lime mass = soil volume × soil dry density × target lime content percentage (by dry weight), the standard method for proportioning lime in lime-soil stabilization"
      ],
      "vectors": [
        {
          "name": "100m³ soil, 1600 kg/m³, 4% lime",
          "inputs": {
            "soilVolume": 100000,
            "soilDensity": 1600,
            "limePercent": 4
          },
          "expected": 6400,
          "toleranceDecimalPlaces": -1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150m³ soil, 1700 kg/m³, 5% lime",
          "inputs": {
            "soilVolume": 150000,
            "soilDensity": 1700,
            "limePercent": 5
          },
          "expected": 12750,
          "toleranceDecimalPlaces": -1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "line-striping-paint-calculator",
      "title": "Line Striping Paint Calculator",
      "url": "https://craftquantities.com/calculators/auto-utility/line-striping-paint-calculator/",
      "sources": [
        "A standard 4 in wide traffic paint line covers approximately 300 linear ft per gallon, a widely cited coverage rate for line-striping paint"
      ],
      "vectors": [
        {
          "name": "200m of lines",
          "inputs": {
            "stripingLength": 200
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "gallons",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total line length",
              "value": 656.1679790026246,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "500m of lines",
          "inputs": {
            "stripingLength": 500
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "gallons",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total line length",
              "value": 1640.4199475065616,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "linear-feet-to-studs-16-oc-calculator",
      "title": "Linear Feet to Studs Calculator (16 in OC)",
      "url": "https://craftquantities.com/calculators/renovation-construction/linear-feet-to-studs-16-oc-calculator/",
      "sources": [
        "16 in on centre spacing gives 0.75 studs per linear foot of wall",
        "24 in on centre gives 0.5 studs per linear foot; advanced framing uses this where the structure permits"
      ],
      "vectors": [
        {
          "name": "40 ft wall",
          "inputs": {
            "linearFeet": 40
          },
          "expected": 31,
          "toleranceDecimalPlaces": 0,
          "unit": "studs",
          "confidence": "high",
          "steps": [
            {
              "label": "Studs at 16 in centres, before the closing stud",
              "value": 30,
              "unit": "studs"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A length off the 16 in module still returns a whole count",
          "inputs": {
            "linearFeet": 33
          },
          "expected": 26,
          "toleranceDecimalPlaces": 0,
          "unit": "studs",
          "confidence": "high",
          "steps": [
            {
              "label": "Studs at 16 in centres, before the closing stud",
              "value": 25,
              "unit": "studs"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "10 ft wall",
          "inputs": {
            "linearFeet": 10
          },
          "expected": 9,
          "toleranceDecimalPlaces": 0,
          "unit": "studs",
          "confidence": "high",
          "steps": [
            {
              "label": "Studs at 16 in centres, before the closing stud",
              "value": 8,
              "unit": "studs"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "lintel-bearing-length-calculator",
      "title": "Masonry Lintel Bearing Length Checker",
      "url": "https://craftquantities.com/calculators/materials-quantities/lintel-bearing-length-calculator/",
      "sources": [
        "Standard building code minimum lintel bearing length is 4 in on each end; steel or reinforced masonry lintels require at least 5 in bearing; the Portland Cement Association recommends a minimum of 6 in for concrete lintels"
      ],
      "vectors": [
        {
          "name": "4in provided, general (4in min, pass)",
          "inputs": {
            "providedBearingLength": 0.1016,
            "lintelType": "general"
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "in",
          "confidence": "medium",
          "steps": [
            {
              "label": "Required minimum",
              "value": 4,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "4in provided, steel-reinforced (5in min, fail)",
          "inputs": {
            "providedBearingLength": 0.1016,
            "lintelType": "steel-reinforced"
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "in",
          "confidence": "medium",
          "steps": [
            {
              "label": "Required minimum",
              "value": 5,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "lintel-load-capacity-calculator",
      "title": "Masonry Lintel Uniform Load Capacity Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/lintel-load-capacity-calculator/",
      "sources": [
        "Simply-supported beam under uniform load: maximum moment Mmax = wL²/8; rearranged to solve for allowable uniform load: w(max) = 8 x Mallow / L²"
      ],
      "vectors": [
        {
          "name": "15kN·m allowable moment, 1.5m span",
          "inputs": {
            "allowableMoment": 15,
            "span": 1.5
          },
          "expected": 53.33,
          "toleranceDecimalPlaces": 1,
          "unit": "kN/m",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "25kN·m allowable moment, 2m span",
          "inputs": {
            "allowableMoment": 25,
            "span": 2
          },
          "expected": 50,
          "toleranceDecimalPlaces": 0,
          "unit": "kN/m",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "liquid-waterproofing-volume-calculator",
      "title": "Cold-Applied Liquid Waterproofing Membrane Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/liquid-waterproofing-volume-calculator/",
      "sources": [
        "Wet film thickness = target dry film thickness ÷ solids content fraction, since liquid-applied membranes lose volume as solvent/water evaporates during cure; material volume = area × wet film thickness"
      ],
      "vectors": [
        {
          "name": "50m², 60 mil DFT, 80% solids",
          "inputs": {
            "area": 50,
            "dryFilmThickness": 60,
            "solidsContent": 80
          },
          "expected": 95.25,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Required wet film thickness",
              "value": 75,
              "unit": "mils"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "70m², 80 mil DFT, 75% solids",
          "inputs": {
            "area": 70,
            "dryFilmThickness": 80,
            "solidsContent": 75
          },
          "expected": 189.65,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Required wet film thickness",
              "value": 106.66666666666667,
              "unit": "mils"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "liters-per-100km-to-mpg-calculator",
      "title": "L/100km to MPG Calculator",
      "url": "https://craftquantities.com/calculators/auto-utility/liters-per-100km-to-mpg-calculator/",
      "sources": [
        "US MPG = 235.214583 / (L/100km), derived from 1 US gallon = 3.785411784 L and 1 mile = 1.609344 km",
        "Imperial MPG uses 282.481 instead, because an imperial gallon is larger"
      ],
      "vectors": [
        {
          "name": "10 L/100km converts correctly",
          "inputs": {
            "litresPer100km": 10
          },
          "expected": 23.5214583,
          "toleranceDecimalPlaces": 6,
          "unit": "US MPG",
          "confidence": "high",
          "steps": [],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "litresPer100km": 100
          },
          "expected": 2.35214583,
          "toleranceDecimalPlaces": 6,
          "unit": "US MPG",
          "confidence": "high",
          "steps": [],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "liters-per-minute-to-gpm-calculator",
      "title": "Litres per Minute to GPM Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/liters-per-minute-to-gpm-calculator/",
      "sources": [
        "1 US gallon = 3.785411784 L, so 1 L/min = 0.264172 GPM"
      ],
      "vectors": [
        {
          "name": "38 L/min converts correctly",
          "inputs": {
            "litresPerMinute": 38
          },
          "expected": 10.03853798960964,
          "toleranceDecimalPlaces": 6,
          "unit": "GPM",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.26417205235814845,
              "unit": "GPM per L/min"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "litresPerMinute": 380
          },
          "expected": 100.38537989609641,
          "toleranceDecimalPlaces": 6,
          "unit": "GPM",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.26417205235814845,
              "unit": "GPM per L/min"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "liters-per-second-to-cfm-calculator",
      "title": "Litres per Second to CFM Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/liters-per-second-to-cfm-calculator/",
      "sources": [
        "This is the reciprocal of 0.4719474432. Exactly, 1 L/s = 60 / 28.316846592 = 39062500 / 18435447 CFM = 2.118880003289315…, and that decimal repeats rather than terminating. The definition underneath it (1 ft = 0.3048 m exactly) is exact, but the multiplier shown here is that exact fraction rounded — at 16 significant figures, so the rounding is nowhere near any airflow you will ever meter."
      ],
      "vectors": [
        {
          "name": "250 L/s converts correctly",
          "inputs": {
            "litresPerSecond": 250
          },
          "expected": 529.7200008223288,
          "toleranceDecimalPlaces": 6,
          "unit": "CFM",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 2.118880003289315,
              "unit": "CFM per L/s"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "litresPerSecond": 2500
          },
          "expected": 5297.200008223287,
          "toleranceDecimalPlaces": 6,
          "unit": "CFM",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 2.118880003289315,
              "unit": "CFM per L/s"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "liters-per-second-to-cubic-meters-per-hour-calculator",
      "title": "Litres per Second to Cubic Metres per Hour Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/liters-per-second-to-cubic-meters-per-hour-calculator/",
      "sources": [
        "SI Brochure, 9th edition — the litre is 10⁻³ m³ and the hour 3,600 s, from which the factor of 3.6 follows exactly",
        "NIST SP 811 — SI prefixes and the accepted non-SI units litre and hour"
      ],
      "vectors": [
        {
          "name": "20 L/s is 72 m³/h",
          "inputs": {
            "litersPerSecond": 20
          },
          "expected": 72,
          "toleranceDecimalPlaces": 6,
          "unit": "m³/h",
          "confidence": "high",
          "steps": [
            {
              "label": "Litres per second entered",
              "value": 20,
              "unit": "L/s"
            },
            {
              "label": "Cubic metres per hour",
              "value": 72,
              "unit": "m³/h"
            },
            {
              "label": "Litres per minute",
              "value": 1200,
              "unit": "L/min"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "1 L/s is 3.6 m³/h",
          "inputs": {
            "litersPerSecond": 1
          },
          "expected": 3.6,
          "toleranceDecimalPlaces": 6,
          "unit": "m³/h",
          "confidence": "high",
          "steps": [
            {
              "label": "Litres per second entered",
              "value": 1,
              "unit": "L/s"
            },
            {
              "label": "Cubic metres per hour",
              "value": 3.6,
              "unit": "m³/h"
            },
            {
              "label": "Litres per minute",
              "value": 60,
              "unit": "L/min"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "5 L/s is 18 m³/h",
          "inputs": {
            "litersPerSecond": 5
          },
          "expected": 18,
          "toleranceDecimalPlaces": 6,
          "unit": "m³/h",
          "confidence": "high",
          "steps": [
            {
              "label": "Litres per second entered",
              "value": 5,
              "unit": "L/s"
            },
            {
              "label": "Cubic metres per hour",
              "value": 18,
              "unit": "m³/h"
            },
            {
              "label": "Litres per minute",
              "value": 300,
              "unit": "L/min"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "100 L/s is 360 m³/h",
          "inputs": {
            "litersPerSecond": 100
          },
          "expected": 360,
          "toleranceDecimalPlaces": 6,
          "unit": "m³/h",
          "confidence": "high",
          "steps": [
            {
              "label": "Litres per second entered",
              "value": 100,
              "unit": "L/s"
            },
            {
              "label": "Cubic metres per hour",
              "value": 360,
              "unit": "m³/h"
            },
            {
              "label": "Litres per minute",
              "value": 6000,
              "unit": "L/min"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "liters-to-cubic-feet-calculator",
      "title": "Litres to Cubic Feet Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/liters-to-cubic-feet-calculator/",
      "sources": [
        "NIST SP 811, Appendix B — 1 ft³ = 0.02831685 m³",
        "International yard and pound agreement, 1959 — the foot is exactly 0.3048 m, so 1 ft³ = 0.3048³ m³ = 28.316846592 L exactly",
        "BIPM, The International System of Units (SI Brochure), 9th edition — the litre is 1 dm³ = 0.001 m³"
      ],
      "vectors": [
        {
          "name": "28.316846592 L is 1 cu ft",
          "inputs": {
            "litres": 28.316846592
          },
          "expected": 1,
          "toleranceDecimalPlaces": 6,
          "unit": "cu ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Litres entered",
              "value": 28.316846592,
              "unit": "L"
            },
            {
              "label": "Cubic feet",
              "value": 0.9999999999999999,
              "unit": "cu ft"
            },
            {
              "label": "Cubic metres",
              "value": 0.028316846592,
              "unit": "m³"
            },
            {
              "label": "US gallons",
              "value": 7.480519480519481,
              "unit": "US gal"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A 50 L bag is 1.765733336 cu ft",
          "inputs": {
            "litres": 50
          },
          "expected": 1.765733336,
          "toleranceDecimalPlaces": 6,
          "unit": "cu ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Litres entered",
              "value": 50,
              "unit": "L"
            },
            {
              "label": "Cubic feet",
              "value": 1.7657333360744292,
              "unit": "cu ft"
            },
            {
              "label": "Cubic metres",
              "value": 0.05,
              "unit": "m³"
            },
            {
              "label": "US gallons",
              "value": 13.20860261790742,
              "unit": "US gal"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "1,000 L is 35.314666721 cu ft",
          "inputs": {
            "litres": 1000
          },
          "expected": 35.314666721,
          "toleranceDecimalPlaces": 6,
          "unit": "cu ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Litres entered",
              "value": 1000,
              "unit": "L"
            },
            {
              "label": "Cubic feet",
              "value": 35.314666721488585,
              "unit": "cu ft"
            },
            {
              "label": "Cubic metres",
              "value": 1,
              "unit": "m³"
            },
            {
              "label": "US gallons",
              "value": 264.17205235814845,
              "unit": "US gal"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A 125 L drum is 4.41433334 cu ft",
          "inputs": {
            "litres": 125
          },
          "expected": 4.41433334,
          "toleranceDecimalPlaces": 6,
          "unit": "cu ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Litres entered",
              "value": 125,
              "unit": "L"
            },
            {
              "label": "Cubic feet",
              "value": 4.414333340186073,
              "unit": "cu ft"
            },
            {
              "label": "Cubic metres",
              "value": 0.125,
              "unit": "m³"
            },
            {
              "label": "US gallons",
              "value": 33.021506544768556,
              "unit": "US gal"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "liters-to-imperial-gallons-calculator",
      "title": "Litres to Imperial Gallons Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/liters-to-imperial-gallons-calculator/",
      "sources": [
        "Weights and Measures Act 1985 (UK): 1 imperial gallon = 4.54609 litres exactly"
      ],
      "vectors": [
        {
          "name": "1000 L converts correctly",
          "inputs": {
            "liters": 1000
          },
          "expected": 219.96924829908775,
          "toleranceDecimalPlaces": 6,
          "unit": "imp gal",
          "confidence": "high",
          "steps": [
            {
              "label": "Same volume in US gallons",
              "value": 264.17205235814845,
              "unit": "US gal"
            },
            {
              "label": "Same volume in cubic metres",
              "value": 1,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "liters": 10000
          },
          "expected": 2199.6924829908776,
          "toleranceDecimalPlaces": 6,
          "unit": "imp gal",
          "confidence": "high",
          "steps": [
            {
              "label": "Same volume in US gallons",
              "value": 2641.720523581484,
              "unit": "US gal"
            },
            {
              "label": "Same volume in cubic metres",
              "value": 10,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "liters-to-us-gallons-calculator",
      "title": "Litres to US Gallons Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/liters-to-us-gallons-calculator/",
      "sources": [
        "1 L = 1 / 3.785411784 US gallons = 0.2641720524 US gal"
      ],
      "vectors": [
        {
          "name": "20 L converts correctly",
          "inputs": {
            "litres": 20
          },
          "expected": 5.2834410471629685,
          "toleranceDecimalPlaces": 6,
          "unit": "US gal",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.26417205235814845,
              "unit": "US gal per L"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "litres": 200
          },
          "expected": 52.83441047162969,
          "toleranceDecimalPlaces": 6,
          "unit": "US gal",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.26417205235814845,
              "unit": "US gal per L"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "livestock-fence-wire-calculator",
      "title": "Livestock Fence Wire Calculator",
      "url": "https://craftquantities.com/calculators/auto-utility/livestock-fence-wire-calculator/",
      "sources": [
        "Total wire length = perimeter x number of strands; standard agricultural fence wire rolls are commonly 1,320 ft (1/4 mile)"
      ],
      "vectors": [
        {
          "name": "200m perimeter, 4 strands",
          "inputs": {
            "perimeterLength": 200,
            "strands": 4
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Total wire length (with waste)",
              "value": 2755.9055118110236,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "400m perimeter, 5 strands",
          "inputs": {
            "perimeterLength": 400,
            "strands": 5
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Total wire length (with waste)",
              "value": 6889.763779527559,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "loan-to-value-and-deposit-calculator",
      "title": "Loan-to-Value & Deposit Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/loan-to-value-and-deposit-calculator/",
      "sources": [
        "LVR = loan ÷ property value. An 80% LVR is the near-universal threshold above which lenders require mortgage insurance (LMI in Australia, CMHC or private insurance in Canada, PMI in the United States)",
        "Premium amounts are commercial pricing and are not published as a public table; this calculator computes the threshold, not the premium"
      ],
      "vectors": [
        {
          "name": "$500,000 with a $75,000 deposit",
          "inputs": {
            "propertyValue": 500000,
            "deposit": 75000,
            "targetLvr": 80
          },
          "expected": 85,
          "toleranceDecimalPlaces": 0,
          "unit": "%",
          "confidence": "high",
          "steps": [
            {
              "label": "Loan amount",
              "value": 425000,
              "unit": "currency"
            },
            {
              "label": "Deposit as a share of value",
              "value": 15,
              "unit": "%"
            },
            {
              "label": "Deposit needed for 80% LVR",
              "value": 99999.99999999997,
              "unit": "currency"
            },
            {
              "label": "Shortfall against that target",
              "value": 24999.99999999997,
              "unit": "currency"
            },
            {
              "label": "Equity at completion",
              "value": 75000,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A 20% deposit lands exactly on 80%",
          "inputs": {
            "propertyValue": 500000,
            "deposit": 100000,
            "targetLvr": 80
          },
          "expected": 80,
          "toleranceDecimalPlaces": 0,
          "unit": "%",
          "confidence": "high",
          "steps": [
            {
              "label": "Loan amount",
              "value": 400000,
              "unit": "currency"
            },
            {
              "label": "Deposit as a share of value",
              "value": 20,
              "unit": "%"
            },
            {
              "label": "Deposit needed for 80% LVR",
              "value": 99999.99999999997,
              "unit": "currency"
            },
            {
              "label": "Shortfall against that target",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Equity at completion",
              "value": 100000,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A cash purchase has no loan",
          "inputs": {
            "propertyValue": 500000,
            "deposit": 500000,
            "targetLvr": 80
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "%",
          "confidence": "high",
          "steps": [
            {
              "label": "Loan amount",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Deposit as a share of value",
              "value": 100,
              "unit": "%"
            },
            {
              "label": "Deposit needed for 80% LVR",
              "value": 99999.99999999997,
              "unit": "currency"
            },
            {
              "label": "Shortfall against that target",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Equity at completion",
              "value": 500000,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "No deposit is 100% LVR",
          "inputs": {
            "propertyValue": 500000,
            "deposit": 0,
            "targetLvr": 80
          },
          "expected": 100,
          "toleranceDecimalPlaces": 0,
          "unit": "%",
          "confidence": "high",
          "steps": [
            {
              "label": "Loan amount",
              "value": 500000,
              "unit": "currency"
            },
            {
              "label": "Deposit as a share of value",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Deposit needed for 80% LVR",
              "value": 99999.99999999997,
              "unit": "currency"
            },
            {
              "label": "Shortfall against that target",
              "value": 99999.99999999997,
              "unit": "currency"
            },
            {
              "label": "Equity at completion",
              "value": 0,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "loft-conversion-cost-calculator",
      "title": "Loft Conversion Cost Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/loft-conversion-cost-calculator/",
      "sources": [
        "Element-based build-up. Rates are user-supplied; no market data is embedded.",
        "Existing ceiling joists are almost never adequate as floor joists; a new structural floor is standard scope"
      ],
      "vectors": [
        {
          "name": "25 m² conversion, fully built up",
          "inputs": {
            "convertedArea": 25,
            "buildRate": 1900,
            "structuralFloor": 7000,
            "staircase": 5500,
            "dormerOrRooflight": 9000,
            "fireAndEscape": 3200,
            "professionalFees": 4200,
            "contingencyPercent": 15
          },
          "expected": 87230,
          "toleranceDecimalPlaces": 2,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Conversion shell and finishes",
              "value": 47500,
              "unit": "currency"
            },
            {
              "label": "New structural floor",
              "value": 7000,
              "unit": "currency"
            },
            {
              "label": "Staircase and the room below",
              "value": 5500,
              "unit": "currency"
            },
            {
              "label": "Dormer or rooflights",
              "value": 9000,
              "unit": "currency"
            },
            {
              "label": "Fire safety and escape",
              "value": 3200,
              "unit": "currency"
            },
            {
              "label": "Professional fees",
              "value": 4200,
              "unit": "currency"
            },
            {
              "label": "Contingency",
              "value": 10830,
              "unit": "currency"
            },
            {
              "label": "All-in cost per unit of usable floor",
              "value": 3489.2,
              "unit": "currency/m²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Rooflights instead of a dormer",
          "inputs": {
            "convertedArea": 25,
            "buildRate": 1900,
            "structuralFloor": 7000,
            "staircase": 5500,
            "dormerOrRooflight": 2500,
            "fireAndEscape": 3200,
            "professionalFees": 4200,
            "contingencyPercent": 15
          },
          "expected": 79755,
          "toleranceDecimalPlaces": 2,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Conversion shell and finishes",
              "value": 47500,
              "unit": "currency"
            },
            {
              "label": "New structural floor",
              "value": 7000,
              "unit": "currency"
            },
            {
              "label": "Staircase and the room below",
              "value": 5500,
              "unit": "currency"
            },
            {
              "label": "Dormer or rooflights",
              "value": 2500,
              "unit": "currency"
            },
            {
              "label": "Fire safety and escape",
              "value": 3200,
              "unit": "currency"
            },
            {
              "label": "Professional fees",
              "value": 4200,
              "unit": "currency"
            },
            {
              "label": "Contingency",
              "value": 9855,
              "unit": "currency"
            },
            {
              "label": "All-in cost per unit of usable floor",
              "value": 3190.2,
              "unit": "currency/m²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "The shell alone",
          "inputs": {
            "convertedArea": 25,
            "buildRate": 1900,
            "structuralFloor": 0,
            "staircase": 0,
            "dormerOrRooflight": 0,
            "fireAndEscape": 0,
            "professionalFees": 0,
            "contingencyPercent": 0
          },
          "expected": 47500,
          "toleranceDecimalPlaces": 2,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Conversion shell and finishes",
              "value": 47500,
              "unit": "currency"
            },
            {
              "label": "New structural floor",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Staircase and the room below",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Dormer or rooflights",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Fire safety and escape",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Professional fees",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Contingency",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "All-in cost per unit of usable floor",
              "value": 1900,
              "unit": "currency/m²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A larger loft",
          "inputs": {
            "convertedArea": 45,
            "buildRate": 1900,
            "structuralFloor": 7000,
            "staircase": 5500,
            "dormerOrRooflight": 9000,
            "fireAndEscape": 3200,
            "professionalFees": 4200,
            "contingencyPercent": 15
          },
          "expected": 128630,
          "toleranceDecimalPlaces": -4,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Conversion shell and finishes",
              "value": 85500,
              "unit": "currency"
            },
            {
              "label": "New structural floor",
              "value": 7000,
              "unit": "currency"
            },
            {
              "label": "Staircase and the room below",
              "value": 5500,
              "unit": "currency"
            },
            {
              "label": "Dormer or rooflights",
              "value": 9000,
              "unit": "currency"
            },
            {
              "label": "Fire safety and escape",
              "value": 3200,
              "unit": "currency"
            },
            {
              "label": "Professional fees",
              "value": 4200,
              "unit": "currency"
            },
            {
              "label": "Contingency",
              "value": 16530,
              "unit": "currency"
            },
            {
              "label": "All-in cost per unit of usable floor",
              "value": 2909.5555555555557,
              "unit": "currency/m²"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "low-slope-cricket-taper-calculator",
      "title": "Low-Slope Roof Cricket Taper Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/low-slope-cricket-taper-calculator/",
      "sources": [
        "Thickness at the curb = half the obstruction width × the cricket's slope ratio. Board courses per side = half width ÷ taper board length, each course gaining board length × the slope ratio. Plane geometry; no code figure is involved.",
        "NRCA Roofing Manual: Membrane Roof Systems — the reference describing crickets and saddles behind curbs on low-slope roofs. The cricket slope itself is a project specification and is entered here rather than assumed.",
        "The ridge check is arithmetic on the two slopes entered: the ridge must lose its full thickness over the run available, so its taper rate is thickness ÷ run, and what is left of the field slope after that is the ridge's own rise going upslope."
      ],
      "vectors": [
        {
          "name": "2.4 m curb, half per 12 cricket on a quarter per 12 field",
          "inputs": {
            "obstructionWidth": 2.4,
            "cricketSlope": 0.5,
            "fieldSlope": 0.25,
            "availableRun": 3,
            "taperBoardLength": 1.2192
          },
          "expected": 50,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Half-width the taper runs across",
              "value": 1.2,
              "unit": "m"
            },
            {
              "label": "Tapered board courses per side",
              "value": 1,
              "unit": "courses"
            },
            {
              "label": "Thickness gained per board course",
              "value": 50.8,
              "unit": "mm"
            },
            {
              "label": "Ridge taper over the available run",
              "value": 0.2,
              "unit": "rise per 12"
            },
            {
              "label": "Net rise of the cricket ridge going upslope",
              "value": 0.04999999999999999,
              "unit": "rise per 12"
            },
            {
              "label": "Field rise over the same run",
              "value": 62.5,
              "unit": "mm"
            },
            {
              "label": "Cricket slope as a multiple of the field slope",
              "value": 2,
              "unit": "x field slope"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "3.6 m curb, one per 12 cricket on a half per 12 field",
          "inputs": {
            "obstructionWidth": 3.6,
            "cricketSlope": 1,
            "fieldSlope": 0.5,
            "availableRun": 4,
            "taperBoardLength": 1.2192
          },
          "expected": 150,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Half-width the taper runs across",
              "value": 1.8,
              "unit": "m"
            },
            {
              "label": "Tapered board courses per side",
              "value": 2,
              "unit": "courses"
            },
            {
              "label": "Thickness gained per board course",
              "value": 101.6,
              "unit": "mm"
            },
            {
              "label": "Ridge taper over the available run",
              "value": 0.44999999999999996,
              "unit": "rise per 12"
            },
            {
              "label": "Net rise of the cricket ridge going upslope",
              "value": 0.050000000000000044,
              "unit": "rise per 12"
            },
            {
              "label": "Field rise over the same run",
              "value": 166.66666666666666,
              "unit": "mm"
            },
            {
              "label": "Cricket slope as a multiple of the field slope",
              "value": 2,
              "unit": "x field slope"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Narrow 1.2 m curb, cricket built at the field slope",
          "inputs": {
            "obstructionWidth": 1.2,
            "cricketSlope": 0.25,
            "fieldSlope": 0.25,
            "availableRun": 2,
            "taperBoardLength": 1.2192
          },
          "expected": 12.5,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Half-width the taper runs across",
              "value": 0.6,
              "unit": "m"
            },
            {
              "label": "Tapered board courses per side",
              "value": 1,
              "unit": "courses"
            },
            {
              "label": "Thickness gained per board course",
              "value": 25.4,
              "unit": "mm"
            },
            {
              "label": "Ridge taper over the available run",
              "value": 0.075,
              "unit": "rise per 12"
            },
            {
              "label": "Net rise of the cricket ridge going upslope",
              "value": 0.175,
              "unit": "rise per 12"
            },
            {
              "label": "Field rise over the same run",
              "value": 41.666666666666664,
              "unit": "mm"
            },
            {
              "label": "Cricket slope as a multiple of the field slope",
              "value": 1,
              "unit": "x field slope"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "lumber-dimensional-size-calculator",
      "title": "Lumber Dimensional Size Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/lumber-dimensional-size-calculator/",
      "sources": [
        "Standard North American dressed (surfaced) softwood lumber sizes, e.g. a nominal 2x4 actually measures 1.5 x 3.5 in after milling and drying"
      ],
      "vectors": [
        {
          "name": "2x4",
          "inputs": {
            "nominalSize": "2x4"
          },
          "expected": 1.5,
          "toleranceDecimalPlaces": 1,
          "unit": "in thick x 3.5 in wide (actual)",
          "confidence": "high",
          "steps": [
            {
              "label": "Actual thickness",
              "value": 1.5,
              "unit": "in"
            },
            {
              "label": "Actual width",
              "value": 3.5,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1x6",
          "inputs": {
            "nominalSize": "1x6"
          },
          "expected": 0.75,
          "toleranceDecimalPlaces": 2,
          "unit": "in thick x 5.5 in wide (actual)",
          "confidence": "high",
          "steps": [
            {
              "label": "Actual thickness",
              "value": 0.75,
              "unit": "in"
            },
            {
              "label": "Actual width",
              "value": 5.5,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "lumber-weight-calculator",
      "title": "Lumber Weight Calculator — Timber Weight by Species and Moisture",
      "url": "https://craftquantities.com/calculators/materials-quantities/lumber-weight-calculator/",
      "sources": [
        "USDA Forest Products Laboratory, Wood Handbook: Wood as an Engineering Material (FPL-GTR-282, 2021), Chapter 4: specific gravity referenced to the volume at a moisture content, always on oven-dry mass; Sx = S0 (1 - x/MCfs), with MCfs taken as 30% where not known (4-9); Gx = Gb / (1 - Sx/100) (4-11); S0 = 26.5 Gb where S0 is not known (4-12, 4-13); density = water density x Gx x (1 + x/100) (4-14), water 1,000 kg/m³ (62.43 lb/ft³); Table 4-3, shrinkage of domestic woods, green to oven-dry; Table 4-6a and 4-6b, density as a function of specific gravity and moisture content; worked example, Gb 0.55, G12 = 0.605, 678 kg/m³ (42.2 lb/ft³) at 12%; a coefficient of variation of about 10% for oven-dry density within common domestic species; Table 4-1, average moisture content of green wood",
        "USDA Forest Products Laboratory, Wood Handbook (FPL-GTR-282, 2021), Chapter 5, Table 5-3a, Strength properties of some commercially important woods grown in the United States: specific gravity based on weight when oven-dry and volume when green or at 12% moisture content; the green figure is each species' basic specific gravity here",
        "USDA Forest Products Laboratory, Wood Handbook (FPL-GTR-282, 2021), Chapter 6: Table 6-6, American Standard Lumber sizes, nominal 2 x 4 dimension lumber dressed dry to 38 by 89 mm (1-1/2 by 3-1/2 in); softwood lumber less than 114 mm (nominal 5 in) thick dried to 19% moisture content or less is defined as dry by the American Softwood Lumber Standard; construction lumber commonly in 610 mm (2 ft) length multiples"
      ],
      "vectors": [
        {
          "name": "The Handbook's worked example: a cubic metre of wood of basic specific gravity 0.55 at 12%",
          "inputs": {
            "species": "custom",
            "basicGravity": 0.55,
            "moistureContent": 12,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 678,
          "toleranceDecimalPlaces": -1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 675.0315051230072,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 72.32480412032226,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 675.0315051230072,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.6027067010026849
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Table 4-6b: a cubic foot of wood of specific gravity 0.50 at 40%",
          "inputs": {
            "species": "custom",
            "basicGravity": 0.5,
            "moistureContent": 40,
            "shape": "rectangular",
            "thickness": 0.1,
            "width": 0.1,
            "diameter": 0.1,
            "pieceLength": 2.8316846592,
            "pieces": 1
          },
          "expected": 19.8217926144,
          "toleranceDecimalPlaces": 2,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 19.821792614400003,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 5.663369318399999,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 700,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.5
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "An 8 ft dry 2 x 4 of Coast Douglas-fir at 19%",
          "inputs": {
            "species": "douglas-fir-coast",
            "basicGravity": 0.45,
            "moistureContent": 19,
            "shape": "rectangular",
            "thickness": 0.038099999999999995,
            "width": 0.08889999999999999,
            "diameter": 0.1,
            "pieceLength": 2.4384,
            "pieces": 1
          },
          "expected": 4.633,
          "toleranceDecimalPlaces": 2,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 4.6334028604777195,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0.7397870113367784,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 561.007123899986,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.47143455789914795
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A 3 m pole 200 mm across, Coast Douglas-fir green at 30%",
          "inputs": {
            "species": "douglas-fir-coast",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "round",
            "thickness": 0.038,
            "width": 0.089,
            "diameter": 0.2,
            "pieceLength": 3,
            "pieces": 1
          },
          "expected": 55.135,
          "toleranceDecimalPlaces": 2,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 55.134951070500875,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 12.723450247038663,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 585,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.45
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Douglas-fir, Coast green at 30%",
          "inputs": {
            "species": "douglas-fir-coast",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 585,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 585,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 135,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 585,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.45
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Douglas-fir, Interior West green at 30%",
          "inputs": {
            "species": "douglas-fir-interior-west",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 598,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 598,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 138,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 598,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.46
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Hemlock, western green at 30%",
          "inputs": {
            "species": "hemlock-western",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 546,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 546,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 126,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 546,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.42
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Larch, western green at 30%",
          "inputs": {
            "species": "larch-western",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 624,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 624,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 144,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 624,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.48
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Pine, loblolly green at 30%",
          "inputs": {
            "species": "pine-loblolly",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 611,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 611,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 141,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 611,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.47
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Pine, longleaf green at 30%",
          "inputs": {
            "species": "pine-longleaf",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 702,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 702,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 162,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 702,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.54
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Pine, shortleaf green at 30%",
          "inputs": {
            "species": "pine-shortleaf",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 611,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 611,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 141,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 611,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.47
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Pine, slash green at 30%",
          "inputs": {
            "species": "pine-slash",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 702,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 702,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 162,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 702,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.54
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Pine, ponderosa green at 30%",
          "inputs": {
            "species": "pine-ponderosa",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 494,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 494,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 114,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 494,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.38
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Pine, lodgepole green at 30%",
          "inputs": {
            "species": "pine-lodgepole",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 494,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 494,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 114,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 494,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.38
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Pine, red green at 30%",
          "inputs": {
            "species": "pine-red",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 533,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 533,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 123,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 533,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.41
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Pine, eastern white green at 30%",
          "inputs": {
            "species": "pine-eastern-white",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 442,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 442,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 102,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 442,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.34
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Spruce, black green at 30%",
          "inputs": {
            "species": "spruce-black",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 494,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 494,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 114,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 494,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.38
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Spruce, Engelmann green at 30%",
          "inputs": {
            "species": "spruce-engelmann",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 429,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 429,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 99,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 429,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.33
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Spruce, red green at 30%",
          "inputs": {
            "species": "spruce-red",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 481,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 481,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 111,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 481,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.37
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Spruce, Sitka green at 30%",
          "inputs": {
            "species": "spruce-sitka",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 481,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 481,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 111,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 481,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.37
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Fir, balsam green at 30%",
          "inputs": {
            "species": "fir-balsam",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 429,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 429,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 99,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 429,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.33
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Fir, white green at 30%",
          "inputs": {
            "species": "fir-white",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 481,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 481,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 111,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 481,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.37
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Western redcedar green at 30%",
          "inputs": {
            "species": "cedar-western-red",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 403,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 403,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 93,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 403,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.31
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Redwood, young-growth green at 30%",
          "inputs": {
            "species": "redwood-young-growth",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 442,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 442,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 102,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 442,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.34
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Redwood, old-growth green at 30%",
          "inputs": {
            "species": "redwood-old-growth",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 494,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 494,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 114,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 494,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.38
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Oak, northern red green at 30%",
          "inputs": {
            "species": "oak-northern-red",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 728,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 728,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 168,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 728,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.56
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Oak, white green at 30%",
          "inputs": {
            "species": "oak-white",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 780,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 780,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 180,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 780,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.6
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Maple, sugar green at 30%",
          "inputs": {
            "species": "maple-sugar",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 728,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 728,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 168,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 728,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.56
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Maple, red green at 30%",
          "inputs": {
            "species": "maple-red",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 637,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 637,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 147,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 637,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.49
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Ash, white green at 30%",
          "inputs": {
            "species": "ash-white",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 715,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 715,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 165,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 715,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.55
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Cherry, black green at 30%",
          "inputs": {
            "species": "cherry-black",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 611,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 611,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 141,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 611,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.47
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Walnut, black green at 30%",
          "inputs": {
            "species": "walnut-black",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 663,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 663,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 153,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 663,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.51
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Yellow-poplar green at 30%",
          "inputs": {
            "species": "yellow-poplar",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 520,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 520,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 120,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 520,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.4
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Beech, American green at 30%",
          "inputs": {
            "species": "beech-american",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 728,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 728,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 168,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 728,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.56
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Birch, yellow green at 30%",
          "inputs": {
            "species": "birch-yellow",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 715,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 715,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 165,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 715,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.55
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Hickory, shagbark green at 30%",
          "inputs": {
            "species": "hickory-shagbark",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 832,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 832,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 192,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 832,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.64
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Basswood, American green at 30%",
          "inputs": {
            "species": "basswood-american",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 416,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 416,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 96,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 416,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.32
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Alder, red green at 30%",
          "inputs": {
            "species": "alder-red",
            "basicGravity": 0.45,
            "moistureContent": 30,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 481,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 481,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 111,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 481,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.37
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A cubic metre of Douglas-fir, Coast oven-dry",
          "inputs": {
            "species": "douglas-fir-coast",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 513.7,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 513.6986301369864,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 513.6986301369864,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.5136986301369864
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Douglas-fir, Interior West oven-dry",
          "inputs": {
            "species": "douglas-fir-interior-west",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 521.54,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 521.5419501133787,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 521.5419501133787,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.5215419501133787
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Hemlock, western oven-dry",
          "inputs": {
            "species": "hemlock-western",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 479.45,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 479.4520547945205,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 479.4520547945205,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.4794520547945205
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Larch, western oven-dry",
          "inputs": {
            "species": "larch-western",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 558.14,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 558.1395348837209,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 558.1395348837209,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.5581395348837209
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Pine, loblolly oven-dry",
          "inputs": {
            "species": "pine-loblolly",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 535.92,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 535.9179019384264,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 535.9179019384264,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.5359179019384265
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Pine, longleaf oven-dry",
          "inputs": {
            "species": "pine-longleaf",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 615.03,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 615.0341685649204,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 615.0341685649204,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.6150341685649203
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Pine, shortleaf oven-dry",
          "inputs": {
            "species": "pine-shortleaf",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 535.92,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 535.9179019384264,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 535.9179019384264,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.5359179019384265
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Pine, slash oven-dry",
          "inputs": {
            "species": "pine-slash",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 614.33,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 614.3344709897611,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 614.3344709897611,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.6143344709897611
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Pine, ponderosa oven-dry",
          "inputs": {
            "species": "pine-ponderosa",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 420.82,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 420.8194905869325,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 420.8194905869325,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.42081949058693247
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Pine, lodgepole oven-dry",
          "inputs": {
            "species": "pine-lodgepole",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 427.45,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 427.44656917885266,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 427.44656917885266,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.42744656917885265
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Pine, red oven-dry",
          "inputs": {
            "species": "pine-red",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 462.23,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 462.2322435174746,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 462.2322435174746,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.4622322435174746
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Pine, eastern white oven-dry",
          "inputs": {
            "species": "pine-eastern-white",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 370.37,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 370.3703703703704,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 370.3703703703704,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.3703703703703704
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Spruce, black oven-dry",
          "inputs": {
            "species": "spruce-black",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 428.41,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 428.41037204058625,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 428.41037204058625,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.42841037204058624
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Spruce, Engelmann oven-dry",
          "inputs": {
            "species": "spruce-engelmann",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 370.79,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 370.7865168539326,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 370.7865168539326,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.3707865168539326
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Spruce, red oven-dry",
          "inputs": {
            "species": "spruce-red",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 419.5,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 419.5011337868481,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 419.5011337868481,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.41950113378684806
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Spruce, Sitka oven-dry",
          "inputs": {
            "species": "spruce-sitka",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 418.08,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 418.07909604519773,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 418.07909604519773,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.4180790960451977
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Fir, balsam oven-dry",
          "inputs": {
            "species": "fir-balsam",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 371.62,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 371.62162162162167,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 371.62162162162167,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.37162162162162166
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Fir, white oven-dry",
          "inputs": {
            "species": "fir-white",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 410.2,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 410.1995565410199,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 410.1995565410199,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.4101995565410199
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Western redcedar oven-dry",
          "inputs": {
            "species": "cedar-western-red",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 332.62,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 332.618025751073,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 332.618025751073,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.33261802575107297
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Redwood, young-growth oven-dry",
          "inputs": {
            "species": "redwood-young-growth",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 365.59,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 365.59139784946245,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 365.59139784946245,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.36559139784946243
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Redwood, old-growth oven-dry",
          "inputs": {
            "species": "redwood-old-growth",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 407.73,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 407.72532188841205,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 407.72532188841205,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.40772532188841204
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Oak, northern red oven-dry",
          "inputs": {
            "species": "oak-northern-red",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 648.9,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 648.8991888760139,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 648.8991888760139,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.6488991888760139
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Oak, white oven-dry",
          "inputs": {
            "species": "oak-white",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 716.85,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 716.8458781362007,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 716.8458781362007,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.7168458781362007
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Maple, sugar oven-dry",
          "inputs": {
            "species": "maple-sugar",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 656.51,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 656.5064478311841,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 656.5064478311841,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.6565064478311842
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Maple, red oven-dry",
          "inputs": {
            "species": "maple-red",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 560.64,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 560.6407322654462,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 560.6407322654462,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.5606407322654462
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Ash, white oven-dry",
          "inputs": {
            "species": "ash-white",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 634.37,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 634.3713956170704,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 634.3713956170704,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.6343713956170705
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Cherry, black oven-dry",
          "inputs": {
            "species": "cherry-black",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 531.07,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 531.0734463276837,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 531.0734463276837,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.5310734463276836
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Walnut, black oven-dry",
          "inputs": {
            "species": "walnut-black",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 584.86,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 584.8623853211009,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 584.8623853211009,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.5848623853211009
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Yellow-poplar oven-dry",
          "inputs": {
            "species": "yellow-poplar",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 458.19,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 458.1901489117984,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 458.1901489117984,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.45819014891179843
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Beech, American oven-dry",
          "inputs": {
            "species": "beech-american",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 676.33,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 676.328502415459,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 676.328502415459,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.6763285024154589
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Birch, yellow oven-dry",
          "inputs": {
            "species": "birch-yellow",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 661.06,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 661.0576923076924,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 661.0576923076924,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.6610576923076924
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Hickory, shagbark oven-dry",
          "inputs": {
            "species": "hickory-shagbark",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 768.31,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 768.3073229291717,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 768.3073229291717,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.7683073229291717
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Basswood, American oven-dry",
          "inputs": {
            "species": "basswood-american",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 380.05,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 380.04750593824235,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 380.04750593824235,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.3800475059382423
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A cubic metre of Alder, red oven-dry",
          "inputs": {
            "species": "alder-red",
            "basicGravity": 0.45,
            "moistureContent": 0,
            "shape": "rectangular",
            "thickness": 1,
            "width": 1,
            "diameter": 0.1,
            "pieceLength": 1,
            "pieces": 1
          },
          "expected": 423.34,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight of one piece",
              "value": 423.3409610983981,
              "unit": "kg"
            },
            {
              "label": "Of the total, water",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Density of the wood at this moisture content",
              "value": 423.3409610983981,
              "unit": "kg/m³"
            },
            {
              "label": "Specific gravity on the volume at this moisture content",
              "value": 0.42334096109839814
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "lumen-method-lighting-calculator",
      "title": "Lumen Method Lighting Calculator (Room Index, Luminaire Count and Spacing)",
      "url": "https://craftquantities.com/calculators/electrical/lumen-method-lighting-calculator/",
      "sources": [
        "The lumen method (SLL Code for Lighting, CIBSE; IES Lighting Handbook): N = E × A ÷ (Φ × UF × MF); room index K = L × W ÷ (Hm × (L + W)), Hm the height of the luminaires above the working plane",
        "Maximum spacing = the luminaire's spacing-to-height ratio (SHR, from its photometric data) × Hm",
        "BS EN 12464-1, Lighting of work places — Indoor work places: maintained illuminance on the task area"
      ],
      "vectors": [
        {
          "name": "The workspace guide's shop: 6.0 m fittings over 0.9 m benches (Hm 5.1), 30 × 20 m at 500 lx",
          "inputs": {
            "roomLength": 30,
            "roomWidth": 20,
            "luminaireHeight": 6,
            "workingPlane": 0.9,
            "targetIlluminance": 500,
            "luminaireLumens": 12000,
            "utilisationFactor": 0.6,
            "maintenanceFactor": 0.8,
            "spacingToHeight": 1.25
          },
          "expected": 53,
          "toleranceDecimalPlaces": 0,
          "unit": "luminaires",
          "confidence": "high",
          "steps": [
            {
              "label": "Height of the luminaires above the working plane",
              "value": 5.1,
              "unit": "m"
            },
            {
              "label": "Room index K",
              "value": 2.3529411764705883
            },
            {
              "label": "Luminaires by the lumen method, before rounding up",
              "value": 52.083333333333336
            },
            {
              "label": "Rows along the length",
              "value": 9
            },
            {
              "label": "Luminaires in each row, across the width",
              "value": 6
            },
            {
              "label": "Luminaires in that grid",
              "value": 54
            },
            {
              "label": "Pitch along the length",
              "value": 3.3333333333333335,
              "unit": "m"
            },
            {
              "label": "Pitch across the width",
              "value": 3.3333333333333335,
              "unit": "m"
            },
            {
              "label": "Largest pitch the SHR allows",
              "value": 6.375,
              "unit": "m"
            },
            {
              "label": "Average illuminance the grid gives",
              "value": 518.4,
              "unit": "lx"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "An office: 12 × 8 m, recessed at 2.7 m over 0.8 m desks, 3,600 lm at UF 0.55",
          "inputs": {
            "roomLength": 12,
            "roomWidth": 8,
            "luminaireHeight": 2.7,
            "workingPlane": 0.8,
            "targetIlluminance": 500,
            "luminaireLumens": 3600,
            "utilisationFactor": 0.55,
            "maintenanceFactor": 0.8,
            "spacingToHeight": 1.5
          },
          "expected": 31,
          "toleranceDecimalPlaces": 0,
          "unit": "luminaires",
          "confidence": "high",
          "steps": [
            {
              "label": "Height of the luminaires above the working plane",
              "value": 1.9000000000000001,
              "unit": "m"
            },
            {
              "label": "Room index K",
              "value": 2.526315789473684
            },
            {
              "label": "Luminaires by the lumen method, before rounding up",
              "value": 30.303030303030297
            },
            {
              "label": "Rows along the length",
              "value": 8
            },
            {
              "label": "Luminaires in each row, across the width",
              "value": 4
            },
            {
              "label": "Luminaires in that grid",
              "value": 32
            },
            {
              "label": "Pitch along the length",
              "value": 1.5,
              "unit": "m"
            },
            {
              "label": "Pitch across the width",
              "value": 2,
              "unit": "m"
            },
            {
              "label": "Largest pitch the SHR allows",
              "value": 2.85,
              "unit": "m"
            },
            {
              "label": "Average illuminance the grid gives",
              "value": 528.0000000000001,
              "unit": "lx"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "lux-to-foot-candles-calculator",
      "title": "Lux to Foot-Candles Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/lux-to-foot-candles-calculator/",
      "sources": [
        "NIST SP 811, Appendix B — illuminance: 1 footcandle = 10.76391 lx",
        "The lux is one lumen per square metre and the footcandle one lumen per square foot (SI Brochure, 9th edition, derived units)"
      ],
      "vectors": [
        {
          "name": "500 lux office lighting is 46.45 fc",
          "inputs": {
            "lux": 500
          },
          "expected": 46.45152,
          "toleranceDecimalPlaces": 5,
          "unit": "fc",
          "confidence": "high",
          "steps": [
            {
              "label": "Lux entered",
              "value": 500,
              "unit": "lx"
            },
            {
              "label": "Foot-candles",
              "value": 46.45152,
              "unit": "fc"
            },
            {
              "label": "Lumens per square metre (the same thing)",
              "value": 500,
              "unit": "lm/m²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "300 lux corridor is 27.87 fc",
          "inputs": {
            "lux": 300
          },
          "expected": 27.870912,
          "toleranceDecimalPlaces": 5,
          "unit": "fc",
          "confidence": "high",
          "steps": [
            {
              "label": "Lux entered",
              "value": 300,
              "unit": "lx"
            },
            {
              "label": "Foot-candles",
              "value": 27.870912,
              "unit": "fc"
            },
            {
              "label": "Lumens per square metre (the same thing)",
              "value": 300,
              "unit": "lm/m²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "1000 lux is 92.9 fc",
          "inputs": {
            "lux": 1000
          },
          "expected": 92.90304,
          "toleranceDecimalPlaces": 5,
          "unit": "fc",
          "confidence": "high",
          "steps": [
            {
              "label": "Lux entered",
              "value": 1000,
              "unit": "lx"
            },
            {
              "label": "Foot-candles",
              "value": 92.90304,
              "unit": "fc"
            },
            {
              "label": "Lumens per square metre (the same thing)",
              "value": 1000,
              "unit": "lm/m²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "50 lux escape route is 4.65 fc",
          "inputs": {
            "lux": 50
          },
          "expected": 4.645152,
          "toleranceDecimalPlaces": 6,
          "unit": "fc",
          "confidence": "high",
          "steps": [
            {
              "label": "Lux entered",
              "value": 50,
              "unit": "lx"
            },
            {
              "label": "Foot-candles",
              "value": 4.645152,
              "unit": "fc"
            },
            {
              "label": "Lumens per square metre (the same thing)",
              "value": 50,
              "unit": "lm/m²"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "manhole-ring-segment-calculator",
      "title": "Manhole Ring/Riser Segment Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/manhole-ring-segment-calculator/",
      "sources": [
        "Ring count = ceil(manhole depth ÷ standard ring height), the standard method for stacking precast concrete riser rings to reach a manhole structure's total depth"
      ],
      "vectors": [
        {
          "name": "3m depth, 0.305m rings",
          "inputs": {
            "manholeDepth": 3,
            "ringHeight": 0.305
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "rings",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "4m depth, 0.305m rings",
          "inputs": {
            "manholeDepth": 4,
            "ringHeight": 0.305
          },
          "expected": 14,
          "toleranceDecimalPlaces": 0,
          "unit": "rings",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "mansard-roof-rafter-calculator",
      "title": "Mansard Roof Rafter Geometry Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/mansard-roof-rafter-calculator/",
      "sources": [
        "The steep lower mansard segment is sized by its slope angle and vertical height (length = height/sin(angle), run = height/tan(angle)); the shallow upper segment uses the standard rise/12 rafter-length formula over the remaining half-width"
      ],
      "vectors": [
        {
          "name": "70° lower slope, 2m height, 3/12 upper, 10m wide",
          "inputs": {
            "lowerSlopeAngle": 70,
            "lowerSlopeHeight": 2,
            "upperPitch": 3,
            "buildingWidth": 10
          },
          "expected": 6.532,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Lower segment length",
              "value": 2.1283555449518246,
              "unit": "m"
            },
            {
              "label": "Upper segment length",
              "value": 4.403538171791897,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "75° lower slope, 2.5m height, 2/12 upper, 12m wide",
          "inputs": {
            "lowerSlopeAngle": 75,
            "lowerSlopeHeight": 2.5,
            "upperPitch": 2,
            "buildingWidth": 12
          },
          "expected": 7.992,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Lower segment length",
              "value": 2.5881904510252074,
              "unit": "m"
            },
            {
              "label": "Upper segment length",
              "value": 5.403649485405011,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "manual-j-screening-calculator",
      "title": "Heating & Cooling Load Screening Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/manual-j-screening-calculator/",
      "sources": [
        "Steady-state fabric heat loss: Q = Σ(U × A × ΔT), the basis of every load method including ACCA Manual J and CIBSE Guide A",
        "Ventilation heat loss: Q = 0.33 × n × V × ΔT (W), CIBSE Guide A — 0.33 Wh/m³K is the volumetric heat capacity of air",
        "ACCA Manual J (8th ed.) for the full room-by-room procedure this approximates"
      ],
      "vectors": [
        {
          "name": "300 m² at U 0.6, 250 m³ at 0.7 ACH, ΔT 24",
          "inputs": {
            "envelopeArea": 300,
            "averageUValue": 0.6,
            "volume": 250000,
            "airChangesPerHour": 0.7,
            "deltaT": 24
          },
          "expected": 5706,
          "toleranceDecimalPlaces": -1,
          "unit": "W",
          "confidence": "medium",
          "steps": [
            {
              "label": "Fabric loss",
              "value": 4320,
              "unit": "W"
            },
            {
              "label": "Ventilation loss",
              "value": 1385.9999999999998,
              "unit": "W"
            },
            {
              "label": "Kilowatts",
              "value": 5.706,
              "unit": "kW"
            },
            {
              "label": "BTU/h",
              "value": 19469.680158628184,
              "unit": "BTU/h"
            },
            {
              "label": "Ventilation as a share of the total",
              "value": 24.29022082018927,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Halving the U-value cuts fabric loss in half",
          "inputs": {
            "envelopeArea": 300,
            "averageUValue": 0.3,
            "volume": 250000,
            "airChangesPerHour": 0.7,
            "deltaT": 24
          },
          "expected": 3546,
          "toleranceDecimalPlaces": -1,
          "unit": "W",
          "confidence": "medium",
          "steps": [
            {
              "label": "Fabric loss",
              "value": 2160,
              "unit": "W"
            },
            {
              "label": "Ventilation loss",
              "value": 1385.9999999999998,
              "unit": "W"
            },
            {
              "label": "Kilowatts",
              "value": 3.546,
              "unit": "kW"
            },
            {
              "label": "BTU/h",
              "value": 12099.454231071773,
              "unit": "BTU/h"
            },
            {
              "label": "Ventilation as a share of the total",
              "value": 39.086294416243646,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A draughty house at 2.5 ACH",
          "inputs": {
            "envelopeArea": 300,
            "averageUValue": 0.6,
            "volume": 250000,
            "airChangesPerHour": 2.5,
            "deltaT": 24
          },
          "expected": 9270,
          "toleranceDecimalPlaces": -1,
          "unit": "W",
          "confidence": "medium",
          "steps": [
            {
              "label": "Fabric loss",
              "value": 4320,
              "unit": "W"
            },
            {
              "label": "Ventilation loss",
              "value": 4950.000000000001,
              "unit": "W"
            },
            {
              "label": "Kilowatts",
              "value": 9.27,
              "unit": "kW"
            },
            {
              "label": "BTU/h",
              "value": 31630.552939096262,
              "unit": "BTU/h"
            },
            {
              "label": "Ventilation as a share of the total",
              "value": 53.39805825242719,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Zero temperature difference is zero loss",
          "inputs": {
            "envelopeArea": 300,
            "averageUValue": 0.6,
            "volume": 250000,
            "airChangesPerHour": 0.7,
            "deltaT": 0
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "W",
          "confidence": "medium",
          "steps": [
            {
              "label": "Fabric loss",
              "value": 0,
              "unit": "W"
            },
            {
              "label": "Ventilation loss",
              "value": 0,
              "unit": "W"
            },
            {
              "label": "Kilowatts",
              "value": 0,
              "unit": "kW"
            },
            {
              "label": "BTU/h",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Ventilation as a share of the total",
              "value": 0,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "masking-and-protection-calculator",
      "title": "Masking and Protection Materials Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/masking-and-protection-calculator/",
      "sources": [
        "Floor protection is an area: the floor divided by one sheet's coverage, rounded up to whole sheets",
        "Masking tape follows edges rather than area — the perimeter lines being cut in, plus a length for each door and window frame, which does not scale with the room",
        "Tape is sold in rolls of a stated length, so the order is the total edge divided by the roll length, rounded up"
      ],
      "vectors": [
        {
          "name": "A 4 x 3 m room: 12 m2 floor, 14 m perimeter, 2 lines, 3 openings at 5 m",
          "inputs": {
            "floorArea": 12,
            "perimeter": 14,
            "tapedLines": 2,
            "openings": 3,
            "tapePerOpening": 5,
            "sheetCoverage": 11,
            "rollLength": 50
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "items",
          "confidence": "medium",
          "steps": [
            {
              "label": "Dust sheets",
              "value": 2,
              "unit": "sheets"
            },
            {
              "label": "Tape rolls",
              "value": 1,
              "unit": "rolls"
            },
            {
              "label": "Tape along the room",
              "value": 91.86351706036744,
              "unit": "ft"
            },
            {
              "label": "Tape around openings",
              "value": 49.212598425196845,
              "unit": "ft"
            },
            {
              "label": "Tape in total",
              "value": 141.0761154855643,
              "unit": "ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Twelve openings in the same room take a second roll",
          "inputs": {
            "floorArea": 12,
            "perimeter": 16,
            "tapedLines": 2,
            "openings": 12,
            "tapePerOpening": 5,
            "sheetCoverage": 11,
            "rollLength": 50
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "items",
          "confidence": "medium",
          "steps": [
            {
              "label": "Dust sheets",
              "value": 2,
              "unit": "sheets"
            },
            {
              "label": "Tape rolls",
              "value": 2,
              "unit": "rolls"
            },
            {
              "label": "Tape along the room",
              "value": 104.98687664041994,
              "unit": "ft"
            },
            {
              "label": "Tape around openings",
              "value": 196.85039370078738,
              "unit": "ft"
            },
            {
              "label": "Tape in total",
              "value": 301.83727034120733,
              "unit": "ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Cutting in by hand: no perimeter lines, openings only",
          "inputs": {
            "floorArea": 12,
            "perimeter": 14,
            "tapedLines": 0,
            "openings": 3,
            "tapePerOpening": 5,
            "sheetCoverage": 11,
            "rollLength": 50
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "items",
          "confidence": "medium",
          "steps": [
            {
              "label": "Dust sheets",
              "value": 2,
              "unit": "sheets"
            },
            {
              "label": "Tape rolls",
              "value": 1,
              "unit": "rolls"
            },
            {
              "label": "Tape along the room",
              "value": 0,
              "unit": "ft"
            },
            {
              "label": "Tape around openings",
              "value": 49.212598425196845,
              "unit": "ft"
            },
            {
              "label": "Tape in total",
              "value": 49.212598425196845,
              "unit": "ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "masonry-bond-beam-rebar-calculator",
      "title": "Masonry Bond Beam Rebar Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/masonry-bond-beam-rebar-calculator/",
      "sources": [
        "Bond beam rebar runs continuously along the wall length in each reinforced course; total length = wall length x number of bond beam courses x 1.15 lap-splice allowance, converted to mass via standard ASTM A615 linear density"
      ],
      "vectors": [
        {
          "name": "20m wall, 3 courses, #4 bar",
          "inputs": {
            "wallLength": 20,
            "bondBeamCourses": 3,
            "rebarSize": "4"
          },
          "expected": 68.59,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total rebar length (incl. lap splice)",
              "value": 69,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15m wall, 2 courses, #5 bar",
          "inputs": {
            "wallLength": 15,
            "bondBeamCourses": 2,
            "rebarSize": "5"
          },
          "expected": 53.54,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total rebar length (incl. lap splice)",
              "value": 34.5,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "masonry-control-joint-spacing-calculator",
      "title": "Masonry Control Joint Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/masonry-control-joint-spacing-calculator/",
      "sources": [
        "A commonly-used simplified guideline for CMU control joint spacing: maximum spacing = the lesser of 2x the wall height or 7.6m (25 ft) — actual project requirements vary by wall restraint, panel geometry, and the specific unit/mortar shrinkage properties, per NCMA TEK guidance"
      ],
      "vectors": [
        {
          "name": "3m height, 30m length",
          "inputs": {
            "wallHeight": 3,
            "wallLength": 30
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "control joints",
          "confidence": "low",
          "steps": [
            {
              "label": "Maximum spacing used",
              "value": 6,
              "unit": "m"
            },
            {
              "label": "Wall panels between the joints",
              "value": 5
            },
            {
              "label": "Panel length, as set out",
              "value": 6,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "4.5m height, 40m length",
          "inputs": {
            "wallHeight": 4.5,
            "wallLength": 40
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "control joints",
          "confidence": "low",
          "steps": [
            {
              "label": "Maximum spacing used",
              "value": 7.6,
              "unit": "m"
            },
            {
              "label": "Wall panels between the joints",
              "value": 6
            },
            {
              "label": "Panel length, as set out",
              "value": 6.666666666666667,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "masonry-grout-mix-calculator",
      "title": "Masonry Grout Mix Calculator — ASTM C476 Fine and Coarse",
      "url": "https://craftquantities.com/calculators/materials-quantities/masonry-grout-mix-calculator/",
      "sources": [
        "Proportions are the ASTM C476 proportion specification by volume: one part portland cement, zero to one tenth part hydrated lime, and fine aggregate at 2.25 to 3 times the total cementitious volume, with coarse grout adding 1 to 2 parts coarse aggregate on the same basis",
        "ASTM C476 specifies grout slump at 8 to 11 inches. That is deliberate and is not a concrete slump: the absorbent masonry units withdraw the excess water after placement, so the water-cement ratio in place is far lower than the one batched",
        "The conventional maximum grout lift is 5 ft 4 in under TMS 602. The taller 12 ft 8 in lift is conditional — the masonry cured, the slump held near the top of its band, and no intermediate reinforced bond beam within the pour — so the conventional figure is used here",
        "Yield is taken as the total aggregate volume, because the cement paste fills the voids between grains rather than adding to them. This is a working convention rather than a measured property, and a trial batch governs"
      ],
      "vectors": [
        {
          "name": "1 m³ of fine grout at 2.75 parts sand",
          "inputs": {
            "groutVolume": 1000,
            "groutType": "fine",
            "fineAggregateRatio": 2.75,
            "pourHeight": 2.4
          },
          "expected": 35.31,
          "toleranceDecimalPlaces": 1,
          "unit": "ft³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Fine aggregate",
              "value": 35.31466672148859,
              "unit": "ft³"
            },
            {
              "label": "Portland cement",
              "value": 12.841696989632213,
              "unit": "ft³"
            },
            {
              "label": "94 lb cement sacks",
              "value": 13,
              "unit": "sacks"
            },
            {
              "label": "Lifts to place this pour",
              "value": 2,
              "unit": "lifts"
            },
            {
              "label": "Grout per lift",
              "value": 17.657333360744296,
              "unit": "ft³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "coarse grout, same volume — aggregate total is unchanged",
          "inputs": {
            "groutVolume": 1000,
            "groutType": "coarse",
            "fineAggregateRatio": 2.75,
            "pourHeight": 2.4
          },
          "expected": 35.31,
          "toleranceDecimalPlaces": 1,
          "unit": "ft³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Fine aggregate",
              "value": 22.850666702139673,
              "unit": "ft³"
            },
            {
              "label": "Coarse aggregate",
              "value": 12.464000019348914,
              "unit": "ft³"
            },
            {
              "label": "Portland cement",
              "value": 8.30933334623261,
              "unit": "ft³"
            },
            {
              "label": "94 lb cement sacks",
              "value": 9,
              "unit": "sacks"
            },
            {
              "label": "Lifts to place this pour",
              "value": 2,
              "unit": "lifts"
            },
            {
              "label": "Grout per lift",
              "value": 17.657333360744296,
              "unit": "ft³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "a small pour at the leanest end of the band",
          "inputs": {
            "groutVolume": 250,
            "groutType": "fine",
            "fineAggregateRatio": 2.25,
            "pourHeight": 1.2
          },
          "expected": 8.83,
          "toleranceDecimalPlaces": 1,
          "unit": "ft³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Fine aggregate",
              "value": 8.828666680372148,
              "unit": "ft³"
            },
            {
              "label": "Portland cement",
              "value": 3.9238518579431765,
              "unit": "ft³"
            },
            {
              "label": "94 lb cement sacks",
              "value": 4,
              "unit": "sacks"
            },
            {
              "label": "Lifts to place this pour",
              "value": 1,
              "unit": "lift"
            },
            {
              "label": "Grout per lift",
              "value": 8.828666680372148,
              "unit": "ft³"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "masonry-pier-axial-capacity-calculator",
      "title": "Masonry Pier Axial Capacity Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/masonry-pier-axial-capacity-calculator/",
      "sources": [
        "Simplified unreinforced masonry pier axial capacity: Pa = 0.20 x f'm x net cross-sectional area — a conservative allowable-stress estimate for a short (non-slender) pier, ignoring the slenderness reduction TMS 402 applies to taller/slimmer piers"
      ],
      "vectors": [
        {
          "name": "f'm=1500psi, An=200in²",
          "inputs": {
            "compressiveStrength": 10342135.939752,
            "netArea": 0.129032
          },
          "expected": 266.89,
          "toleranceDecimalPlaces": -1,
          "unit": "kN",
          "confidence": "low",
          "steps": [
            {
              "label": "Equivalent in lbs",
              "value": 60000.00000000001,
              "unit": "lb"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "f'm=1800psi, An=250in²",
          "inputs": {
            "compressiveStrength": 12410563.1277024,
            "netArea": 0.16129
          },
          "expected": 400.34,
          "toleranceDecimalPlaces": -1,
          "unit": "kN",
          "confidence": "low",
          "steps": [
            {
              "label": "Equivalent in lbs",
              "value": 90000,
              "unit": "lb"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "masonry-prism-ht-ratio-calculator",
      "title": "Masonry Prism Height-to-Thickness Ratio Validity Checker",
      "url": "https://craftquantities.com/calculators/materials-quantities/masonry-prism-ht-ratio-calculator/",
      "sources": [
        "ASTM C1314 Standard Test Method for Compressive Strength of Masonry Prisms requires the specimen's height-to-thickness (h/t) ratio to fall within a valid tested range, commonly cited as 1.3 to 5.0, for the correction factor procedure to apply correctly"
      ],
      "vectors": [
        {
          "name": "0.4m height, 0.2m thickness (valid)",
          "inputs": {
            "prismHeight": 0.4,
            "prismThickness": 0.2
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "(h/t)",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "0.2m height, 0.2m thickness (below range)",
          "inputs": {
            "prismHeight": 0.2,
            "prismThickness": 0.2
          },
          "expected": 1,
          "toleranceDecimalPlaces": 0,
          "unit": "(h/t)",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "masonry-shear-capacity-calculator",
      "title": "Masonry Wall In-Plane Shear Capacity Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/masonry-shear-capacity-calculator/",
      "sources": [
        "Allowable masonry shear stress: Fv = min(2 x sqrt(f'm), 200 psi); shear capacity V = Fv x net shear area (Anv)"
      ],
      "vectors": [
        {
          "name": "f'm=1500psi, Anv=100in²",
          "inputs": {
            "compressiveStrength": 10342135.939752,
            "netShearArea": 0.064516
          },
          "expected": 34.45,
          "toleranceDecimalPlaces": 0,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Allowable shear stress (Fv)",
              "value": 77.45966692414834,
              "unit": "psi"
            },
            {
              "label": "Equivalent in lbs",
              "value": 7745.966692414835,
              "unit": "lb"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "f'm=3000psi, Anv=150in²",
          "inputs": {
            "compressiveStrength": 20684271.879504,
            "netShearArea": 0.096774
          },
          "expected": 73.08,
          "toleranceDecimalPlaces": 0,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Allowable shear stress (Fv)",
              "value": 109.54451150103323,
              "unit": "psi"
            },
            {
              "label": "Equivalent in lbs",
              "value": 16431.676725154983,
              "unit": "lb"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "mass-concrete-thermal-gradient-calculator",
      "title": "Mass Concrete Thermal Gradient Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/mass-concrete-thermal-gradient-calculator/",
      "sources": [
        "ACI 301 standard mass concrete thermal control limits: maximum core-to-surface temperature differential of 35°F (19.44°C), and maximum concrete temperature of 160°F (71.11°C) during curing"
      ],
      "vectors": [
        {
          "name": "45°C core, 28°C surface (pass)",
          "inputs": {
            "coreTemp": 45,
            "surfaceTemp": 28
          },
          "expected": 17,
          "toleranceDecimalPlaces": 0,
          "unit": "Δ°C",
          "confidence": "medium",
          "steps": [
            {
              "label": "ACI 301 gradient limit",
              "value": 19.444444444444446,
              "unit": "Δ°C"
            },
            {
              "label": "Core temperature",
              "value": 45,
              "unit": "°C"
            },
            {
              "label": "ACI 301 max core temperature",
              "value": 71.11111111111111,
              "unit": "°C"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "55°C core, 25°C surface (fail)",
          "inputs": {
            "coreTemp": 55,
            "surfaceTemp": 25
          },
          "expected": 30,
          "toleranceDecimalPlaces": 0,
          "unit": "Δ°C",
          "confidence": "low",
          "steps": [
            {
              "label": "ACI 301 gradient limit",
              "value": 19.444444444444446,
              "unit": "Δ°C"
            },
            {
              "label": "Core temperature",
              "value": 55,
              "unit": "°C"
            },
            {
              "label": "ACI 301 max core temperature",
              "value": 71.11111111111111,
              "unit": "°C"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "material-price-escalation-calculator",
      "title": "Material Price Escalation Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/material-price-escalation-calculator/",
      "sources": [
        "Compound growth formula: adjusted price = original price x (1 + monthly rate)^months, where monthly rate = annual inflation rate / 12"
      ],
      "vectors": [
        {
          "name": "$10,000, 12 months, 5% annual",
          "inputs": {
            "originalPrice": 10000,
            "monthsElapsed": 12,
            "annualInflationPercent": 5
          },
          "expected": 10511.6,
          "toleranceDecimalPlaces": 1,
          "unit": "$ (estimated current price)",
          "confidence": "low",
          "steps": [
            {
              "label": "Total change",
              "value": 511.61897881733057,
              "unit": "$"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "$5,000, 6 months, 8% annual",
          "inputs": {
            "originalPrice": 5000,
            "monthsElapsed": 6,
            "annualInflationPercent": 8
          },
          "expected": 5203.36,
          "toleranceDecimalPlaces": 1,
          "unit": "$ (estimated current price)",
          "confidence": "low",
          "steps": [
            {
              "label": "Total change",
              "value": 203.36311150660913,
              "unit": "$"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "material-volume-to-weight-calculator",
      "title": "Material Volume to Weight Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/material-volume-to-weight-calculator/",
      "sources": [
        "Commonly cited average bulk densities: gravel/sand ~2,700 lb/yd³ (1.35 tons), topsoil ~2,200 lb/yd³ (1.1 tons), mulch ~600 lb/yd³ (0.3 tons) — actual density varies by moisture content and compaction"
      ],
      "vectors": [
        {
          "name": "10 yd³ gravel",
          "inputs": {
            "materialType": "gravel",
            "volumeCubicYards": 10
          },
          "expected": 13.5,
          "toleranceDecimalPlaces": 1,
          "unit": "tons",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight in pounds",
              "value": 27000,
              "unit": "lb"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15 yd³ topsoil",
          "inputs": {
            "materialType": "topsoil",
            "volumeCubicYards": 15
          },
          "expected": 16.5,
          "toleranceDecimalPlaces": 1,
          "unit": "tons",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight in pounds",
              "value": 33000,
              "unit": "lb"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "material-waste-cost-calculator",
      "title": "Material Waste Cost Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/material-waste-cost-calculator/",
      "sources": [
        "Total cost with waste = material cost x (1 + waste percent / 100)"
      ],
      "vectors": [
        {
          "name": "$5000 material, 10% waste",
          "inputs": {
            "materialCost": 5000,
            "wastePercent": 10
          },
          "expected": 5500,
          "toleranceDecimalPlaces": 0,
          "unit": "$ (total budget)",
          "confidence": "high",
          "steps": [
            {
              "label": "Waste cost",
              "value": 500,
              "unit": "$"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "$8000 material, 15% waste",
          "inputs": {
            "materialCost": 8000,
            "wastePercent": 15
          },
          "expected": 9200,
          "toleranceDecimalPlaces": 0,
          "unit": "$ (total budget)",
          "confidence": "high",
          "steps": [
            {
              "label": "Waste cost",
              "value": 1200,
              "unit": "$"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "material-weight-calculator",
      "title": "Material Weight Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/material-weight-calculator/",
      "sources": [
        "Bulk densities: FHWA and state DOT aggregate handbooks; ACI 211 for normal-weight concrete at 2400 kg/m³",
        "Loose bulk densities vary with moisture content and compaction — figures here are typical dry loose values"
      ],
      "vectors": [
        {
          "name": "1 m³ (1000 L) of gravel",
          "inputs": {
            "material": "gravel",
            "volume": 1000
          },
          "expected": 1600,
          "toleranceDecimalPlaces": -2,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Metric tonnes",
              "value": 1.6,
              "unit": "t"
            },
            {
              "label": "US short tons",
              "value": 1.7636980974790206,
              "unit": "tons"
            },
            {
              "label": "Pounds",
              "value": 3527.396194958041,
              "unit": "lb"
            },
            {
              "label": "Density used",
              "value": 1600,
              "unit": "kg/m³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "1 m³ (1000 L) of normal-weight concrete",
          "inputs": {
            "material": "concrete",
            "volume": 1000
          },
          "expected": 2400,
          "toleranceDecimalPlaces": -2,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Metric tonnes",
              "value": 2.4,
              "unit": "t"
            },
            {
              "label": "US short tons",
              "value": 2.6455471462185307,
              "unit": "tons"
            },
            {
              "label": "Pounds",
              "value": 5291.094292437062,
              "unit": "lb"
            },
            {
              "label": "Density used",
              "value": 2400,
              "unit": "kg/m³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Wet sand is heavier than dry",
          "inputs": {
            "material": "sandWet",
            "volume": 1000
          },
          "expected": 1920,
          "toleranceDecimalPlaces": -2,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Metric tonnes",
              "value": 1.92,
              "unit": "t"
            },
            {
              "label": "US short tons",
              "value": 2.1164377169748247,
              "unit": "tons"
            },
            {
              "label": "Pounds",
              "value": 4232.875433949649,
              "unit": "lb"
            },
            {
              "label": "Density used",
              "value": 1920,
              "unit": "kg/m³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "3 m³ (3000 L) of bark mulch",
          "inputs": {
            "material": "mulch",
            "volume": 3000
          },
          "expected": 1200,
          "toleranceDecimalPlaces": -2,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Metric tonnes",
              "value": 1.2,
              "unit": "t"
            },
            {
              "label": "US short tons",
              "value": 1.3227735731092654,
              "unit": "tons"
            },
            {
              "label": "Pounds",
              "value": 2645.547146218531,
              "unit": "lb"
            },
            {
              "label": "Density used",
              "value": 400,
              "unit": "kg/m³"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "medical-gas-purge-volume-calculator",
      "title": "Medical Gas Pipeline Nitrogen Purge Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/medical-gas-purge-volume-calculator/",
      "sources": [
        "Purge volume = internal pipe volume × purge multiplier, following NFPA 99 medical gas and vacuum systems practice of purging piping with an inert gas (typically nitrogen) at several times the pipe's internal volume before placing it into service"
      ],
      "vectors": [
        {
          "name": "20L pipe volume, 5x multiplier",
          "inputs": {
            "pipeVolume": 20,
            "purgeMultiplier": 5
          },
          "expected": 100,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "35L pipe volume, 6x multiplier",
          "inputs": {
            "pipeVolume": 35,
            "purgeMultiplier": 6
          },
          "expected": 210,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "membrane-penetration-box-area-calculator",
      "title": "Firestop Membrane Penetration Box Area Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/membrane-penetration-box-area-calculator/",
      "sources": [
        "International Building Code, fire and smoke protection features — membrane penetrations of MAXIMUM 2-HOUR fire-resistance-rated walls and partitions by steel electrical boxes: individual face area not exceeding 16 in² (0.0103 m²), with the aggregate area of such openings not exceeding 100 in² (0.0645 m²) in any 100 ft² (9.29 m²) of wall area. The allowance does not extend to walls rated above 2 hours",
        "Same provision, boxes on opposite sides of a rated wall: separated by a horizontal distance of not less than 24 in (610 mm), unless separated by the insulation the code describes, by solid fireblocking, or protected by a listed putty pad or other listed material. Confirm against the edition your jurisdiction has adopted and any local amendment",
        "The wall's fire-resistance rating itself comes from a tested assembly under ASTM E119 or UL 263. This page checks the openings cut through the membrane against the code's limits; it does not establish or verify the rating"
      ],
      "vectors": [
        {
          "name": "Twelve 16 in² boxes in 100 ft² of wall",
          "inputs": {
            "boxFaceArea": 0.01032256,
            "boxCount": 12,
            "wallArea": 9.290304,
            "oppositeFaceSeparation": 0.6096,
            "listedPads": "no"
          },
          "expected": 192,
          "toleranceDecimalPlaces": 1,
          "unit": "% of the cap",
          "confidence": "low",
          "steps": [
            {
              "label": "Aggregate box opening area",
              "value": 0.12387071999999999,
              "unit": "m²"
            },
            {
              "label": "Cap for the wall area entered",
              "value": 0.064516,
              "unit": "m²"
            },
            {
              "label": "Boxes this wall area can carry at that size",
              "value": 6,
              "unit": "boxes"
            },
            {
              "label": "Largest single box allowed without a listed system",
              "value": 0.01032256,
              "unit": "m²"
            },
            {
              "label": "Separation required between opposing boxes",
              "value": 609.5999999999999,
              "unit": "mm"
            },
            {
              "label": "Separation entered",
              "value": 609.6,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "a 3-hour wall gets no prescriptive allowance, however small the boxes",
          "inputs": {
            "wallRating": "3",
            "boxFaceArea": 0.0064516,
            "boxCount": 2,
            "wallArea": 9.290304,
            "oppositeFaceSeparation": 0.6096,
            "listedPads": "no"
          },
          "expected": 20,
          "toleranceDecimalPlaces": 1,
          "unit": "% of the cap",
          "confidence": "low",
          "steps": [
            {
              "label": "Aggregate box opening area",
              "value": 0.0129032,
              "unit": "m²"
            },
            {
              "label": "Cap for the wall area entered",
              "value": 0.064516,
              "unit": "m²"
            },
            {
              "label": "Boxes this wall area can carry at that size",
              "value": 10,
              "unit": "boxes"
            },
            {
              "label": "Largest single box allowed without a listed system",
              "value": 0.01032256,
              "unit": "m²"
            },
            {
              "label": "Separation required between opposing boxes",
              "value": 609.5999999999999,
              "unit": "mm"
            },
            {
              "label": "Separation entered",
              "value": 609.6,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Six 16 in² boxes spread over 200 ft² of wall",
          "inputs": {
            "boxFaceArea": 0.01032256,
            "boxCount": 6,
            "wallArea": 18.580608,
            "oppositeFaceSeparation": 0.6096,
            "listedPads": "no"
          },
          "expected": 48,
          "toleranceDecimalPlaces": 1,
          "unit": "% of the cap",
          "confidence": "medium",
          "steps": [
            {
              "label": "Aggregate box opening area",
              "value": 0.061935359999999995,
              "unit": "m²"
            },
            {
              "label": "Cap for the wall area entered",
              "value": 0.129032,
              "unit": "m²"
            },
            {
              "label": "Boxes this wall area can carry at that size",
              "value": 12,
              "unit": "boxes"
            },
            {
              "label": "Largest single box allowed without a listed system",
              "value": 0.01032256,
              "unit": "m²"
            },
            {
              "label": "Separation required between opposing boxes",
              "value": 609.5999999999999,
              "unit": "mm"
            },
            {
              "label": "Separation entered",
              "value": 609.6,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "metal-roof-panel-calculator",
      "title": "Metal Roof Panel Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/metal-roof-panel-calculator/",
      "sources": [
        "Panel coverage width is the net width after the side lap, and is what manufacturers publish for ordering",
        "MCA (Metal Construction Association) installation guidance: panels are run full length from eave to ridge wherever possible to avoid an end lap"
      ],
      "vectors": [
        {
          "name": "12 m eave at 457 mm coverage",
          "inputs": {
            "eaveLength": 12,
            "rafterLength": 5,
            "coverageWidth": 0.457
          },
          "expected": 27,
          "toleranceDecimalPlaces": 0,
          "unit": "panels per slope",
          "confidence": "high",
          "steps": [
            {
              "label": "Panel length required",
              "value": 5,
              "unit": "m"
            },
            {
              "label": "Total linear panel",
              "value": 135,
              "unit": "m"
            },
            {
              "label": "Slope area",
              "value": 60,
              "unit": "m²"
            },
            {
              "label": "Both slopes",
              "value": 54,
              "unit": "panels"
            },
            {
              "label": "Coverage of the last panel used",
              "value": 0.11799999999999955,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A wider 610 mm panel needs fewer",
          "inputs": {
            "eaveLength": 12,
            "rafterLength": 5,
            "coverageWidth": 0.61
          },
          "expected": 20,
          "toleranceDecimalPlaces": 0,
          "unit": "panels per slope",
          "confidence": "high",
          "steps": [
            {
              "label": "Panel length required",
              "value": 5,
              "unit": "m"
            },
            {
              "label": "Total linear panel",
              "value": 100,
              "unit": "m"
            },
            {
              "label": "Slope area",
              "value": 60,
              "unit": "m²"
            },
            {
              "label": "Both slopes",
              "value": 40,
              "unit": "panels"
            },
            {
              "label": "Coverage of the last panel used",
              "value": 0.41000000000000025,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "An exact multiple needs no part panel",
          "inputs": {
            "eaveLength": 12.339,
            "rafterLength": 5,
            "coverageWidth": 0.457
          },
          "expected": 27,
          "toleranceDecimalPlaces": 0,
          "unit": "panels per slope",
          "confidence": "high",
          "steps": [
            {
              "label": "Panel length required",
              "value": 5,
              "unit": "m"
            },
            {
              "label": "Total linear panel",
              "value": 135,
              "unit": "m"
            },
            {
              "label": "Slope area",
              "value": 61.695,
              "unit": "m²"
            },
            {
              "label": "Both slopes",
              "value": 54,
              "unit": "panels"
            },
            {
              "label": "Coverage of the last panel used",
              "value": 0.45699999999999996,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A longer eave needs proportionally more",
          "inputs": {
            "eaveLength": 24,
            "rafterLength": 5,
            "coverageWidth": 0.457
          },
          "expected": 53,
          "toleranceDecimalPlaces": 0,
          "unit": "panels per slope",
          "confidence": "high",
          "steps": [
            {
              "label": "Panel length required",
              "value": 5,
              "unit": "m"
            },
            {
              "label": "Total linear panel",
              "value": 265,
              "unit": "m"
            },
            {
              "label": "Slope area",
              "value": 120,
              "unit": "m²"
            },
            {
              "label": "Both slopes",
              "value": 106,
              "unit": "panels"
            },
            {
              "label": "Coverage of the last panel used",
              "value": 0.2359999999999991,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "metalwork-railing-paint-calculator",
      "title": "Metalwork and Railing Paint Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/metalwork-railing-paint-calculator/",
      "sources": [
        "Metalwork is measured by girth: the paintable area of a run is its length times the perimeter of its section, since the brush travels around the profile as well as along it",
        "Section girths: round is pi times the diameter, square is four times the side, and rectangular or angle is twice the sum of the two dimensions",
        "Paint for one coat is the area divided by the spread rate; coats multiply it, and the loss on open metalwork is far higher than on a flat surface"
      ],
      "vectors": [
        {
          "name": "10 m of rail at 160 mm girth, 50 balusters 900 mm at 80 mm girth, 2 coats at 12, 30% loss",
          "inputs": {
            "railLength": 10,
            "railGirth": 0.16,
            "balusters": 50,
            "balusterHeight": 0.9,
            "balusterGirth": 0.08,
            "coats": 2,
            "spreadRate": 12,
            "wastePercent": 30
          },
          "expected": 0.2976,
          "toleranceDecimalPlaces": 3,
          "unit": "gal",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rail surface",
              "value": 17.222256666735557,
              "unit": "sq ft"
            },
            {
              "label": "Baluster surface",
              "value": 38.750077500155,
              "unit": "sq ft"
            },
            {
              "label": "Total surface, 2 coat(s)",
              "value": 111.94466833378111,
              "unit": "sq ft"
            },
            {
              "label": "Allowance at 30%",
              "value": 0.0686847336131186,
              "unit": "gal"
            },
            {
              "label": "Quart tins",
              "value": 2,
              "unit": "quarts"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The balusters alone are more than twice the rails",
          "inputs": {
            "railLength": 0,
            "railGirth": 0.16,
            "balusters": 50,
            "balusterHeight": 0.9,
            "balusterGirth": 0.08,
            "coats": 2,
            "spreadRate": 12,
            "wastePercent": 30
          },
          "expected": 0.2061,
          "toleranceDecimalPlaces": 3,
          "unit": "gal",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rail surface",
              "value": 0,
              "unit": "sq ft"
            },
            {
              "label": "Baluster surface",
              "value": 38.750077500155,
              "unit": "sq ft"
            },
            {
              "label": "Total surface, 2 coat(s)",
              "value": 77.50015500031,
              "unit": "sq ft"
            },
            {
              "label": "Allowance at 30%",
              "value": 0.04755096942446673,
              "unit": "gal"
            },
            {
              "label": "Quart tins",
              "value": 1,
              "unit": "quarts"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Round bar instead of square: 63 mm girth rather than 80",
          "inputs": {
            "railLength": 10,
            "railGirth": 0.16,
            "balusters": 50,
            "balusterHeight": 0.9,
            "balusterGirth": 0.063,
            "coats": 2,
            "spreadRate": 12,
            "wastePercent": 30
          },
          "expected": 0.2538,
          "toleranceDecimalPlaces": 3,
          "unit": "gal",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rail surface",
              "value": 17.222256666735557,
              "unit": "sq ft"
            },
            {
              "label": "Baluster surface",
              "value": 30.51568603137206,
              "unit": "sq ft"
            },
            {
              "label": "Total surface, 2 coat(s)",
              "value": 95.47588539621525,
              "unit": "sq ft"
            },
            {
              "label": "Allowance at 30%",
              "value": 0.05858015261041941,
              "unit": "gal"
            },
            {
              "label": "Quart tins",
              "value": 2,
              "unit": "quarts"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "meters-per-second-to-feet-per-minute-calculator",
      "title": "Metres per Second to Feet per Minute Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/meters-per-second-to-feet-per-minute-calculator/",
      "sources": [
        "Exact by definition. 1 ft = 0.3048 m exactly and there are 60 s in a minute, so 1 m/s = 60 ÷ 0.3048 ft/min = 25000/127 ft/min. The ratio is exact; its decimal expansion 196.850393700787401574… does not terminate, so the multiplier shown is that exact fraction rounded."
      ],
      "vectors": [
        {
          "name": "4.5 m/s converts correctly",
          "inputs": {
            "metresPerSecond": 4.5
          },
          "expected": 885.8267716535433,
          "toleranceDecimalPlaces": 6,
          "unit": "ft/min",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 196.8503937007874,
              "unit": "ft/min per m/s"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "metresPerSecond": 45
          },
          "expected": 8858.267716535433,
          "toleranceDecimalPlaces": 6,
          "unit": "ft/min",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 196.8503937007874,
              "unit": "ft/min per m/s"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "meters-to-feet-calculator",
      "title": "Metres to Feet Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/meters-to-feet-calculator/",
      "sources": [
        "1 m = 1 / 0.3048 ft = 3.280839895... ft"
      ],
      "vectors": [
        {
          "name": "6 m converts correctly",
          "inputs": {
            "metres": 6
          },
          "expected": 19.685039370078737,
          "toleranceDecimalPlaces": 6,
          "unit": "ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 3.280839895013123,
              "unit": "ft per m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "metres": 60
          },
          "expected": 196.85039370078738,
          "toleranceDecimalPlaces": 6,
          "unit": "ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 3.280839895013123,
              "unit": "ft per m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "meters-to-yards-calculator",
      "title": "Metres to Yards Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/meters-to-yards-calculator/",
      "sources": [
        "International yard and pound agreement (1959): 1 yard = 0.9144 m exactly, so 1 m ≈ 1.093613 yd"
      ],
      "vectors": [
        {
          "name": "100 m converts correctly",
          "inputs": {
            "meters": 100
          },
          "expected": 109.36132983377078,
          "toleranceDecimalPlaces": 6,
          "unit": "yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Same length in feet",
              "value": 328.0839895013123,
              "unit": "ft"
            },
            {
              "label": "Rounded up to whole yards (yd)",
              "value": 110,
              "unit": "yd"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "meters": 1000
          },
          "expected": 1093.6132983377079,
          "toleranceDecimalPlaces": 6,
          "unit": "yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Same length in feet",
              "value": 3280.839895013123,
              "unit": "ft"
            },
            {
              "label": "Rounded up to whole yards (yd)",
              "value": 1094,
              "unit": "yd"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "miles-to-kilometers-calculator",
      "title": "Miles to Kilometres Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/miles-to-kilometers-calculator/",
      "sources": [
        "NIST SP 811, Appendix B — 1 mile (international) = 1.609344 km (exact)",
        "International yard and pound agreement, 1959 — the yard is exactly 0.9144 m, from which the mile follows"
      ],
      "vectors": [
        {
          "name": "10 miles is 16.09 km",
          "inputs": {
            "miles": 10
          },
          "expected": 16.09344,
          "toleranceDecimalPlaces": 5,
          "unit": "km",
          "confidence": "high",
          "steps": [
            {
              "label": "Miles entered",
              "value": 10,
              "unit": "mi"
            },
            {
              "label": "Kilometres",
              "value": 16.09344,
              "unit": "km"
            },
            {
              "label": "Metres",
              "value": 16093.44,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "1 mile is the factor",
          "inputs": {
            "miles": 1
          },
          "expected": 1.609344,
          "toleranceDecimalPlaces": 6,
          "unit": "km",
          "confidence": "high",
          "steps": [
            {
              "label": "Miles entered",
              "value": 1,
              "unit": "mi"
            },
            {
              "label": "Kilometres",
              "value": 1.609344,
              "unit": "km"
            },
            {
              "label": "Metres",
              "value": 1609.344,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A 26.2 mile route is 42.16 km",
          "inputs": {
            "miles": 26.2
          },
          "expected": 42.1648128,
          "toleranceDecimalPlaces": 5,
          "unit": "km",
          "confidence": "high",
          "steps": [
            {
              "label": "Miles entered",
              "value": 26.2,
              "unit": "mi"
            },
            {
              "label": "Kilometres",
              "value": 42.1648128,
              "unit": "km"
            },
            {
              "label": "Metres",
              "value": 42164.8128,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "250 miles is 402.3 km",
          "inputs": {
            "miles": 250
          },
          "expected": 402.336,
          "toleranceDecimalPlaces": 3,
          "unit": "km",
          "confidence": "high",
          "steps": [
            {
              "label": "Miles entered",
              "value": 250,
              "unit": "mi"
            },
            {
              "label": "Kilometres",
              "value": 402.336,
              "unit": "km"
            },
            {
              "label": "Metres",
              "value": 402336,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "millimeters-to-centimeters-calculator",
      "title": "Millimetres to Centimetres Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/millimeters-to-centimeters-calculator/",
      "sources": [
        "SI prefixes (BIPM SI Brochure): 1 mm = 0.1 cm exactly"
      ],
      "vectors": [
        {
          "name": "2400 mm converts correctly",
          "inputs": {
            "millimeters": 2400
          },
          "expected": 240,
          "toleranceDecimalPlaces": 6,
          "unit": "cm",
          "confidence": "high",
          "steps": [
            {
              "label": "Same length in metres",
              "value": 2.4,
              "unit": "m"
            },
            {
              "label": "Same length in inches",
              "value": 94.48818897637796,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "millimeters": 24000
          },
          "expected": 2400,
          "toleranceDecimalPlaces": 6,
          "unit": "cm",
          "confidence": "high",
          "steps": [
            {
              "label": "Same length in metres",
              "value": 24,
              "unit": "m"
            },
            {
              "label": "Same length in inches",
              "value": 944.8818897637796,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "millimeters-to-inches-calculator",
      "title": "Millimetres to Inches Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/millimeters-to-inches-calculator/",
      "sources": [
        "1 in = 25.4 mm exactly, so 1 mm = 0.0393700787... in"
      ],
      "vectors": [
        {
          "name": "300 mm converts correctly",
          "inputs": {
            "millimetres": 300
          },
          "expected": 11.811023622047244,
          "toleranceDecimalPlaces": 6,
          "unit": "in",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.03937007874015748,
              "unit": "in per mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "millimetres": 3000
          },
          "expected": 118.11023622047244,
          "toleranceDecimalPlaces": 6,
          "unit": "in",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.03937007874015748,
              "unit": "in per mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "mineral-wool-batt-calculator",
      "title": "Mineral Wool Insulation Batt Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/mineral-wool-batt-calculator/",
      "sources": [
        "Package count = ceil((area ÷ package coverage area) × (1 + waste allowance)), the same coverage method used for fiberglass batt insulation, applied to mineral wool's typical package coverage"
      ],
      "vectors": [
        {
          "name": "40 m², 4.64 m² package, 5% waste",
          "inputs": {
            "area": 40,
            "packageCoverage": 4.64,
            "wastePercent": 5
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "packages",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "60 m², 4.64 m² package, 8% waste",
          "inputs": {
            "area": 60,
            "packageCoverage": 4.64,
            "wastePercent": 8
          },
          "expected": 14,
          "toleranceDecimalPlaces": 0,
          "unit": "packages",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "mineral-wool-board-calculator",
      "title": "Exterior Mineral Wool Board Insulation Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/mineral-wool-board-calculator/",
      "sources": [
        "Board count = area x layers x (1 + waste) / the face area of one board, rounded up — the face area being measured from the product rather than assumed, because semi-rigid mineral wool board is sold in several face sizes that differ by manufacturer and density grade",
        "A multi-layer build-up is a full-area order per layer: staggering the joints between layers means neither layer can be made up from the other's offcuts"
      ],
      "vectors": [
        {
          "name": "40 m² single layer of 1200x600 board at 10% waste",
          "inputs": {
            "area": 40,
            "boardLength": 1.2,
            "boardWidth": 0.6,
            "layers": 1,
            "wasteFactorPercent": 10
          },
          "expected": 62,
          "toleranceDecimalPlaces": 0,
          "unit": "boards",
          "confidence": "high",
          "steps": [
            {
              "label": "Face area of one board",
              "value": 0.72,
              "unit": "m²"
            },
            {
              "label": "Area over all layers",
              "value": 40,
              "unit": "m²"
            },
            {
              "label": "Area including waste",
              "value": 44,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "two staggered layers double the order",
          "inputs": {
            "area": 40,
            "boardLength": 1.2,
            "boardWidth": 0.6,
            "layers": 2,
            "wasteFactorPercent": 10
          },
          "expected": 123,
          "toleranceDecimalPlaces": 0,
          "unit": "boards",
          "confidence": "high",
          "steps": [
            {
              "label": "Face area of one board",
              "value": 0.72,
              "unit": "m²"
            },
            {
              "label": "Area over all layers",
              "value": 80,
              "unit": "m²"
            },
            {
              "label": "Area including waste",
              "value": 88,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "exact fit with no waste still rounds up to whole boards",
          "inputs": {
            "area": 7.2,
            "boardLength": 1.2,
            "boardWidth": 0.6,
            "layers": 1,
            "wasteFactorPercent": 0
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "boards",
          "confidence": "high",
          "steps": [
            {
              "label": "Face area of one board",
              "value": 0.72,
              "unit": "m²"
            },
            {
              "label": "Area over all layers",
              "value": 7.2,
              "unit": "m²"
            },
            {
              "label": "Area including waste",
              "value": 7.2,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "mini-split-line-length-derating-calculator",
      "title": "Mini-Split/VRF Line Set Length Derating Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/mini-split-line-length-derating-calculator/",
      "sources": [
        "Manufacturers of mini-split and VRF systems publish a base line length included at 100% rated capacity, then apply a percentage capacity derate per foot of additional horizontal run and per foot of vertical rise beyond that allowance — this calculator applies user-supplied derate rates (from the specific manufacturer's engineering/installation manual) rather than a universal constant, since these rates vary significantly by manufacturer and model."
      ],
      "vectors": [
        {
          "name": "24,000 BTU/hr (7.03 kW), 20ft extra horizontal, 10ft rise",
          "inputs": {
            "ratedCapacity": 7033.705684133281,
            "extraHorizontalLength": 6.096,
            "horizontalDerateRate": 0.5,
            "verticalRise": 3.048,
            "verticalDerateRate": 1
          },
          "expected": 19200,
          "toleranceDecimalPlaces": -1,
          "unit": "BTU/hr",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total capacity derate",
              "value": 19.999999999999996,
              "unit": "%"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "36,000 BTU/hr (10.55 kW), 30ft extra horizontal, 15ft rise",
          "inputs": {
            "ratedCapacity": 10550.55852619992,
            "extraHorizontalLength": 9.144,
            "horizontalDerateRate": 0.4,
            "verticalRise": 4.572,
            "verticalDerateRate": 0.8
          },
          "expected": 27360,
          "toleranceDecimalPlaces": -1,
          "unit": "BTU/hr",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total capacity derate",
              "value": 24,
              "unit": "%"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "mist-coat-calculator",
      "title": "Mist Coat Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/mist-coat-calculator/",
      "sources": [
        "The coating identity: the mixed volume for one coat is the area divided by the spread rate, multiplied by the number of coats",
        "Dilution is stated on the tin as water added as a proportion of the paint — 20% means one part water to five parts paint, so a litre of paint yields 1.2 litres of mix",
        "New plaster is porous and alkaline; a full-strength emulsion films over before the surface can take it and fails to key, which is the defect a thinned coat exists to prevent"
      ],
      "vectors": [
        {
          "name": "40 m² at 10 m²/L, thinned 20%, one coat",
          "inputs": {
            "area": 40,
            "spreadRate": 10,
            "dilutionPercent": 20,
            "coats": 1
          },
          "expected": 0.8806,
          "toleranceDecimalPlaces": 3,
          "unit": "gal",
          "confidence": "medium",
          "steps": [
            {
              "label": "Mixed volume to make up",
              "value": 1.0566882094325938,
              "unit": "gal"
            },
            {
              "label": "Water to add",
              "value": 0.1761147015720989,
              "unit": "gal"
            },
            {
              "label": "Gallon cans of paint",
              "value": 1,
              "unit": "cans"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The same paint unthinned is the whole 4 litres",
          "inputs": {
            "area": 40,
            "spreadRate": 10,
            "dilutionPercent": 0,
            "coats": 1
          },
          "expected": 1.0567,
          "toleranceDecimalPlaces": 3,
          "unit": "gal",
          "confidence": "medium",
          "steps": [
            {
              "label": "Mixed volume to make up",
              "value": 1.0566882094325938,
              "unit": "gal"
            },
            {
              "label": "Water to add",
              "value": 0,
              "unit": "gal"
            },
            {
              "label": "Gallon cans of paint",
              "value": 2,
              "unit": "cans"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A thirsty skim at 7 m²/L takes half as much again",
          "inputs": {
            "area": 40,
            "spreadRate": 7,
            "dilutionPercent": 20,
            "coats": 1
          },
          "expected": 1.258,
          "toleranceDecimalPlaces": 2,
          "unit": "gal",
          "confidence": "medium",
          "steps": [
            {
              "label": "Mixed volume to make up",
              "value": 1.5095545849037053,
              "unit": "gal"
            },
            {
              "label": "Water to add",
              "value": 0.2515924308172843,
              "unit": "gal"
            },
            {
              "label": "Gallon cans of paint",
              "value": 2,
              "unit": "cans"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "miter-angle-calculator",
      "title": "Miter Angle Calculator — Mitre Saw Corners, Frames and Crown",
      "url": "https://craftquantities.com/calculators/renovation-construction/miter-angle-calculator/",
      "sources": [
        "Euclid, Elements, Book I, Proposition 32 with Proclus's corollaries (D. E. Joyce's edition, Clark University): the exterior angles of any convex rectilinear figure together make four right angles — so each corner of a regular frame of n sides turns it through 360° ÷ n, and each of the two mitres at that corner takes half",
        "L.S. Starrett Company, CP505A-12 aluminum combination protractor user guide (crown molding user guide, Form 969): the inner 'Miter Cut' scale gives the mitre saw reading for a measured corner, and the Compound Cut Conversion Table gives the mitre and bevel for 38° and 45° crown laid flat, for Miter Cut readings of 1 to 60",
        "DeWALT DWS779 double bevel sliding compound miter saw, instruction manual N445793: most crown has 52° at the ceiling and 38° at the wall; mitre latch points at 31.62° and bevel stop pawls at 33.9° for 52/38 crown laid flat, the pawl reversible to 30° for 45/45 crown; the alternative method with the crown angled between fence and table needs no bevel and is cut at 45°; the saw mitres 60° right and 50° left and bevels 49° each way",
        "Joseph Fusco, crown moulding mitre and bevel angle chart for 38/52 and 45/45 stock at wall angles of 1° to 179°, reprinted by WOODWEB's knowledge base: at walls of 90° the 38/52 settings are 31.61 and 33.86, and at 45° they are 56.06 and 46.72 — the formulas above to two decimals, mostly cut off rather than rounded",
        "Compound mitre for a sprung moulding laid flat, derived from the geometry of the cut: with M the plain mitre for the corner and S the spring angle from the wall, mitre = arctan(sin S · tan M) and bevel = arcsin(cos S · sin M); nested against the fence, the same joint is the plain mitre M with no bevel"
      ],
      "vectors": [
        {
          "name": "a square internal corner takes 45°",
          "inputs": {
            "cutFor": "corner",
            "cornerAngle": 90
          },
          "expected": 45,
          "toleranceDecimalPlaces": 9,
          "unit": "°",
          "confidence": "high",
          "steps": [
            {
              "label": "Angle between each cut and the edge of its piece",
              "value": 45,
              "unit": "°"
            },
            {
              "label": "Angle the two pieces include",
              "value": 90,
              "unit": "°"
            },
            {
              "label": "Turn of the trim at the corner",
              "value": 90,
              "unit": "°"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "an internal corner opening to 94° takes 43°",
          "inputs": {
            "cutFor": "corner",
            "cornerAngle": 94
          },
          "expected": 43,
          "toleranceDecimalPlaces": 9,
          "unit": "°",
          "confidence": "high",
          "steps": [
            {
              "label": "Angle between each cut and the edge of its piece",
              "value": 47,
              "unit": "°"
            },
            {
              "label": "Angle the two pieces include",
              "value": 94,
              "unit": "°"
            },
            {
              "label": "Turn of the trim at the corner",
              "value": 86,
              "unit": "°"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "an external corner reading 273° takes 46.5°",
          "inputs": {
            "cutFor": "corner",
            "cornerAngle": 273
          },
          "expected": 46.5,
          "toleranceDecimalPlaces": 9,
          "unit": "°",
          "confidence": "high",
          "steps": [
            {
              "label": "Angle between each cut and the edge of its piece",
              "value": 43.5,
              "unit": "°"
            },
            {
              "label": "Angle the two pieces include",
              "value": 87,
              "unit": "°"
            },
            {
              "label": "Turn of the trim at the corner",
              "value": 93,
              "unit": "°"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "an octagon's eight joints are each cut at 22.5°",
          "inputs": {
            "cutFor": "polygon",
            "sides": 8
          },
          "expected": 22.5,
          "toleranceDecimalPlaces": 9,
          "unit": "°",
          "confidence": "high",
          "steps": [
            {
              "label": "Angle inside the shape at each corner",
              "value": 135,
              "unit": "°"
            },
            {
              "label": "Turn at each corner",
              "value": 45,
              "unit": "°"
            },
            {
              "label": "Angle between each cut and the edge of its piece",
              "value": 67.5,
              "unit": "°"
            },
            {
              "label": "Mitre cuts to make",
              "value": 16,
              "unit": "cuts"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a hexagon's joints are each cut at 30°",
          "inputs": {
            "cutFor": "polygon",
            "sides": 6
          },
          "expected": 30,
          "toleranceDecimalPlaces": 9,
          "unit": "°",
          "confidence": "high",
          "steps": [
            {
              "label": "Angle inside the shape at each corner",
              "value": 120,
              "unit": "°"
            },
            {
              "label": "Turn at each corner",
              "value": 60,
              "unit": "°"
            },
            {
              "label": "Angle between each cut and the edge of its piece",
              "value": 60,
              "unit": "°"
            },
            {
              "label": "Mitre cuts to make",
              "value": 12,
              "unit": "cuts"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "38/52 crown flat at a square corner: 31.62° on the table",
          "inputs": {
            "cutFor": "crown",
            "springAngle": 38,
            "crownCornerAngle": 90
          },
          "expected": 31.62,
          "toleranceDecimalPlaces": 2,
          "unit": "°",
          "confidence": "high",
          "steps": [
            {
              "label": "Bevel, moulding flat on the table",
              "value": 33.862913980967654,
              "unit": "°"
            },
            {
              "label": "Mitre, moulding nested against the fence",
              "value": 45,
              "unit": "°"
            },
            {
              "label": "Bevel, moulding nested against the fence",
              "value": 0,
              "unit": "°"
            },
            {
              "label": "Angle the two walls include",
              "value": 90,
              "unit": "°"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "45/45 crown flat at a square corner: 35.26° on the table",
          "inputs": {
            "cutFor": "crown",
            "springAngle": 45,
            "crownCornerAngle": 90
          },
          "expected": 35.2644,
          "toleranceDecimalPlaces": 3,
          "unit": "°",
          "confidence": "high",
          "steps": [
            {
              "label": "Bevel, moulding flat on the table",
              "value": 30.000000000000004,
              "unit": "°"
            },
            {
              "label": "Mitre, moulding nested against the fence",
              "value": 45,
              "unit": "°"
            },
            {
              "label": "Bevel, moulding nested against the fence",
              "value": 0,
              "unit": "°"
            },
            {
              "label": "Angle the two walls include",
              "value": 90,
              "unit": "°"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "38/52 crown at the 135° corner of a bay: 14.31° on the table",
          "inputs": {
            "cutFor": "crown",
            "springAngle": 38,
            "crownCornerAngle": 135
          },
          "expected": 14.3064,
          "toleranceDecimalPlaces": 3,
          "unit": "°",
          "confidence": "high",
          "steps": [
            {
              "label": "Bevel, moulding flat on the table",
              "value": 17.551243925464576,
              "unit": "°"
            },
            {
              "label": "Mitre, moulding nested against the fence",
              "value": 22.5,
              "unit": "°"
            },
            {
              "label": "Bevel, moulding nested against the fence",
              "value": 0,
              "unit": "°"
            },
            {
              "label": "Angle the two walls include",
              "value": 135,
              "unit": "°"
            }
          ],
          "basis": "cited",
          "sourceIndex": 4
        }
      ]
    },
    {
      "slug": "mixed-air-temperature-calculator",
      "title": "Mixed Air (Economizer) Temperature Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/mixed-air-temperature-calculator/",
      "sources": [
        "Mixed air temperature = (Outdoor Air CFM × Outdoor Air Temp + Return Air CFM × Return Air Temp) ÷ (Outdoor Air CFM + Return Air CFM), the standard air-stream mass-balance (weighted average) formula used in HVAC economizer and mixed-air control design."
      ],
      "vectors": [
        {
          "name": "500 CFM @35°F OA, 1500 CFM @72°F RA",
          "inputs": {
            "outdoorAirCfm": 235.9737,
            "outdoorTemp": 1.6666667,
            "returnAirCfm": 707.9212,
            "returnTemp": 22.2222222
          },
          "expected": 62.75,
          "toleranceDecimalPlaces": 1,
          "unit": "°F",
          "confidence": "high",
          "steps": [
            {
              "label": "Total combined airflow",
              "value": 2000.0000288167678,
              "unit": "CFM"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1000 CFM @20°F OA, 2000 CFM @75°F RA",
          "inputs": {
            "outdoorAirCfm": 471.9474,
            "outdoorTemp": -6.6666667,
            "returnAirCfm": 943.8949,
            "returnTemp": 23.8888889
          },
          "expected": 56.67,
          "toleranceDecimalPlaces": 1,
          "unit": "°F",
          "confidence": "high",
          "steps": [
            {
              "label": "Total combined airflow",
              "value": 2999.9999372811517,
              "unit": "CFM"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "mlv-soundproofing-calculator",
      "title": "Mass-Loaded Vinyl (MLV) Soundproofing Barrier Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/mlv-soundproofing-calculator/",
      "sources": [
        "Material needed = wall/ceiling area × (1 + waste allowance), the standard coverage-with-waste method applied to MLV sheet installation"
      ],
      "vectors": [
        {
          "name": "45 m² wall, 5% waste",
          "inputs": {
            "wallArea": 45,
            "wastePercent": 5
          },
          "expected": 47.25,
          "toleranceDecimalPlaces": 2,
          "unit": "m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "65 m² wall, 8% waste",
          "inputs": {
            "wallArea": 65,
            "wastePercent": 8
          },
          "expected": 70.2,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "mm-to-inch-fraction-calculator",
      "title": "Millimetres to Inch Fraction Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/mm-to-inch-fraction-calculator/",
      "sources": [
        "1 in = 25.4 mm (exact); the decimal result is rounded to the nearest 1/16 or 1/32 in, matching standard tape measure markings"
      ],
      "vectors": [
        {
          "name": "50mm to nearest 1/16 in",
          "inputs": {
            "millimeters": 50,
            "precision": "16"
          },
          "expected": 1.9685,
          "toleranceDecimalPlaces": 3,
          "unit": "in (≈ 1 15/16 in)",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "100mm to nearest 1/32 in",
          "inputs": {
            "millimeters": 100,
            "precision": "32"
          },
          "expected": 3.937,
          "toleranceDecimalPlaces": 3,
          "unit": "in (≈ 3 15/16 in)",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "modified-bitumen-scrap-calculator",
      "title": "Modified Bitumen Cap Sheet Scrap Factor Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/modified-bitumen-scrap-calculator/",
      "sources": [
        "Sheet count = ceil((roof area × (1 + scrap allowance)) ÷ sheet coverage area); torch-applied modified bitumen commonly requires an added scrap factor to account for granule embedment loss and heat damage at seams during application"
      ],
      "vectors": [
        {
          "name": "100m² roof, 8% scrap, 9.3m² sheets",
          "inputs": {
            "roofArea": 100,
            "scrapPercent": 8,
            "sheetCoverageArea": 9.3
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150m² roof, 10% scrap, 9.3m² sheets",
          "inputs": {
            "roofArea": 150,
            "scrapPercent": 10,
            "sheetCoverageArea": 9.3
          },
          "expected": 18,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "modified-plasticity-index-calculator",
      "title": "Modified Plasticity Index Calculator (NHBC 4.2 Volume Change Potential)",
      "url": "https://craftquantities.com/calculators/materials-quantities/modified-plasticity-index-calculator/",
      "sources": [
        "NHBC Standards 2024, Chapter 4.2 Building near trees: modified plasticity index I′p = Ip × (% of particles less than 425 µm) ÷ 100%; Table 1 bands 40% and greater high, 20% to less than 40% medium and 10% to less than 20% low volume change potential; shrinkable soils have over 35% fine particles and a modified plasticity index of 10% or greater; high volume change potential is assumed when it is unknown",
        "NHBC Standards 2024, Chapter 4.2 Table 3b: the lateral zone of influence of a tree is 1.25 × mature height for high water demand species, 0.75 × for moderate and 0.5 × for low; H is the species' mature height from Table 3, and D the distance from the tree to the foundation"
      ],
      "vectors": [
        {
          "name": "A plasticity index of 45 with everything passing: high",
          "inputs": {
            "plasticityIndex": 45,
            "passing425": 100,
            "finesPercent": 90,
            "waterDemand": "high",
            "matureHeight": 20,
            "distance": 9.1
          },
          "expected": 45,
          "toleranceDecimalPlaces": 3,
          "unit": "%",
          "confidence": "high",
          "steps": [
            {
              "label": "Plasticity index",
              "value": 45,
              "unit": "%"
            },
            {
              "label": "Share passing 425 µm",
              "value": 100,
              "unit": "%"
            },
            {
              "label": "D/H",
              "value": 0.45499999999999996
            },
            {
              "label": "Lateral zone of influence of the tree",
              "value": 25,
              "unit": "m"
            },
            {
              "label": "Distance from the tree to the foundation",
              "value": 9.1,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The same clay 40% sand: medium",
          "inputs": {
            "plasticityIndex": 45,
            "passing425": 60,
            "finesPercent": 55,
            "waterDemand": "high",
            "matureHeight": 20,
            "distance": 9.1
          },
          "expected": 27,
          "toleranceDecimalPlaces": 3,
          "unit": "%",
          "confidence": "high",
          "steps": [
            {
              "label": "Plasticity index",
              "value": 45,
              "unit": "%"
            },
            {
              "label": "Share passing 425 µm",
              "value": 60,
              "unit": "%"
            },
            {
              "label": "D/H",
              "value": 0.45499999999999996
            },
            {
              "label": "Lateral zone of influence of the tree",
              "value": 25,
              "unit": "m"
            },
            {
              "label": "Distance from the tree to the foundation",
              "value": 9.1,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Ip 25, 60% passing: low",
          "inputs": {
            "plasticityIndex": 25,
            "passing425": 60,
            "finesPercent": 50,
            "waterDemand": "moderate",
            "matureHeight": 16,
            "distance": 15
          },
          "expected": 15,
          "toleranceDecimalPlaces": 3,
          "unit": "%",
          "confidence": "high",
          "steps": [
            {
              "label": "Plasticity index",
              "value": 25,
              "unit": "%"
            },
            {
              "label": "Share passing 425 µm",
              "value": 60,
              "unit": "%"
            },
            {
              "label": "D/H",
              "value": 0.9375
            },
            {
              "label": "Lateral zone of influence of the tree",
              "value": 12,
              "unit": "m"
            },
            {
              "label": "Distance from the tree to the foundation",
              "value": 15,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Ip 12, 70% passing: below the shrinkable range",
          "inputs": {
            "plasticityIndex": 12,
            "passing425": 70,
            "finesPercent": 40,
            "waterDemand": "low",
            "matureHeight": 10,
            "distance": 8
          },
          "expected": 8.4,
          "toleranceDecimalPlaces": 3,
          "unit": "%",
          "confidence": "high",
          "steps": [
            {
              "label": "Plasticity index",
              "value": 12,
              "unit": "%"
            },
            {
              "label": "Share passing 425 µm",
              "value": 70,
              "unit": "%"
            },
            {
              "label": "D/H",
              "value": 0.8
            },
            {
              "label": "Lateral zone of influence of the tree",
              "value": 5,
              "unit": "m"
            },
            {
              "label": "Distance from the tree to the foundation",
              "value": 8,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "modular-carpet-tile-calculator",
      "title": "Modular Carpet Tile Layout Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/modular-carpet-tile-calculator/",
      "sources": [
        "Carpet tile count = ceil((floor area ÷ tile area) × (1 + waste allowance)), the same coverage method used for ceramic tile, applied to standard square modular carpet tiles (commonly 0.5m × 0.5m)"
      ],
      "vectors": [
        {
          "name": "40m² area, 0.5m tile, 7% waste",
          "inputs": {
            "floorArea": 40,
            "tileSize": 0.5,
            "wastePercent": 7
          },
          "expected": 172,
          "toleranceDecimalPlaces": 0,
          "unit": "tiles",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "55m² area, 0.5m tile, 10% waste",
          "inputs": {
            "floorArea": 55,
            "tileSize": 0.5,
            "wastePercent": 10
          },
          "expected": 242,
          "toleranceDecimalPlaces": 0,
          "unit": "tiles",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "mortar-cubic-yards-to-tons-calculator",
      "title": "Mortar Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/mortar-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 1.8 short tons per cubic yard",
        "Density varies with moisture, grading and composition — the supplier's ticket weight governs"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 18,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.8,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 180,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.8,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "mortar-mix-calculator",
      "title": "Mortar Mix Calculator (ASTM C270 Types M, S, N, O)",
      "url": "https://craftquantities.com/calculators/materials-quantities/mortar-mix-calculator/",
      "sources": [
        "Proportions are the ASTM C270 PROPORTION specification, parts by volume per 1 part portland cement: Type M 1/4 lime, Type S over 1/4 to 1/2, Type N over 1/2 to 1 1/4, Type O over 1 1/4 to 2 1/2. The midpoint of each band is used as the nominal and both ends are shown",
        "Aggregate is not less than 2 1/4 and not more than 3 times the sum of the cementitious volumes, which is why the sand ratio is an input bounded at those limits rather than a fixed figure",
        "Wet yield is taken as the sand volume, because the binder paste occupies the voids between sand grains rather than adding to them — a trade convention stated here rather than a measured property, and it moves with the sand's grading",
        "A US sack of portland cement is 94 lb and one cubic foot by definition, so that bag volume is exact. The 25 kg metric bag volume assumes a loose bulk density near 1,500 kg per cubic metre and is an assumption, not a definition"
      ],
      "vectors": [
        {
          "name": "1 m³ of Type N at 3 sand, 10% waste",
          "inputs": {
            "mortarVolume": 1000,
            "mortarType": "N",
            "sandRatio": 3,
            "wastePercent": 10
          },
          "expected": 38.85,
          "toleranceDecimalPlaces": 1,
          "unit": "ft³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cement",
              "value": 6.905979269979992,
              "unit": "ft³"
            },
            {
              "label": "Hydrated lime",
              "value": 6.042731861232492,
              "unit": "ft³"
            },
            {
              "label": "Sand",
              "value": 38.846133393637444,
              "unit": "ft³"
            },
            {
              "label": "94 lb sacks (1 ft³ each)",
              "value": 7,
              "unit": "sacks"
            },
            {
              "label": "Mortar after waste",
              "value": 38.846133393637444,
              "unit": "ft³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Type M, richer sand ratio, no waste",
          "inputs": {
            "mortarVolume": 1000,
            "mortarType": "M",
            "sandRatio": 2.25,
            "wastePercent": 0
          },
          "expected": 35.31,
          "toleranceDecimalPlaces": 1,
          "unit": "ft³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cement",
              "value": 12.556325945418164,
              "unit": "ft³"
            },
            {
              "label": "Hydrated lime",
              "value": 3.139081486354541,
              "unit": "ft³"
            },
            {
              "label": "Sand",
              "value": 35.31466672148859,
              "unit": "ft³"
            },
            {
              "label": "94 lb sacks (1 ft³ each)",
              "value": 13,
              "unit": "sacks"
            },
            {
              "label": "Mortar after waste",
              "value": 35.31466672148859,
              "unit": "ft³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "a small Type O pointing batch",
          "inputs": {
            "mortarVolume": 50,
            "mortarType": "O",
            "sandRatio": 3,
            "wastePercent": 10
          },
          "expected": 1.94,
          "toleranceDecimalPlaces": 1,
          "unit": "ft³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cement",
              "value": 0.22519497619499973,
              "unit": "ft³"
            },
            {
              "label": "Hydrated lime",
              "value": 0.42224058036562445,
              "unit": "ft³"
            },
            {
              "label": "Sand",
              "value": 1.9423066696818727,
              "unit": "ft³"
            },
            {
              "label": "94 lb sacks (1 ft³ each)",
              "value": 1,
              "unit": "sacks"
            },
            {
              "label": "Mortar after waste",
              "value": 1.9423066696818727,
              "unit": "ft³"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "mortar-tons-to-cubic-yards-calculator",
      "title": "Mortar Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/mortar-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 1.8 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 5.555555555555555,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.5555555555555556,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 55.55555555555556,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.5555555555555556,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "mortgage-affordability-calculator",
      "title": "Mortgage Affordability Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/mortgage-affordability-calculator/",
      "sources": [
        "Debt-to-income limits: US conventional underwriting commonly caps total DTI at 43-50%; UK and AU lenders assess affordability against stressed rates under FCA MCOB 11 and APRA guidance",
        "The DTI limit is a user input here because it varies by lender, product and jurisdiction"
      ],
      "vectors": [
        {
          "name": "75,000 income, 400 debts, 43% DTI, 5% over 25 years",
          "inputs": {
            "annualIncome": 75000,
            "monthlyDebts": 400,
            "dtiPercent": 43,
            "annualRatePercent": 5,
            "years": 25
          },
          "expected": 391299.86,
          "toleranceDecimalPlaces": -1,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Monthly income",
              "value": 6250,
              "unit": "currency"
            },
            {
              "label": "Total debt allowance at the stated DTI",
              "value": 2687.5,
              "unit": "currency"
            },
            {
              "label": "Available for the mortgage",
              "value": 2287.5,
              "unit": "currency"
            },
            {
              "label": "Other debts consuming allowance",
              "value": 400,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Clearing other debts raises the loan",
          "inputs": {
            "annualIncome": 75000,
            "monthlyDebts": 0,
            "dtiPercent": 43,
            "annualRatePercent": 5,
            "years": 25
          },
          "expected": 459723.88,
          "toleranceDecimalPlaces": -1,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Monthly income",
              "value": 6250,
              "unit": "currency"
            },
            {
              "label": "Total debt allowance at the stated DTI",
              "value": 2687.5,
              "unit": "currency"
            },
            {
              "label": "Available for the mortgage",
              "value": 2687.5,
              "unit": "currency"
            },
            {
              "label": "Other debts consuming allowance",
              "value": 0,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A higher rate supports less",
          "inputs": {
            "annualIncome": 75000,
            "monthlyDebts": 400,
            "dtiPercent": 43,
            "annualRatePercent": 7,
            "years": 25
          },
          "expected": 323651.29,
          "toleranceDecimalPlaces": -1,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Monthly income",
              "value": 6250,
              "unit": "currency"
            },
            {
              "label": "Total debt allowance at the stated DTI",
              "value": 2687.5,
              "unit": "currency"
            },
            {
              "label": "Available for the mortgage",
              "value": 2287.5,
              "unit": "currency"
            },
            {
              "label": "Other debts consuming allowance",
              "value": 400,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Debts above the allowance leave nothing",
          "inputs": {
            "annualIncome": 30000,
            "monthlyDebts": 2000,
            "dtiPercent": 43,
            "annualRatePercent": 5,
            "years": 25
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Monthly income",
              "value": 2500,
              "unit": "currency"
            },
            {
              "label": "Total debt allowance at the stated DTI",
              "value": 1075,
              "unit": "currency"
            },
            {
              "label": "Available for the mortgage",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Other debts consuming allowance",
              "value": 2000,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "mortgage-payment-calculator",
      "title": "Mortgage Payment Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/mortgage-payment-calculator/",
      "sources": [
        "Standard amortisation: M = P·r(1+r)ⁿ / ((1+r)ⁿ − 1), where r is the monthly rate and n the number of payments",
        "Rate is a user input with no default assumed from any market — enter the rate you have been quoted"
      ],
      "vectors": [
        {
          "name": "250,000 at 5% over 25 years",
          "inputs": {
            "principal": 250000,
            "annualRatePercent": 5,
            "years": 25
          },
          "expected": 1461.48,
          "toleranceDecimalPlaces": -1,
          "unit": "currency/month",
          "confidence": "high",
          "steps": [
            {
              "label": "Total repaid over the term",
              "value": 438442.53113098507,
              "unit": "currency"
            },
            {
              "label": "Total interest",
              "value": 188442.53113098507,
              "unit": "currency"
            },
            {
              "label": "Interest as a share of the loan",
              "value": 75.37701245239403,
              "unit": "%"
            },
            {
              "label": "First payment going to interest",
              "value": 1041.6666666666667,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "100,000 at 6% over 30 years",
          "inputs": {
            "principal": 100000,
            "annualRatePercent": 6,
            "years": 30
          },
          "expected": 599.55,
          "toleranceDecimalPlaces": -1,
          "unit": "currency/month",
          "confidence": "high",
          "steps": [
            {
              "label": "Total repaid over the term",
              "value": 215838.1890549925,
              "unit": "currency"
            },
            {
              "label": "Total interest",
              "value": 115838.18905499249,
              "unit": "currency"
            },
            {
              "label": "Interest as a share of the loan",
              "value": 115.83818905499248,
              "unit": "%"
            },
            {
              "label": "First payment going to interest",
              "value": 500,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A 0% loan is simple division",
          "inputs": {
            "principal": 120000,
            "annualRatePercent": 0,
            "years": 10
          },
          "expected": 1000,
          "toleranceDecimalPlaces": -1,
          "unit": "currency/month",
          "confidence": "high",
          "steps": [
            {
              "label": "Total repaid over the term",
              "value": 120000,
              "unit": "currency"
            },
            {
              "label": "Total interest",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Interest as a share of the loan",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "First payment going to interest",
              "value": 0,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Halving the term raises the payment but not double",
          "inputs": {
            "principal": 250000,
            "annualRatePercent": 5,
            "years": 12.5
          },
          "expected": 2244.7628,
          "toleranceDecimalPlaces": -2,
          "unit": "currency/month",
          "confidence": "high",
          "steps": [
            {
              "label": "Total repaid over the term",
              "value": 336714.416563872,
              "unit": "currency"
            },
            {
              "label": "Total interest",
              "value": 86714.41656387202,
              "unit": "currency"
            },
            {
              "label": "Interest as a share of the loan",
              "value": 34.68576662554881,
              "unit": "%"
            },
            {
              "label": "First payment going to interest",
              "value": 1041.6666666666667,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "mosaic-sheet-calculator",
      "title": "Mosaic Sheet Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/mosaic-sheet-calculator/",
      "sources": [
        "Area coverage: sheets are the area divided by one sheet's own area, rounded up, with an allowance for breakage and cutting",
        "A mesh-backed sheet is cut between the tesserae with a knife rather than through the tile, so the offcut stays usable and the waste allowance is about 5% rather than a tile's 10 to 15%",
        "Joint length: with a tessera pitch of (tessera + joint), joints run both ways at that pitch, giving 2 ÷ pitch of joint per unit area — 80 m per square metre at a 25 mm pitch, against 3.3 m for 600 mm tiles"
      ],
      "vectors": [
        {
          "name": "6 m² of 300 × 300 sheets, 5% allowance, 11 to a box",
          "inputs": {
            "area": 6,
            "sheetLength": 0.3,
            "sheetWidth": 0.3,
            "tesseraPitch": 0.025,
            "sheetsPerBox": 11,
            "wastePercent": 5
          },
          "expected": 70,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets",
          "confidence": "high",
          "steps": [
            {
              "label": "Sheets before the allowance",
              "value": 67,
              "unit": "sheets"
            },
            {
              "label": "Allowance at 5%",
              "value": 3,
              "unit": "sheets"
            },
            {
              "label": "Boxes of 11",
              "value": 7,
              "unit": "boxes"
            },
            {
              "label": "One sheet covers",
              "value": 0.9687519375038749,
              "unit": "ft²"
            },
            {
              "label": "Grout joint length",
              "value": 1574.803149606299,
              "unit": "ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A splashback: 0.6 m², no allowance, is under a box",
          "inputs": {
            "area": 0.6,
            "sheetLength": 0.3,
            "sheetWidth": 0.3,
            "tesseraPitch": 0.025,
            "sheetsPerBox": 11,
            "wastePercent": 0
          },
          "expected": 7,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets",
          "confidence": "high",
          "steps": [
            {
              "label": "Sheets before the allowance",
              "value": 7,
              "unit": "sheets"
            },
            {
              "label": "Allowance at 0%",
              "value": 0,
              "unit": "sheets"
            },
            {
              "label": "Boxes of 11",
              "value": 1,
              "unit": "boxes"
            },
            {
              "label": "One sheet covers",
              "value": 0.9687519375038749,
              "unit": "ft²"
            },
            {
              "label": "Grout joint length",
              "value": 157.48031496062993,
              "unit": "ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A tile's waste rate would buy three sheets that are never opened",
          "inputs": {
            "area": 6,
            "sheetLength": 0.3,
            "sheetWidth": 0.3,
            "tesseraPitch": 0.025,
            "sheetsPerBox": 11,
            "wastePercent": 15
          },
          "expected": 77,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets",
          "confidence": "high",
          "steps": [
            {
              "label": "Sheets before the allowance",
              "value": 67,
              "unit": "sheets"
            },
            {
              "label": "Allowance at 15%",
              "value": 10,
              "unit": "sheets"
            },
            {
              "label": "Boxes of 11",
              "value": 7,
              "unit": "boxes"
            },
            {
              "label": "One sheet covers",
              "value": 0.9687519375038749,
              "unit": "ft²"
            },
            {
              "label": "Grout joint length",
              "value": 1574.803149606299,
              "unit": "ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "motor-full-load-amps-calculator",
      "title": "Three-Phase Motor Full-Load Amperage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/motor-full-load-amps-calculator/",
      "sources": [
        "Standard three-phase motor FLA formula: FLA = (HP × 746) ÷ (√3 × voltage × efficiency × power factor), derived from the electrical power relationship P = √3 × V × I × PF applied to motor output power converted to input electrical power via efficiency"
      ],
      "vectors": [
        {
          "name": "10 HP, 480V, 90% eff, 0.85 PF",
          "inputs": {
            "horsepower": 10,
            "voltage": 480,
            "efficiency": 90,
            "powerFactor": 0.85
          },
          "expected": 11.73,
          "toleranceDecimalPlaces": 1,
          "unit": "A",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "25 HP, 480V, 92% eff, 0.87 PF",
          "inputs": {
            "horsepower": 25,
            "voltage": 480,
            "efficiency": 92,
            "powerFactor": 0.87
          },
          "expected": 28.03,
          "toleranceDecimalPlaces": 1,
          "unit": "A",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "mpg-to-liters-per-100km-calculator",
      "title": "MPG to Litres per 100 km Calculator",
      "url": "https://craftquantities.com/calculators/auto-utility/mpg-to-liters-per-100km-calculator/",
      "sources": [
        "1 US gallon = 3.785411784 L (exact); 1 mile = 1.609344 km (exact)",
        "1 imperial gallon = 1.20095 US gallons, from the exact litre definitions"
      ],
      "vectors": [
        {
          "name": "25 mpg is 9.41 L/100 km",
          "inputs": {
            "mpg": 25
          },
          "expected": 9.4086,
          "toleranceDecimalPlaces": 1,
          "unit": "L/100 km",
          "confidence": "high",
          "steps": [
            {
              "label": "US mpg entered",
              "value": 25,
              "unit": "mpg"
            },
            {
              "label": "Imperial mpg (UK)",
              "value": 30.02375,
              "unit": "mpg (imp)"
            },
            {
              "label": "km per litre",
              "value": 10.628592700819064,
              "unit": "km/L"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Doubling mpg halves consumption",
          "inputs": {
            "mpg": 50
          },
          "expected": 4.7043,
          "toleranceDecimalPlaces": 1,
          "unit": "L/100 km",
          "confidence": "high",
          "steps": [
            {
              "label": "US mpg entered",
              "value": 50,
              "unit": "mpg"
            },
            {
              "label": "Imperial mpg (UK)",
              "value": 60.0475,
              "unit": "mpg (imp)"
            },
            {
              "label": "km per litre",
              "value": 21.25718540163813,
              "unit": "km/L"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A thirsty 10 mpg truck",
          "inputs": {
            "mpg": 10
          },
          "expected": 23.5215,
          "toleranceDecimalPlaces": 4,
          "unit": "L/100 km",
          "confidence": "high",
          "steps": [
            {
              "label": "US mpg entered",
              "value": 10,
              "unit": "mpg"
            },
            {
              "label": "Imperial mpg (UK)",
              "value": 12.0095,
              "unit": "mpg (imp)"
            },
            {
              "label": "km per litre",
              "value": 4.251437080327626,
              "unit": "km/L"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "235.215 mpg is exactly 1 L/100 km",
          "inputs": {
            "mpg": 235.214583
          },
          "expected": 1,
          "toleranceDecimalPlaces": 2,
          "unit": "L/100 km",
          "confidence": "high",
          "steps": [
            {
              "label": "US mpg entered",
              "value": 235.214583,
              "unit": "mpg"
            },
            {
              "label": "Imperial mpg (UK)",
              "value": 282.48095345385,
              "unit": "mpg (imp)"
            },
            {
              "label": "km per litre",
              "value": 100,
              "unit": "km/L"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "mulch-calculator",
      "title": "Mulch Calculator",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/mulch-calculator/",
      "sources": [
        "75-100 mm (3-4 in) mulch depth for weed suppression and moisture retention — university extension horticulture guidance",
        "Bagged mulch is commonly sold in 2 ft³ (56.6 L) bags in North America and 50-70 L bags elsewhere"
      ],
      "vectors": [
        {
          "name": "20 m² at 75 mm in 2 ft³ bags",
          "inputs": {
            "area": 20,
            "depth": 0.075,
            "bagSize": "56.6"
          },
          "expected": 27,
          "toleranceDecimalPlaces": 0,
          "unit": "bags",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume",
              "value": 1.5,
              "unit": "m³"
            },
            {
              "label": "Cubic yards",
              "value": 1.9619259289715882,
              "unit": "yd³"
            },
            {
              "label": "Litres",
              "value": 1500,
              "unit": "L"
            },
            {
              "label": "Approximate weight",
              "value": 600,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Same bed in 70 L bags",
          "inputs": {
            "area": 20,
            "depth": 0.075,
            "bagSize": "70"
          },
          "expected": 22,
          "toleranceDecimalPlaces": 0,
          "unit": "bags",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume",
              "value": 1.5,
              "unit": "m³"
            },
            {
              "label": "Cubic yards",
              "value": 1.9619259289715882,
              "unit": "yd³"
            },
            {
              "label": "Litres",
              "value": 1500,
              "unit": "L"
            },
            {
              "label": "Approximate weight",
              "value": 600,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Bulk order returns cubic metres",
          "inputs": {
            "area": 20,
            "depth": 0.075,
            "bagSize": "0"
          },
          "expected": 1.5,
          "toleranceDecimalPlaces": 1,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume",
              "value": 1.5,
              "unit": "m³"
            },
            {
              "label": "Cubic yards",
              "value": 1.9619259289715882,
              "unit": "yd³"
            },
            {
              "label": "Litres",
              "value": 1500,
              "unit": "L"
            },
            {
              "label": "Approximate weight",
              "value": 600,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Deeper layer needs more bags",
          "inputs": {
            "area": 20,
            "depth": 0.1,
            "bagSize": "56.6"
          },
          "expected": 36,
          "toleranceDecimalPlaces": 0,
          "unit": "bags",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume",
              "value": 2,
              "unit": "m³"
            },
            {
              "label": "Cubic yards",
              "value": 2.6159012386287843,
              "unit": "yd³"
            },
            {
              "label": "Litres",
              "value": 2000,
              "unit": "L"
            },
            {
              "label": "Approximate weight",
              "value": 800,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "mulch-cubic-yards-to-tons-calculator",
      "title": "Mulch Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/mulch-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 0.4 short tons per cubic yard",
        "Bulk density varies with moisture, compaction and grading — the supplier's weighbridge ticket governs"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 4,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.4,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 40,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.4,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "mulch-gravel-calculator",
      "title": "Mulch & Gravel Calculator",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/mulch-gravel-calculator/",
      "sources": [
        "Standard landscaping formula: cubic yards = area (sq ft) x depth (inches) / 324",
        "1-2 inch depth is typical for fine mulch top-ups; 3-4 inches for coarser new mulch or gravel bases"
      ],
      "vectors": [
        {
          "name": "3x2m bed, 3in deep, 10% extra",
          "inputs": {
            "areaLength": 3,
            "areaWidth": 2,
            "depth": 0.0762,
            "wasteFactorPercent": 10
          },
          "expected": 0.66,
          "toleranceDecimalPlaces": 1,
          "unit": "cubic yards",
          "confidence": "high",
          "steps": [
            {
              "label": "Area",
              "value": 6,
              "unit": "m²"
            },
            {
              "label": "Depth",
              "value": 3.0000000000000004,
              "unit": "in"
            },
            {
              "label": "Volume (no extra)",
              "value": 0.5979950231505403,
              "unit": "yd³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "5x4m bed, 2in deep, 5% extra",
          "inputs": {
            "areaLength": 5,
            "areaWidth": 4,
            "depth": 0.0508,
            "wasteFactorPercent": 5
          },
          "expected": 1.4,
          "toleranceDecimalPlaces": 1,
          "unit": "cubic yards",
          "confidence": "high",
          "steps": [
            {
              "label": "Area",
              "value": 20,
              "unit": "m²"
            },
            {
              "label": "Depth",
              "value": 2,
              "unit": "in"
            },
            {
              "label": "Volume (no extra)",
              "value": 1.3288778292234225,
              "unit": "yd³"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "mulch-tons-to-cubic-yards-calculator",
      "title": "Mulch Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/mulch-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 0.4 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 25,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 2.5,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 250,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 2.5,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "mullion-deflection-calculator",
      "title": "Structural Glazing Mullion Wind Load Deflection Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/mullion-deflection-calculator/",
      "sources": [
        "AAMA TIR-11 / ASTM E1300: mullion deflection under uniform wind load, treated as a simply-supported beam, Δ = 5wL⁴/(384EI); standard allowable deflection limit for mullions supporting glass is L/175 (for spans up to about 4.1m/13'-6\"), keeping frame deflection small enough that the glass doesn't lose edge support or over-stress"
      ],
      "vectors": [
        {
          "name": "1500 N/m, 3m span, I=5×10⁶mm⁴ (pass)",
          "inputs": {
            "lineLoad": 1500,
            "span": 3,
            "elasticModulus": 70000000000,
            "momentOfInertia": 5
          },
          "expected": 4.52,
          "toleranceDecimalPlaces": 1,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "L/175 allowable limit",
              "value": 17.142857142857142,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2000 N/m, 2.5m span, I=4×10⁶mm⁴ (pass)",
          "inputs": {
            "lineLoad": 2000,
            "span": 2.5,
            "elasticModulus": 70000000000,
            "momentOfInertia": 4
          },
          "expected": 3.63,
          "toleranceDecimalPlaces": 1,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "L/175 allowable limit",
              "value": 14.285714285714286,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2700 N/m, 8m span, I=50×10⁶mm⁴ (long span, fails)",
          "inputs": {
            "lineLoad": 2700,
            "span": 8,
            "elasticModulus": 70000000000,
            "momentOfInertia": 50
          },
          "expected": 41.14,
          "toleranceDecimalPlaces": 1,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "L/240 long-span allowable limit",
              "value": 39.68333333333334,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "mullion-stack-joint-gap-calculator",
      "title": "Mullion Stack Joint Setting Gap Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/mullion-stack-joint-gap-calculator/",
      "sources": [
        "Linear thermal expansion, ΔL = α × L × ΔT — the gap set today is the residual gap at the hottest design temperature plus the expansion still to come between today's reading and that temperature",
        "Coefficients of linear thermal expansion as published for each alloy family: aluminium extrusion 23.6 × 10⁻⁶ per °C (Aluminum Design Manual, The Aluminum Association), structural carbon steel 11.7 × 10⁻⁶ per °C (AISC Steel Construction Manual), austenitic stainless steel 17.3 × 10⁻⁶ per °C"
      ],
      "vectors": [
        {
          "name": "3.6 m aluminium mullion, -20 to 70 °C range, set at 15 °C",
          "inputs": {
            "mullionLength": 3.6,
            "alloy": "aluminium",
            "designMinTemp": -20,
            "designMaxTemp": 70,
            "ambientTemp": 15,
            "minimumClosedGap": 0.0015
          },
          "expected": 6.1728,
          "toleranceDecimalPlaces": 3,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Total movement across the design range",
              "value": 7.6464,
              "unit": "mm"
            },
            {
              "label": "Gap at the coldest design temperature",
              "value": 9.1464,
              "unit": "mm"
            },
            {
              "label": "Gap at the hottest design temperature",
              "value": 1.5,
              "unit": "mm"
            },
            {
              "label": "Expansion still to come from today's reading",
              "value": 4.6728000000000005,
              "unit": "mm"
            },
            {
              "label": "Contraction still to come from today's reading",
              "value": 2.9736,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "6 m steel mullion, -20 to 60 °C range, set at 10 °C",
          "inputs": {
            "mullionLength": 6,
            "alloy": "steel",
            "designMinTemp": -20,
            "designMaxTemp": 60,
            "ambientTemp": 10,
            "minimumClosedGap": 0.002
          },
          "expected": 5.51,
          "toleranceDecimalPlaces": 3,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Total movement across the design range",
              "value": 5.616,
              "unit": "mm"
            },
            {
              "label": "Gap at the coldest design temperature",
              "value": 7.616,
              "unit": "mm"
            },
            {
              "label": "Gap at the hottest design temperature",
              "value": 2,
              "unit": "mm"
            },
            {
              "label": "Expansion still to come from today's reading",
              "value": 3.5100000000000002,
              "unit": "mm"
            },
            {
              "label": "Contraction still to come from today's reading",
              "value": 2.106,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Installed at the hottest design temperature — gap is the residual",
          "inputs": {
            "mullionLength": 3.6,
            "alloy": "aluminium",
            "designMinTemp": -20,
            "designMaxTemp": 45,
            "ambientTemp": 45,
            "minimumClosedGap": 0.0015
          },
          "expected": 1.5,
          "toleranceDecimalPlaces": 3,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Total movement across the design range",
              "value": 5.5224,
              "unit": "mm"
            },
            {
              "label": "Gap at the coldest design temperature",
              "value": 7.0224,
              "unit": "mm"
            },
            {
              "label": "Gap at the hottest design temperature",
              "value": 1.5,
              "unit": "mm"
            },
            {
              "label": "Expansion still to come from today's reading",
              "value": 0,
              "unit": "mm"
            },
            {
              "label": "Contraction still to come from today's reading",
              "value": 5.5224,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "multi-stud-wall-stc-estimator",
      "title": "Multi-Stud Wall Sound Transmission Class (STC) Estimator",
      "url": "https://craftquantities.com/calculators/materials-quantities/multi-stud-wall-stc-estimator/",
      "sources": [
        "Common acoustic design guide rule of thumb: STC ≈ base single-stud-wall STC (commonly ~33) + resilient channel/decoupling bonus (commonly +8) + cavity insulation bonus (commonly +3) + extra gypsum layer bonus (commonly +2 to +3 per additional layer) — this is a widely-used ADDITIVE ESTIMATION rule, NOT an ASTM E90-standardized predictive method"
      ],
      "vectors": [
        {
          "name": "Base + resilient channel + insulation, 0 extra layers",
          "inputs": {
            "baseSTC": 33,
            "resilientChannelBonus": 8,
            "insulationBonus": 3,
            "extraLayerBonus": 3,
            "extraLayers": 0
          },
          "expected": 44,
          "toleranceDecimalPlaces": 0,
          "unit": "STC (estimated)",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Base + insulation + 1 extra layer, no resilient channel",
          "inputs": {
            "baseSTC": 33,
            "resilientChannelBonus": 0,
            "insulationBonus": 3,
            "extraLayerBonus": 3,
            "extraLayers": 1
          },
          "expected": 39,
          "toleranceDecimalPlaces": 0,
          "unit": "STC (estimated)",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "negative-skin-friction-calculator",
      "title": "Negative Skin Friction (Downdrag) Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/negative-skin-friction-calculator/",
      "sources": [
        "Negative skin friction (downdrag) uses the same alpha-method formula as positive shaft friction, but represents an added LOAD on the pile (from settling soil dragging down on the shaft) rather than a resistance: Qnsf = alpha x Su x perimeter x settling-zone length"
      ],
      "vectors": [
        {
          "name": "Su=30kPa, α=0.3, 0.4m diameter, 8m settling zone",
          "inputs": {
            "undrainedShearStrength": 30000,
            "adhesionFactor": 0.3,
            "pileDiameter": 0.4,
            "settlingZoneLength": 8
          },
          "expected": 90.48,
          "toleranceDecimalPlaces": 1,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Pile perimeter",
              "value": 1.2566370614359172,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Su=25kPa, α=0.35, 0.5m diameter, 6m settling zone",
          "inputs": {
            "undrainedShearStrength": 25000,
            "adhesionFactor": 0.35,
            "pileDiameter": 0.5,
            "settlingZoneLength": 6
          },
          "expected": 82.47,
          "toleranceDecimalPlaces": 1,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Pile perimeter",
              "value": 1.5707963267948966,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "off-grid-autonomy-calculator",
      "title": "Off-Grid Autonomy Calculator",
      "url": "https://craftquantities.com/calculators/solar-energy/off-grid-autonomy-calculator/",
      "sources": [
        "Daily array yield = rated DC watts × peak sun hours × system derate; NREL PVWatts methodology",
        "Peak sun hours is the daily insolation in kWh/m² and varies by location and season — it is a site input, not a constant"
      ],
      "vectors": [
        {
          "name": "15 kWh at 85% usable, 0.5 kW load",
          "inputs": {
            "bankKwh": 15,
            "usablePercent": 85,
            "loadKw": 0.5,
            "arrayKw": 4,
            "peakSunHours": 3.5
          },
          "expected": 25.5,
          "toleranceDecimalPlaces": 1,
          "unit": "hours",
          "confidence": "medium",
          "steps": [
            {
              "label": "Usable energy",
              "value": 12.75,
              "unit": "kWh"
            },
            {
              "label": "Days at this load",
              "value": 1.0625,
              "unit": "days"
            },
            {
              "label": "Daily consumption",
              "value": 12,
              "unit": "kWh"
            },
            {
              "label": "Daily generation after losses",
              "value": 12.04,
              "unit": "kWh"
            },
            {
              "label": "Daily surplus or shortfall",
              "value": 0.03999999999999915,
              "unit": "kWh"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Lead-acid at 40% usable runs far less",
          "inputs": {
            "bankKwh": 15,
            "usablePercent": 40,
            "loadKw": 0.5,
            "arrayKw": 4,
            "peakSunHours": 3.5
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "hours",
          "confidence": "medium",
          "steps": [
            {
              "label": "Usable energy",
              "value": 6,
              "unit": "kWh"
            },
            {
              "label": "Days at this load",
              "value": 0.5,
              "unit": "days"
            },
            {
              "label": "Daily consumption",
              "value": 12,
              "unit": "kWh"
            },
            {
              "label": "Daily generation after losses",
              "value": 12.04,
              "unit": "kWh"
            },
            {
              "label": "Daily surplus or shortfall",
              "value": 0.03999999999999915,
              "unit": "kWh"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Double the load halves the autonomy",
          "inputs": {
            "bankKwh": 15,
            "usablePercent": 85,
            "loadKw": 1,
            "arrayKw": 4,
            "peakSunHours": 3.5
          },
          "expected": 12.75,
          "toleranceDecimalPlaces": 2,
          "unit": "hours",
          "confidence": "medium",
          "steps": [
            {
              "label": "Usable energy",
              "value": 12.75,
              "unit": "kWh"
            },
            {
              "label": "Days at this load",
              "value": 0.53125,
              "unit": "days"
            },
            {
              "label": "Daily consumption",
              "value": 24,
              "unit": "kWh"
            },
            {
              "label": "Daily generation after losses",
              "value": 12.04,
              "unit": "kWh"
            },
            {
              "label": "Daily surplus or shortfall",
              "value": -11.96,
              "unit": "kWh"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A bigger bank runs longer",
          "inputs": {
            "bankKwh": 30,
            "usablePercent": 85,
            "loadKw": 0.5,
            "arrayKw": 4,
            "peakSunHours": 3.5
          },
          "expected": 51,
          "toleranceDecimalPlaces": 2,
          "unit": "hours",
          "confidence": "medium",
          "steps": [
            {
              "label": "Usable energy",
              "value": 25.5,
              "unit": "kWh"
            },
            {
              "label": "Days at this load",
              "value": 2.125,
              "unit": "days"
            },
            {
              "label": "Daily consumption",
              "value": 12,
              "unit": "kWh"
            },
            {
              "label": "Daily generation after losses",
              "value": 12.04,
              "unit": "kWh"
            },
            {
              "label": "Daily surplus or shortfall",
              "value": 0.03999999999999915,
              "unit": "kWh"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "ohms-law-calculator",
      "title": "Ohm's Law Calculator",
      "url": "https://craftquantities.com/calculators/electrical/ohms-law-calculator/",
      "sources": [
        "Ohm's Law: V = I x R. Power equation: P = V x I. Both are exact, universal physics relationships, not rules of thumb."
      ],
      "vectors": [
        {
          "name": "12V across 4 ohms",
          "inputs": {
            "voltage": 12,
            "resistance": 4
          },
          "expected": 3,
          "toleranceDecimalPlaces": 2,
          "unit": "A (current)",
          "confidence": "high",
          "steps": [
            {
              "label": "Power",
              "value": 36,
              "unit": "W"
            },
            {
              "label": "Voltage",
              "value": 12,
              "unit": "V"
            },
            {
              "label": "Resistance",
              "value": 4,
              "unit": "Ω"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "120V across 60 ohms",
          "inputs": {
            "voltage": 120,
            "resistance": 60
          },
          "expected": 2,
          "toleranceDecimalPlaces": 2,
          "unit": "A (current)",
          "confidence": "high",
          "steps": [
            {
              "label": "Power",
              "value": 240,
              "unit": "W"
            },
            {
              "label": "Voltage",
              "value": 120,
              "unit": "V"
            },
            {
              "label": "Resistance",
              "value": 60,
              "unit": "Ω"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "one-way-slab-thickness-calculator",
      "title": "One-Way Slab Minimum Thickness Calculator (ACI 318)",
      "url": "https://craftquantities.com/calculators/materials-quantities/one-way-slab-thickness-calculator/",
      "sources": [
        "ACI 318 Table 7.3.1.1 minimum thickness for solid one-way slabs not supporting or attached to partitions likely to be damaged by deflection: simply supported = span/20, one end continuous = span/24, both ends continuous = span/28, cantilever = span/10"
      ],
      "vectors": [
        {
          "name": "6m span, both ends continuous",
          "inputs": {
            "span": 6,
            "supportCondition": "both-ends-continuous"
          },
          "expected": 0.2143,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in inches",
              "value": 8.43644544431946,
              "unit": "in"
            },
            {
              "label": "Span/depth divisor used",
              "value": 28
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "3m span, cantilever",
          "inputs": {
            "span": 3,
            "supportCondition": "cantilever"
          },
          "expected": 0.3,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in inches",
              "value": 11.811023622047244,
              "unit": "in"
            },
            {
              "label": "Span/depth divisor used",
              "value": 10
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "ontario-land-transfer-tax-calculator",
      "title": "Ontario Land Transfer Tax Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/ontario-land-transfer-tax-calculator/",
      "sources": [
        "Ontario Land Transfer Tax Act rates: 0.5% to $55,000; 1.0% to $250,000; 1.5% to $400,000; 2.0% to $2,000,000; 2.5% above, for one or two single-family residences",
        "Ontario first-time homebuyer refund: maximum $4,000 of provincial land transfer tax"
      ],
      "vectors": [
        {
          "name": "$500,000 purchase",
          "inputs": {
            "price": 500000,
            "firstTimeBuyer": "no"
          },
          "expected": 6475,
          "toleranceDecimalPlaces": 2,
          "unit": "CAD $",
          "confidence": "medium",
          "steps": [
            {
              "label": "Tax before refund",
              "value": 6475,
              "unit": "CAD $"
            },
            {
              "label": "First-time buyer refund",
              "value": 0,
              "unit": "CAD $"
            },
            {
              "label": "Effective rate on the price",
              "value": 1.295,
              "unit": "%"
            },
            {
              "label": "Price plus tax",
              "value": 506475,
              "unit": "CAD $"
            },
            {
              "label": "Price at which the refund is fully used",
              "value": 368333,
              "unit": "CAD $"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "$500,000 with the first-time refund",
          "inputs": {
            "price": 500000,
            "firstTimeBuyer": "yes"
          },
          "expected": 2475,
          "toleranceDecimalPlaces": -2,
          "unit": "CAD $",
          "confidence": "medium",
          "steps": [
            {
              "label": "Tax before refund",
              "value": 6475,
              "unit": "CAD $"
            },
            {
              "label": "First-time buyer refund",
              "value": 4000,
              "unit": "CAD $"
            },
            {
              "label": "Effective rate on the price",
              "value": 0.49500000000000005,
              "unit": "%"
            },
            {
              "label": "Price plus tax",
              "value": 502475,
              "unit": "CAD $"
            },
            {
              "label": "Price at which the refund is fully used",
              "value": 368333,
              "unit": "CAD $"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "$250,000 purchase",
          "inputs": {
            "price": 250000,
            "firstTimeBuyer": "no"
          },
          "expected": 2225,
          "toleranceDecimalPlaces": -2,
          "unit": "CAD $",
          "confidence": "medium",
          "steps": [
            {
              "label": "Tax before refund",
              "value": 2225,
              "unit": "CAD $"
            },
            {
              "label": "First-time buyer refund",
              "value": 0,
              "unit": "CAD $"
            },
            {
              "label": "Effective rate on the price",
              "value": 0.89,
              "unit": "%"
            },
            {
              "label": "Price plus tax",
              "value": 252225,
              "unit": "CAD $"
            },
            {
              "label": "Price at which the refund is fully used",
              "value": 368333,
              "unit": "CAD $"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "$1,000,000 purchase",
          "inputs": {
            "price": 1000000,
            "firstTimeBuyer": "no"
          },
          "expected": 16475,
          "toleranceDecimalPlaces": 2,
          "unit": "CAD $",
          "confidence": "medium",
          "steps": [
            {
              "label": "Tax before refund",
              "value": 16475,
              "unit": "CAD $"
            },
            {
              "label": "First-time buyer refund",
              "value": 0,
              "unit": "CAD $"
            },
            {
              "label": "Effective rate on the price",
              "value": 1.6475,
              "unit": "%"
            },
            {
              "label": "Price plus tax",
              "value": 1016475,
              "unit": "CAD $"
            },
            {
              "label": "Price at which the refund is fully used",
              "value": 368333,
              "unit": "CAD $"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "$2,500,000 reaches the top band",
          "inputs": {
            "price": 2500000,
            "firstTimeBuyer": "no"
          },
          "expected": 48975,
          "toleranceDecimalPlaces": 2,
          "unit": "CAD $",
          "confidence": "medium",
          "steps": [
            {
              "label": "Tax before refund",
              "value": 48975,
              "unit": "CAD $"
            },
            {
              "label": "First-time buyer refund",
              "value": 0,
              "unit": "CAD $"
            },
            {
              "label": "Effective rate on the price",
              "value": 1.959,
              "unit": "%"
            },
            {
              "label": "Price plus tax",
              "value": 2548975,
              "unit": "CAD $"
            },
            {
              "label": "Price at which the refund is fully used",
              "value": 368333,
              "unit": "CAD $"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A zero price attracts no tax",
          "inputs": {
            "price": 0,
            "firstTimeBuyer": "no"
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "CAD $",
          "confidence": "medium",
          "steps": [
            {
              "label": "Tax before refund",
              "value": 0,
              "unit": "CAD $"
            },
            {
              "label": "First-time buyer refund",
              "value": 0,
              "unit": "CAD $"
            },
            {
              "label": "Effective rate on the price",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Price plus tax",
              "value": 0,
              "unit": "CAD $"
            },
            {
              "label": "Price at which the refund is fully used",
              "value": 368333,
              "unit": "CAD $"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "open-graded-bedding-course-calculator",
      "title": "Open-Graded Bedding Course Stone Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/open-graded-bedding-course-calculator/",
      "sources": [
        "ASCE/T&DI 68-18, Permeable Interlocking Concrete Pavement, gives the bedding course as a screeded layer of open-graded No. 8 stone at a nominal 50 mm (2 in), laid to a uniform thickness and not compacted before the units are set",
        "Loose (uncompacted) bulk density of the delivered stone is the supplier's figure for the gradation and quarry actually being used; it is entered here rather than assumed, because it varies with source and moisture",
        "The densification allowance — the extra loose stone needed because a screeded course closes up when the pavers are plate-compacted — is a rule of thumb rather than a published coefficient; check it against the first bay laid and revise the order"
      ],
      "vectors": [
        {
          "name": "120 m² at 50 mm, 15% densification, 1450 kg/m³",
          "inputs": {
            "laidArea": 120,
            "screededThickness": 0.05,
            "densificationAllowance": 15,
            "looseDensity": 1450
          },
          "expected": 8.7,
          "toleranceDecimalPlaces": 3,
          "unit": "t",
          "confidence": "medium",
          "steps": [
            {
              "label": "Screeded stone volume to deliver",
              "value": 6,
              "unit": "m³"
            },
            {
              "label": "Course volume once the units are bedded and compacted",
              "value": 5.217391304347826,
              "unit": "m³"
            },
            {
              "label": "Volume the course loses to densification",
              "value": 0.7826086956521738,
              "unit": "m³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "250 m² at 60 mm, 10% densification, 1550 kg/m³",
          "inputs": {
            "laidArea": 250,
            "screededThickness": 0.06,
            "densificationAllowance": 10,
            "looseDensity": 1550
          },
          "expected": 23.25,
          "toleranceDecimalPlaces": 3,
          "unit": "t",
          "confidence": "medium",
          "steps": [
            {
              "label": "Screeded stone volume to deliver",
              "value": 15,
              "unit": "m³"
            },
            {
              "label": "Course volume once the units are bedded and compacted",
              "value": 13.636363636363635,
              "unit": "m³"
            },
            {
              "label": "Volume the course loses to densification",
              "value": 1.363636363636365,
              "unit": "m³"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "opening-flashing-membrane-calculator",
      "title": "Window Opening Flashing Membrane Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/opening-flashing-membrane-calculator/",
      "sources": [
        "Per opening: a sill piece and a head piece each running the opening width plus a run-past at both ends, two jamb pieces each running the opening height plus a run-past top and bottom, plus the corner patch and lap allowance entered.",
        "AAMA 711, Voluntary Specification for Self Adhering Flashing Used for Installation of Exterior Wall Fenestration Products",
        "ASTM E2112, Standard Practice for Installation of Exterior Windows, Doors and Skylights — the source of the shingle-lapped sequence this take-off assumes, sill first, then jambs, then head"
      ],
      "vectors": [
        {
          "name": "Twelve 900 by 1200 openings, 150 mm run-past",
          "inputs": {
            "roWidth": 0.9,
            "roHeight": 1.2,
            "openingCount": 12,
            "cornerRunPast": 0.15,
            "rollWidth": 0.229,
            "rollLength": 22.86,
            "extraPerOpening": 0.6,
            "wastePercent": 10
          },
          "expected": 79.2,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Sill pieces across the schedule",
              "value": 15.84,
              "unit": "m"
            },
            {
              "label": "Jamb pieces across the schedule",
              "value": 39.6,
              "unit": "m"
            },
            {
              "label": "Head pieces across the schedule",
              "value": 15.84,
              "unit": "m"
            },
            {
              "label": "Corner patch and lap allowance",
              "value": 7.92,
              "unit": "m"
            },
            {
              "label": "Membrane per opening",
              "value": 6,
              "unit": "m"
            },
            {
              "label": "Membrane area consumed",
              "value": 18.1368,
              "unit": "m²"
            },
            {
              "label": "Rolls to order",
              "value": 4,
              "unit": "rolls"
            }
          ],
          "includesAllowance": {
            "label": "Misapplication and offcut allowance",
            "percent": 10
          },
          "basis": "ambiguous"
        },
        {
          "name": "Four wide 1800 by 1500 openings, no waste allowance",
          "inputs": {
            "roWidth": 1.8,
            "roHeight": 1.5,
            "openingCount": 4,
            "cornerRunPast": 0.2,
            "rollWidth": 0.229,
            "rollLength": 22.86,
            "extraPerOpening": 0.9,
            "wastePercent": 0
          },
          "expected": 36.4,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Sill pieces across the schedule",
              "value": 8.8,
              "unit": "m"
            },
            {
              "label": "Jamb pieces across the schedule",
              "value": 15.2,
              "unit": "m"
            },
            {
              "label": "Head pieces across the schedule",
              "value": 8.8,
              "unit": "m"
            },
            {
              "label": "Corner patch and lap allowance",
              "value": 3.6,
              "unit": "m"
            },
            {
              "label": "Membrane per opening",
              "value": 9.1,
              "unit": "m"
            },
            {
              "label": "Membrane area consumed",
              "value": 8.3356,
              "unit": "m²"
            },
            {
              "label": "Rolls to order",
              "value": 2,
              "unit": "rolls"
            }
          ],
          "includesAllowance": {
            "label": "Misapplication and offcut allowance",
            "percent": 0
          },
          "basis": "ambiguous"
        },
        {
          "name": "Single small opening, minimum run-past, no extras",
          "inputs": {
            "roWidth": 0.6,
            "roHeight": 0.6,
            "openingCount": 1,
            "cornerRunPast": 0.05,
            "rollWidth": 0.229,
            "rollLength": 22.86,
            "extraPerOpening": 0,
            "wastePercent": 0
          },
          "expected": 2.8,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Sill pieces across the schedule",
              "value": 0.7,
              "unit": "m"
            },
            {
              "label": "Jamb pieces across the schedule",
              "value": 1.4,
              "unit": "m"
            },
            {
              "label": "Head pieces across the schedule",
              "value": 0.7,
              "unit": "m"
            },
            {
              "label": "Corner patch and lap allowance",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Membrane per opening",
              "value": 2.8,
              "unit": "m"
            },
            {
              "label": "Membrane area consumed",
              "value": 0.6412,
              "unit": "m²"
            },
            {
              "label": "Rolls to order",
              "value": 1,
              "unit": "rolls"
            }
          ],
          "includesAllowance": {
            "label": "Misapplication and offcut allowance",
            "percent": 0
          },
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "operational-carbon-electricity-calculator",
      "title": "Operational Carbon from Electricity Calculator",
      "url": "https://craftquantities.com/calculators/sustainability-compliance/operational-carbon-electricity-calculator/",
      "sources": [
        "Emissions = consumption (kWh) × grid emission factor (kgCO₂e/kWh). Factors are published annually by national authorities and change materially year to year.",
        "Location-based accounting uses the grid average; market-based accounting uses contracted supply. The two give different answers for the same building."
      ],
      "vectors": [
        {
          "name": "45,000 kWh at 0.207",
          "inputs": {
            "annualKwh": 45000,
            "gridFactor": 0.207,
            "projectionYears": 25,
            "annualDecarbonisation": 3
          },
          "expected": 9315,
          "toleranceDecimalPlaces": 2,
          "unit": "kgCO₂e/year",
          "confidence": "medium",
          "steps": [
            {
              "label": "Year one, in tonnes",
              "value": 9.315,
              "unit": "tCO₂e"
            },
            {
              "label": "Cumulative over 25 years",
              "value": 165.50435401851743,
              "unit": "tCO₂e"
            },
            {
              "label": "Cumulative at a static grid",
              "value": 232.875,
              "unit": "tCO₂e"
            },
            {
              "label": "Difference the decarbonisation assumption makes",
              "value": 67.37064598148258,
              "unit": "tCO₂e"
            },
            {
              "label": "Final-year factor",
              "value": 0.09965336493572673,
              "unit": "kgCO₂e/kWh"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A dirtier grid doubles it",
          "inputs": {
            "annualKwh": 45000,
            "gridFactor": 0.414,
            "projectionYears": 25,
            "annualDecarbonisation": 3
          },
          "expected": 18630,
          "toleranceDecimalPlaces": 2,
          "unit": "kgCO₂e/year",
          "confidence": "medium",
          "steps": [
            {
              "label": "Year one, in tonnes",
              "value": 18.63,
              "unit": "tCO₂e"
            },
            {
              "label": "Cumulative over 25 years",
              "value": 331.00870803703486,
              "unit": "tCO₂e"
            },
            {
              "label": "Cumulative at a static grid",
              "value": 465.75,
              "unit": "tCO₂e"
            },
            {
              "label": "Difference the decarbonisation assumption makes",
              "value": 134.74129196296516,
              "unit": "tCO₂e"
            },
            {
              "label": "Final-year factor",
              "value": 0.19930672987145345,
              "unit": "kgCO₂e/kWh"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Zero consumption is zero emissions",
          "inputs": {
            "annualKwh": 0,
            "gridFactor": 0.207,
            "projectionYears": 25,
            "annualDecarbonisation": 3
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "kgCO₂e/year",
          "confidence": "medium",
          "steps": [
            {
              "label": "Year one, in tonnes",
              "value": 0,
              "unit": "tCO₂e"
            },
            {
              "label": "Cumulative over 25 years",
              "value": 0,
              "unit": "tCO₂e"
            },
            {
              "label": "Cumulative at a static grid",
              "value": 0,
              "unit": "tCO₂e"
            },
            {
              "label": "Difference the decarbonisation assumption makes",
              "value": 0,
              "unit": "tCO₂e"
            },
            {
              "label": "Final-year factor",
              "value": 0.09965336493572673,
              "unit": "kgCO₂e/kWh"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A fully decarbonised grid",
          "inputs": {
            "annualKwh": 45000,
            "gridFactor": 0,
            "projectionYears": 25,
            "annualDecarbonisation": 0
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "kgCO₂e/year",
          "confidence": "medium",
          "steps": [
            {
              "label": "Year one, in tonnes",
              "value": 0,
              "unit": "tCO₂e"
            },
            {
              "label": "Cumulative over 25 years",
              "value": 0,
              "unit": "tCO₂e"
            },
            {
              "label": "Cumulative at a static grid",
              "value": 0,
              "unit": "tCO₂e"
            },
            {
              "label": "Difference the decarbonisation assumption makes",
              "value": 0,
              "unit": "tCO₂e"
            },
            {
              "label": "Final-year factor",
              "value": 0,
              "unit": "kgCO₂e/kWh"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "osha-noise-dose-calculator",
      "title": "OSHA Noise Dose and 8-Hour TWA Calculator",
      "url": "https://craftquantities.com/calculators/sustainability-compliance/osha-noise-dose-calculator/",
      "sources": [
        "29 CFR 1910.95, Appendix A: the reference duration at a level L is T = 8 ÷ 2^((L − 90) ÷ 5) hours; the dose is D = 100 × (C1/T1 + C2/T2 + … + Cn/Tn) per cent, where Cn is the time spent at each level; and the 8-hour time-weighted average is TWA = 16.61 × log10(D ÷ 100) + 90",
        "29 CFR 1910.95(b)(1), Table G-16, and 29 CFR 1926.52, Table D-2 for construction: a permissible exposure limit of 90 dBA for 8 hours with a 5 dB exchange rate; 29 CFR 1910.95(c)(1): an action level for a hearing conservation program of an 8-hour TWA of 85 dBA, a dose of 50 per cent",
        "29 CFR 1910.95(d)(2)(i) and the OSHA Technical Manual, Section III, Chapter 5: all sound from 80 dBA to 130 dBA is integrated for the hearing-conservation measurement, while the permissible-exposure dose counts only sound at or above 90 dBA — the 80 and 90 dBA thresholds dosimeters are set to for each",
        "NIOSH, Criteria for a Recommended Standard: Occupational Noise Exposure (Publication 98-126): a recommended exposure limit of 85 dBA as an 8-hour TWA with a 3 dB exchange rate, T = 8 ÷ 2^((L − 85) ÷ 3) hours"
      ],
      "vectors": [
        {
          "name": "Eight hours at 90 dBA is a 100% dose and a TWA of exactly 90",
          "inputs": {
            "periodLevel1": 90,
            "periodHours1": 8,
            "periodLevel2": 88,
            "periodHours2": 0,
            "periodLevel3": 80,
            "periodHours3": 0,
            "periodLevel4": 70,
            "periodHours4": 0
          },
          "expected": 90,
          "toleranceDecimalPlaces": 2,
          "unit": "dBA",
          "confidence": "medium",
          "steps": [
            {
              "label": "Noise dose — hearing-conservation basis (sound from 80 dBA)",
              "value": 100,
              "unit": "%"
            },
            {
              "label": "Noise dose — permissible-exposure basis (sound from 90 dBA)",
              "value": 100,
              "unit": "%"
            },
            {
              "label": "8-hour TWA — permissible-exposure basis",
              "value": 90,
              "unit": "dBA"
            },
            {
              "label": "NIOSH dose (85 dBA, 3 dB exchange)",
              "value": 317.48021039363994,
              "unit": "%"
            },
            {
              "label": "NIOSH 8-hour TWA",
              "value": 90.01716659439968,
              "unit": "dBA"
            },
            {
              "label": "Period 1: time OSHA's table permits at 90.0 dBA",
              "value": 8,
              "unit": "hours"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Four hours at 95 dBA — 5 dB up halves the permitted time — is also a 100% dose",
          "inputs": {
            "periodLevel1": 95,
            "periodHours1": 4,
            "periodLevel2": 88,
            "periodHours2": 0,
            "periodLevel3": 80,
            "periodHours3": 0,
            "periodLevel4": 70,
            "periodHours4": 0
          },
          "expected": 90,
          "toleranceDecimalPlaces": 2,
          "unit": "dBA",
          "confidence": "medium",
          "steps": [
            {
              "label": "Noise dose — hearing-conservation basis (sound from 80 dBA)",
              "value": 100,
              "unit": "%"
            },
            {
              "label": "Noise dose — permissible-exposure basis (sound from 90 dBA)",
              "value": 100,
              "unit": "%"
            },
            {
              "label": "8-hour TWA — permissible-exposure basis",
              "value": 90,
              "unit": "dBA"
            },
            {
              "label": "NIOSH dose (85 dBA, 3 dB exchange)",
              "value": 503.9684199579494,
              "unit": "%"
            },
            {
              "label": "NIOSH 8-hour TWA",
              "value": 92.02403323215957,
              "unit": "dBA"
            },
            {
              "label": "Period 1: time OSHA's table permits at 95.0 dBA",
              "value": 4,
              "unit": "hours"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Eight hours at 85 dBA is the 50% action level, a TWA of 85",
          "inputs": {
            "periodLevel1": 85,
            "periodHours1": 8,
            "periodLevel2": 88,
            "periodHours2": 0,
            "periodLevel3": 80,
            "periodHours3": 0,
            "periodLevel4": 70,
            "periodHours4": 0
          },
          "expected": 84.999892,
          "toleranceDecimalPlaces": 2,
          "unit": "dBA",
          "confidence": "medium",
          "steps": [
            {
              "label": "Noise dose — hearing-conservation basis (sound from 80 dBA)",
              "value": 50,
              "unit": "%"
            },
            {
              "label": "Noise dose — permissible-exposure basis (sound from 90 dBA)",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "NIOSH dose (85 dBA, 3 dB exchange)",
              "value": 100,
              "unit": "%"
            },
            {
              "label": "NIOSH 8-hour TWA",
              "value": 85,
              "unit": "dBA"
            },
            {
              "label": "Period 1: time OSHA's table permits at 85.0 dBA",
              "value": 16,
              "unit": "hours"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "The defaults — two hours at 92, four at 88 and two at 80 — come to a TWA of 88.1",
          "inputs": {
            "periodLevel1": 92,
            "periodHours1": 2,
            "periodLevel2": 88,
            "periodHours2": 4,
            "periodLevel3": 80,
            "periodHours3": 2,
            "periodLevel4": 70,
            "periodHours4": 0
          },
          "expected": 88.126837,
          "toleranceDecimalPlaces": 2,
          "unit": "dBA",
          "confidence": "medium",
          "steps": [
            {
              "label": "Noise dose — hearing-conservation basis (sound from 80 dBA)",
              "value": 77.1306119320823,
              "unit": "%"
            },
            {
              "label": "Noise dose — permissible-exposure basis (sound from 90 dBA)",
              "value": 32.98769776932235,
              "unit": "%"
            },
            {
              "label": "8-hour TWA — permissible-exposure basis",
              "value": 81.99982683523403,
              "unit": "dBA"
            },
            {
              "label": "NIOSH dose (85 dBA, 3 dB exchange)",
              "value": 233.8666115513303,
              "unit": "%"
            },
            {
              "label": "NIOSH 8-hour TWA",
              "value": 88.68968223288168,
              "unit": "dBA"
            },
            {
              "label": "Period 1: time OSHA's table permits at 92.0 dBA",
              "value": 6.062866266041593,
              "unit": "hours"
            },
            {
              "label": "Period 2: time OSHA's table permits at 88.0 dBA",
              "value": 10.556063286183155,
              "unit": "hours"
            },
            {
              "label": "Period 3: time OSHA's table permits at 80.0 dBA",
              "value": 32,
              "unit": "hours"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "One hour at 100 dBA and seven at 85 — the loud hour is half the dose on its own",
          "inputs": {
            "periodLevel1": 100,
            "periodHours1": 1,
            "periodLevel2": 85,
            "periodHours2": 7,
            "periodLevel3": 80,
            "periodHours3": 0,
            "periodLevel4": 70,
            "periodHours4": 0
          },
          "expected": 89.534443,
          "toleranceDecimalPlaces": 2,
          "unit": "dBA",
          "confidence": "medium",
          "steps": [
            {
              "label": "Noise dose — hearing-conservation basis (sound from 80 dBA)",
              "value": 93.75,
              "unit": "%"
            },
            {
              "label": "Noise dose — permissible-exposure basis (sound from 90 dBA)",
              "value": 50,
              "unit": "%"
            },
            {
              "label": "8-hour TWA — permissible-exposure basis",
              "value": 84.99989177202127,
              "unit": "dBA"
            },
            {
              "label": "NIOSH dose (85 dBA, 3 dB exchange)",
              "value": 487.5,
              "unit": "%"
            },
            {
              "label": "NIOSH 8-hour TWA",
              "value": 91.87974620034555,
              "unit": "dBA"
            },
            {
              "label": "Period 1: time OSHA's table permits at 100.0 dBA",
              "value": 2,
              "unit": "hours"
            },
            {
              "label": "Period 2: time OSHA's table permits at 85.0 dBA",
              "value": 16,
              "unit": "hours"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "outdoor-string-light-calculator",
      "title": "Outdoor String Light Calculator",
      "url": "https://craftquantities.com/calculators/electrical/outdoor-string-light-calculator/",
      "sources": [
        "String lights drape with some sag between mounting points, adding roughly 10% beyond a straight-line perimeter measurement"
      ],
      "vectors": [
        {
          "name": "15m run, 1ft bulb spacing",
          "inputs": {
            "perimeterLength": 15,
            "bulbSpacing": 0.3048
          },
          "expected": 54.13,
          "toleranceDecimalPlaces": 2,
          "unit": "linear ft of string lights",
          "confidence": "medium",
          "steps": [
            {
              "label": "Bulb count",
              "value": 55,
              "unit": "bulbs"
            },
            {
              "label": "Whole bulb spacings round the run",
              "value": 54
            },
            {
              "label": "Left over at the last bulb",
              "value": 0.13385826771654052,
              "unit": "ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "25m run, 1ft bulb spacing",
          "inputs": {
            "perimeterLength": 25,
            "bulbSpacing": 0.3048
          },
          "expected": 90.22,
          "toleranceDecimalPlaces": 2,
          "unit": "linear ft of string lights",
          "confidence": "medium",
          "steps": [
            {
              "label": "Bulb count",
              "value": 91,
              "unit": "bulbs"
            },
            {
              "label": "Whole bulb spacings round the run",
              "value": 90
            },
            {
              "label": "Left over at the last bulb",
              "value": 0.22309711286091272,
              "unit": "ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "outlet-spacing-calculator",
      "title": "Outlet Spacing Calculator",
      "url": "https://craftquantities.com/calculators/electrical/outlet-spacing-calculator/",
      "sources": [
        "NEC 210.52: no point along a wall line may be more than 6 ft from a receptacle, meaning outlets are required at least every 12 ft along usable wall space"
      ],
      "vectors": [
        {
          "name": "12ft wall run — one outlet at mid-span reaches both ends",
          "inputs": {
            "wallLength": 3.6576
          },
          "expected": 1,
          "toleranceDecimalPlaces": 0,
          "unit": "outlets (minimum)",
          "confidence": "high",
          "steps": [
            {
              "label": "Wall run length",
              "value": 12,
              "unit": "ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30ft wall run — 30/12 rounds up to 3",
          "inputs": {
            "wallLength": 9.144
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "outlets (minimum)",
          "confidence": "high",
          "steps": [
            {
              "label": "Wall run length",
              "value": 30,
              "unit": "ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "outlets-per-circuit-calculator",
      "title": "Outlets Per Circuit Calculator",
      "url": "https://craftquantities.com/calculators/electrical/outlets-per-circuit-calculator/",
      "sources": [
        "NEC 220.14(I) values each general-use receptacle at 180 VA for load calculation purposes; combined with the 80% continuous-load rule, this gives a widely used planning estimate of receptacle count per circuit"
      ],
      "vectors": [
        {
          "name": "15A circuit, 120V",
          "inputs": {
            "breakerAmps": "15",
            "circuitVoltage": "120"
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "outlets (estimated maximum)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Safe continuous circuit capacity",
              "value": 1440,
              "unit": "VA"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "20A circuit, 120V",
          "inputs": {
            "breakerAmps": "20",
            "circuitVoltage": "120"
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "outlets (estimated maximum)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Safe continuous circuit capacity",
              "value": 1920,
              "unit": "VA"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "paint-boxing-calculator",
      "title": "Paint Boxing Calculator — Blending Tins Before You Start",
      "url": "https://craftquantities.com/calculators/renovation-construction/paint-boxing-calculator/",
      "sources": [
        "Paint is tinted in BATCHES and matched to a tolerance rather than to an identity, so tins of one colour can differ slightly. The difference is invisible in the tin and shows up once, as a soft step on the wall where one tin ran out — which is what boxing (combining every tin before starting) exists to prevent",
        "A container's stated size is not its stirrable capacity. Mixing needs headroom above the paint, and more of it for a paddle on a drill than for a hand stir, so the usable volume is the nominal volume less that allowance",
        "Where the paint will not fit in one container, the tins are distributed between containers rather than poured in sequence, and each changeover is placed at a corner, a door casing or a ceiling line — a step that is invisible across an external corner is obvious on a continuous wall"
      ],
      "vectors": [
        {
          "name": "twelve 5 L tins into a 25 L tub with 15% headroom",
          "inputs": {
            "tinCount": 12,
            "tinVolume": 5,
            "containerCapacity": 25,
            "stirringHeadroom": 15,
            "batchCodeCount": 3
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "containers",
          "confidence": "high",
          "steps": [
            {
              "label": "Paint to blend in total",
              "value": 15.850323141488905,
              "unit": "gal"
            },
            {
              "label": "Usable capacity per container",
              "value": 5.613656112610654,
              "unit": "gal"
            },
            {
              "label": "Paint in each container",
              "value": 5.2834410471629685,
              "unit": "gal"
            },
            {
              "label": "Tins into each container",
              "value": 4,
              "unit": "tins"
            },
            {
              "label": "Colour changes on the finished job",
              "value": 2,
              "unit": "changes"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "the same paint into a 75 L drum is a single blend",
          "inputs": {
            "tinCount": 12,
            "tinVolume": 5,
            "containerCapacity": 75,
            "stirringHeadroom": 15,
            "batchCodeCount": 3
          },
          "expected": 1,
          "toleranceDecimalPlaces": 0,
          "unit": "container",
          "confidence": "high",
          "steps": [
            {
              "label": "Paint to blend in total",
              "value": 15.850323141488905,
              "unit": "gal"
            },
            {
              "label": "Usable capacity per container",
              "value": 16.840968337831963,
              "unit": "gal"
            },
            {
              "label": "Paint in each container",
              "value": 15.850323141488905,
              "unit": "gal"
            },
            {
              "label": "Tins into each container",
              "value": 12,
              "unit": "tins"
            },
            {
              "label": "Colour changes on the finished job",
              "value": 0,
              "unit": "changes"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "one per cent of headroom is the difference between three containers and four",
          "inputs": {
            "tinCount": 12,
            "tinVolume": 5,
            "containerCapacity": 20,
            "stirringHeadroom": 1,
            "batchCodeCount": 3
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "containers",
          "confidence": "high",
          "steps": [
            {
              "label": "Paint to blend in total",
              "value": 15.850323141488905,
              "unit": "gal"
            },
            {
              "label": "Usable capacity per container",
              "value": 5.230606636691339,
              "unit": "gal"
            },
            {
              "label": "Paint in each container",
              "value": 3.9625807853722264,
              "unit": "gal"
            },
            {
              "label": "Tins into each container",
              "value": 3,
              "unit": "tins"
            },
            {
              "label": "Colour changes on the finished job",
              "value": 3,
              "unit": "changes"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "paint-calculator",
      "title": "Paint Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/paint-calculator/",
      "sources": [
        "Standard interior door/window opening allowances used by professional estimators (~21 sq ft door, ~15 sq ft window)",
        "Paint coverage rate varies by product — always check your specific paint can's label for its stated coverage per liter/gallon"
      ],
      "vectors": [
        {
          "name": "4x3.5m room, 2.4m walls, one 0.9x2.1m door, two 1.2x1.2m windows, 2 coats, 10 m²/L",
          "inputs": {
            "roomLength": 4,
            "roomWidth": 3.5,
            "wallHeight": 2.4,
            "doorCount": 1,
            "windowCount": 2,
            "coats": 2,
            "coveragePerSqm": 10,
            "doorArea": 1.89,
            "windowArea": 1.44
          },
          "expected": 6.246,
          "toleranceDecimalPlaces": 3,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Gross wall area",
              "value": 36,
              "unit": "m²"
            },
            {
              "label": "Doors + windows area (subtracted)",
              "value": 4.77,
              "unit": "m²"
            },
            {
              "label": "Paintable area",
              "value": 31.23,
              "unit": "m²"
            },
            {
              "label": "Total area to coat",
              "value": 62.46,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "4x3.5m room, 2.4m walls, 1 door, 2 windows, 2 coats, 10 m²/L",
          "inputs": {
            "roomLength": 4,
            "roomWidth": 3.5,
            "wallHeight": 2.4,
            "doorCount": 1,
            "windowCount": 2,
            "coats": 2,
            "coveragePerSqm": 10
          },
          "expected": 6.25,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Gross wall area",
              "value": 36,
              "unit": "m²"
            },
            {
              "label": "Doors + windows area (subtracted)",
              "value": 4.75,
              "unit": "m²"
            },
            {
              "label": "Paintable area",
              "value": 31.25,
              "unit": "m²"
            },
            {
              "label": "Total area to coat",
              "value": 62.5,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "5x4m room, 2.5m walls, no openings, 1 coat, 12 m²/L",
          "inputs": {
            "roomLength": 5,
            "roomWidth": 4,
            "wallHeight": 2.5,
            "doorCount": 0,
            "windowCount": 0,
            "coats": 1,
            "coveragePerSqm": 12
          },
          "expected": 3.75,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Gross wall area",
              "value": 45,
              "unit": "m²"
            },
            {
              "label": "Doors + windows area (subtracted)",
              "value": 0,
              "unit": "m²"
            },
            {
              "label": "Paintable area",
              "value": 45,
              "unit": "m²"
            },
            {
              "label": "Total area to coat",
              "value": 45,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "paint-coverage-over-dark-calculator",
      "title": "Paint Coverage Over Dark Colours Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/paint-coverage-over-dark-calculator/",
      "sources": [
        "The property that decides how many coats a paint needs is its CONTRAST RATIO — the photometric measure of film opacity, measured over black and white by reflectometry under ASTM D2805. It is rarely published for architectural paint, so the coat counts used here are planning figures rather than a calculation from a datasheet",
        "Two coats is the practical floor for an even film whatever is underneath, because a single coat shows application variation regardless of how well it hides",
        "A primer TINTED TOWARD THE TOPCOAT does two jobs at once — it blocks the existing colour and starts the finish close to its own shade — which is why it typically brings a four-coat job down to primer plus two"
      ],
      "vectors": [
        {
          "name": "much darker, tinted primer, standard finish — primer plus two coats",
          "inputs": {
            "volumePerCoat": 4,
            "contrast": "much",
            "primer": "tinted",
            "highOpacity": "standard"
          },
          "expected": 3.17,
          "toleranceDecimalPlaces": 1,
          "unit": "gal",
          "confidence": "medium",
          "steps": [
            {
              "label": "Coats of finish paint",
              "value": 2,
              "unit": "coats"
            },
            {
              "label": "Finish paint",
              "value": 2.1133764188651876,
              "unit": "gal"
            },
            {
              "label": "Primer",
              "value": 1.0566882094325938,
              "unit": "gal"
            },
            {
              "label": "Same job with no primer",
              "value": 4.226752837730375,
              "unit": "gal"
            },
            {
              "label": "Finish coats the primer saves",
              "value": 2,
              "unit": "coats"
            },
            {
              "label": "Paint for one coat",
              "value": 1.0566882094325938,
              "unit": "gal"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "the same job with no primer is four coats of finish",
          "inputs": {
            "volumePerCoat": 4,
            "contrast": "much",
            "primer": "none",
            "highOpacity": "standard"
          },
          "expected": 4.23,
          "toleranceDecimalPlaces": 1,
          "unit": "gal",
          "confidence": "medium",
          "steps": [
            {
              "label": "Coats of finish paint",
              "value": 4,
              "unit": "coats"
            },
            {
              "label": "Finish paint",
              "value": 4.226752837730375,
              "unit": "gal"
            },
            {
              "label": "Primer",
              "value": 0,
              "unit": "gal"
            },
            {
              "label": "Same job with no primer",
              "value": 4.226752837730375,
              "unit": "gal"
            },
            {
              "label": "Finish coats the primer saves",
              "value": 0,
              "unit": "coats"
            },
            {
              "label": "Paint for one coat",
              "value": 1.0566882094325938,
              "unit": "gal"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "a like-for-like repaint never drops below two coats",
          "inputs": {
            "volumePerCoat": 4,
            "contrast": "similar",
            "primer": "tinted",
            "highOpacity": "high"
          },
          "expected": 3.17,
          "toleranceDecimalPlaces": 1,
          "unit": "gal",
          "confidence": "medium",
          "steps": [
            {
              "label": "Coats of finish paint",
              "value": 2,
              "unit": "coats"
            },
            {
              "label": "Finish paint",
              "value": 2.1133764188651876,
              "unit": "gal"
            },
            {
              "label": "Primer",
              "value": 1.0566882094325938,
              "unit": "gal"
            },
            {
              "label": "Same job with no primer",
              "value": 2.1133764188651876,
              "unit": "gal"
            },
            {
              "label": "Finish coats the primer saves",
              "value": 0,
              "unit": "coats"
            },
            {
              "label": "Paint for one coat",
              "value": 1.0566882094325938,
              "unit": "gal"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "paint-lightening-darkening-calculator",
      "title": "Paint Lightening and Darkening Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/paint-lightening-darkening-calculator/",
      "sources": [
        "The added volume is the stated percentage of the BASE paint, not of the finished batch — so 20 per cent added to 5 L gives 1 L of white and 6 L of paint, and the white is a sixth of what comes out rather than a fifth",
        "The two directions work at completely different scales: white is a weak tinter used in tens of per cent, while tinting black is strong enough to move a shade at a fraction of a per cent. The input ranges here differ by direction for that reason",
        "Adding white REDUCES OPACITY as well as lightening. The mixture hides less well than the paint it came from, which shows up as an extra coat rather than as a colour problem"
      ],
      "vectors": [
        {
          "name": "20% white into 5 L gives 1 L of white and 6 L of paint",
          "inputs": {
            "baseVolume": 5,
            "direction": "lighten",
            "percentAdded": 20,
            "sampleVolume": 0.25
          },
          "expected": 0.26,
          "toleranceDecimalPlaces": 1,
          "unit": "gal",
          "confidence": "high",
          "steps": [
            {
              "label": "Base paint",
              "value": 1.3208602617907421,
              "unit": "gal"
            },
            {
              "label": "Finished batch",
              "value": 1.5850323141488905,
              "unit": "gal"
            },
            {
              "label": "Tinter as a share of the result",
              "value": 16.666666666666664,
              "unit": "%"
            },
            {
              "label": "Sample: tinter",
              "value": 0.013208602617907421,
              "unit": "gal"
            },
            {
              "label": "Usual working range, low",
              "value": 5,
              "unit": "%"
            },
            {
              "label": "Usual working range, high",
              "value": 50,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "half a per cent of black into 5 L is 25 ml, not 25 times that",
          "inputs": {
            "baseVolume": 5,
            "direction": "darken",
            "percentAdded": 0.5,
            "sampleVolume": 0.25
          },
          "expected": 0.0066,
          "toleranceDecimalPlaces": 3,
          "unit": "gal",
          "confidence": "high",
          "steps": [
            {
              "label": "Base paint",
              "value": 1.3208602617907421,
              "unit": "gal"
            },
            {
              "label": "Finished batch",
              "value": 1.327464563099696,
              "unit": "gal"
            },
            {
              "label": "Tinter as a share of the result",
              "value": 0.4975124378109453,
              "unit": "%"
            },
            {
              "label": "Sample: tinter",
              "value": 0.00033021506544768554,
              "unit": "gal"
            },
            {
              "label": "Usual working range, low",
              "value": 0.05,
              "unit": "%"
            },
            {
              "label": "Usual working range, high",
              "value": 2,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "the same percentage on a bigger batch scales linearly",
          "inputs": {
            "baseVolume": 20,
            "direction": "lighten",
            "percentAdded": 20,
            "sampleVolume": 0
          },
          "expected": 1.06,
          "toleranceDecimalPlaces": 1,
          "unit": "gal",
          "confidence": "high",
          "steps": [
            {
              "label": "Base paint",
              "value": 5.2834410471629685,
              "unit": "gal"
            },
            {
              "label": "Finished batch",
              "value": 6.340129256595562,
              "unit": "gal"
            },
            {
              "label": "Tinter as a share of the result",
              "value": 16.666666666666664,
              "unit": "%"
            },
            {
              "label": "Sample: tinter",
              "value": 0,
              "unit": "gal"
            },
            {
              "label": "Usual working range, low",
              "value": 5,
              "unit": "%"
            },
            {
              "label": "Usual working range, high",
              "value": 50,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "paint-mix-ratio-calculator",
      "title": "Paint Mix Ratio Calculator — Two Paints, Recordable Parts",
      "url": "https://craftquantities.com/calculators/renovation-construction/paint-mix-ratio-calculator/",
      "sources": [
        "Volumes are the ratio applied to the batch: each paint's share is its own parts divided by the total parts, times the batch size. The parts are reduced by their greatest common divisor so the mix can be written down and repeated",
        "A SAMPLE is mixed at the identical ratio rather than poured by eye, because a sample with no recorded ratio cannot be scaled up — the wall is the same two numbers multiplied, and nothing else reproduces it",
        "No colour is predicted or displayed. Pigment mixing is subtractive and pigment-specific, modelling it requires per-pigment absorption and scattering coefficients that are not published, and an uncalibrated screen could not show the result faithfully in any case"
      ],
      "vectors": [
        {
          "name": "5 L at 3:1 gives 3.75 L and 1.25 L",
          "inputs": {
            "batchVolume": 5,
            "partsA": 3,
            "partsB": 1,
            "sampleVolume": 0.25
          },
          "expected": 0.99,
          "toleranceDecimalPlaces": 1,
          "unit": "gal",
          "confidence": "high",
          "steps": [
            {
              "label": "Second paint",
              "value": 0.33021506544768553,
              "unit": "gal"
            },
            {
              "label": "Reduced ratio, first paint",
              "value": 3,
              "unit": "parts"
            },
            {
              "label": "Reduced ratio, second paint",
              "value": 1,
              "unit": "parts"
            },
            {
              "label": "Sample: first paint",
              "value": 0.04953225981715283,
              "unit": "gal"
            },
            {
              "label": "Sample: second paint",
              "value": 0.016510753272384278,
              "unit": "gal"
            },
            {
              "label": "Total mixed",
              "value": 1.3208602617907421,
              "unit": "gal"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "an unreduced 6:2 is the same mix as 3:1",
          "inputs": {
            "batchVolume": 5,
            "partsA": 6,
            "partsB": 2,
            "sampleVolume": 0
          },
          "expected": 0.99,
          "toleranceDecimalPlaces": 1,
          "unit": "gal",
          "confidence": "high",
          "steps": [
            {
              "label": "Second paint",
              "value": 0.33021506544768553,
              "unit": "gal"
            },
            {
              "label": "Reduced ratio, first paint",
              "value": 3,
              "unit": "parts"
            },
            {
              "label": "Reduced ratio, second paint",
              "value": 1,
              "unit": "parts"
            },
            {
              "label": "Sample: first paint",
              "value": 0,
              "unit": "gal"
            },
            {
              "label": "Sample: second paint",
              "value": 0,
              "unit": "gal"
            },
            {
              "label": "Total mixed",
              "value": 1.3208602617907421,
              "unit": "gal"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "equal parts split a 10 L batch in half",
          "inputs": {
            "batchVolume": 10,
            "partsA": 1,
            "partsB": 1,
            "sampleVolume": 0.25
          },
          "expected": 1.32,
          "toleranceDecimalPlaces": 1,
          "unit": "gal",
          "confidence": "high",
          "steps": [
            {
              "label": "Second paint",
              "value": 1.3208602617907421,
              "unit": "gal"
            },
            {
              "label": "Reduced ratio, first paint",
              "value": 1,
              "unit": "parts"
            },
            {
              "label": "Reduced ratio, second paint",
              "value": 1,
              "unit": "parts"
            },
            {
              "label": "Sample: first paint",
              "value": 0.033021506544768556,
              "unit": "gal"
            },
            {
              "label": "Sample: second paint",
              "value": 0.033021506544768556,
              "unit": "gal"
            },
            {
              "label": "Total mixed",
              "value": 2.6417205235814842,
              "unit": "gal"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "paint-primer-calculator",
      "title": "Paint Primer Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/paint-primer-calculator/",
      "sources": [
        "Primer typically covers about 200 sq ft per gallon, lower than topcoat paint's ~350-400 sq ft, since it's formulated to seal and bond rather than spread thin",
        "Primer needed = area ÷ spread rate for one coat — the loss-free coating identity, with the spread rate taken from the product's own tin or data sheet"
      ],
      "vectors": [
        {
          "name": "40m² wall area",
          "inputs": {
            "wallArea": 40
          },
          "expected": 2.5,
          "toleranceDecimalPlaces": 1,
          "unit": "gallons",
          "confidence": "high",
          "steps": [
            {
              "label": "Area to prime",
              "value": 430.55641666838886,
              "unit": "sq ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "20m² wall area",
          "inputs": {
            "wallArea": 20
          },
          "expected": 1.5,
          "toleranceDecimalPlaces": 1,
          "unit": "gallons",
          "confidence": "high",
          "steps": [
            {
              "label": "Area to prime",
              "value": 215.27820833419443,
              "unit": "sq ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "40 m² of sealed wall at a primer rated 8 m²/L",
          "inputs": {
            "wallArea": 40,
            "spreadRate": 8
          },
          "expected": 1.5,
          "toleranceDecimalPlaces": 1,
          "unit": "gallons",
          "confidence": "high",
          "steps": [
            {
              "label": "Area to prime",
              "value": 430.55641666838886,
              "unit": "sq ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "paint-tint-ratio-calculator",
      "title": "Paint Tint Ratio and Colourant Load Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/paint-tint-ratio-calculator/",
      "sources": [
        "Tint load is expressed as a percentage of the BASE volume, which scales to any batch size without conversion. One US fluid ounce per US gallon is 1/128 of the base, or 0.78 per cent — so a 4 oz/gal formula is a 3.1 per cent load",
        "Every base has a MAXIMUM load. Colourant is pigment in a vehicle that contributes little binder, so an over-loaded film stays soft, dries slowly, blocks and marks. Deep and accent bases exist because they are formulated with less white and more room for colourant — the figures used here are typical shelf values and the product's own tinting system governs",
        "No colour is predicted or displayed. What load produces what shade depends on per-pigment absorption and scattering coefficients that are not published, and an uncalibrated screen could not show the answer faithfully in any case"
      ],
      "vectors": [
        {
          "name": "a 4 oz per gallon formula is a 3.1% load",
          "inputs": {
            "baseVolume": 5,
            "tintLoadPercent": 3.1,
            "baseType": "pastel"
          },
          "expected": 0.041,
          "toleranceDecimalPlaces": 3,
          "unit": "gal",
          "confidence": "high",
          "steps": [
            {
              "label": "Base paint",
              "value": 1.3208602617907421,
              "unit": "gal"
            },
            {
              "label": "Finished batch",
              "value": 1.3618069299062552,
              "unit": "gal"
            },
            {
              "label": "Load in the units a formula is written in",
              "value": 3.968,
              "unit": "fl oz per US gal"
            },
            {
              "label": "This base's typical maximum",
              "value": 3.1,
              "unit": "%"
            },
            {
              "label": "Headroom left",
              "value": 0,
              "unit": "percentage points"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "the same load scales linearly to a 20 L batch",
          "inputs": {
            "baseVolume": 20,
            "tintLoadPercent": 3.1,
            "baseType": "medium"
          },
          "expected": 0.164,
          "toleranceDecimalPlaces": 3,
          "unit": "gal",
          "confidence": "high",
          "steps": [
            {
              "label": "Base paint",
              "value": 5.2834410471629685,
              "unit": "gal"
            },
            {
              "label": "Finished batch",
              "value": 5.447227719625021,
              "unit": "gal"
            },
            {
              "label": "Load in the units a formula is written in",
              "value": 3.968,
              "unit": "fl oz per US gal"
            },
            {
              "label": "This base's typical maximum",
              "value": 6.3,
              "unit": "%"
            },
            {
              "label": "Headroom left",
              "value": 3.1999999999999997,
              "unit": "percentage points"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "a deep-base load poured into a pastel base is over its limit",
          "inputs": {
            "baseVolume": 5,
            "tintLoadPercent": 9.4,
            "baseType": "pastel"
          },
          "expected": 0.124,
          "toleranceDecimalPlaces": 3,
          "unit": "gal",
          "confidence": "low",
          "steps": [
            {
              "label": "Base paint",
              "value": 1.3208602617907421,
              "unit": "gal"
            },
            {
              "label": "Finished batch",
              "value": 1.4450211263990718,
              "unit": "gal"
            },
            {
              "label": "Load in the units a formula is written in",
              "value": 12.032,
              "unit": "fl oz per US gal"
            },
            {
              "label": "This base's typical maximum",
              "value": 3.1,
              "unit": "%"
            },
            {
              "label": "Headroom left",
              "value": -6.300000000000001,
              "unit": "percentage points"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "pallet-storage-capacity-calculator",
      "title": "Timber Pallet Stack Storage Capacity Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/pallet-storage-capacity-calculator/",
      "sources": [
        "Pallets per layer = floor(Storage Area ÷ Pallet Footprint Area); Stack layers = floor(Maximum Stack Height ÷ Pallet Height); Total pallets = Pallets per layer × Stack layers — standard warehouse/yard storage capacity geometry."
      ],
      "vectors": [
        {
          "name": "20m² area, 1.0m² pallets, 3.0m stack, 0.15m per pallet",
          "inputs": {
            "storageArea": 20,
            "palletFootprint": 1,
            "maxStackHeight": 3,
            "palletHeight": 0.15
          },
          "expected": 400,
          "toleranceDecimalPlaces": 0,
          "unit": "pallets",
          "confidence": "high",
          "steps": [
            {
              "label": "Pallets per layer",
              "value": 20,
              "unit": "pallets"
            },
            {
              "label": "Stack layers",
              "value": 20,
              "unit": "layers"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "40m² area, 1.2m² pallets, 4.0m stack, 0.2m per pallet",
          "inputs": {
            "storageArea": 40,
            "palletFootprint": 1.2,
            "maxStackHeight": 4,
            "palletHeight": 0.2
          },
          "expected": 660,
          "toleranceDecimalPlaces": 0,
          "unit": "pallets",
          "confidence": "high",
          "steps": [
            {
              "label": "Pallets per layer",
              "value": 33,
              "unit": "pallets"
            },
            {
              "label": "Stack layers",
              "value": 20,
              "unit": "layers"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "panel-phase-balance-calculator",
      "title": "Three-Phase Electrical Panel Load Balancing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/panel-phase-balance-calculator/",
      "sources": [
        "Phase imbalance percentage = (maximum deviation from average phase load ÷ average phase load) × 100, the standard method for checking how evenly a three-phase panel's circuits are distributed across its phases"
      ],
      "vectors": [
        {
          "name": "40A/45A/38A phases",
          "inputs": {
            "phaseALoad": 40,
            "phaseBLoad": 45,
            "phaseCLoad": 38
          },
          "expected": 9.76,
          "toleranceDecimalPlaces": 1,
          "unit": "%",
          "confidence": "high",
          "steps": [
            {
              "label": "Average phase load",
              "value": 41,
              "unit": "A"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "60A/52A/58A phases",
          "inputs": {
            "phaseALoad": 60,
            "phaseBLoad": 52,
            "phaseCLoad": 58
          },
          "expected": 8.24,
          "toleranceDecimalPlaces": 1,
          "unit": "%",
          "confidence": "high",
          "steps": [
            {
              "label": "Average phase load",
              "value": 56.666666666666664,
              "unit": "A"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "panel-slot-calculator",
      "title": "Electrical Panel Circuit Directory Slot Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/panel-slot-calculator/",
      "sources": [
        "Panel slot arithmetic: single-pole breakers occupy 1 slot each, double-pole (240V) breakers occupy 2 slots each; slots used = (single-pole count × 1) + (double-pole count × 2); slots available = total panel slots − slots used — standard panel schedule bookkeeping"
      ],
      "vectors": [
        {
          "name": "40-slot panel, 18 single-pole + 6 double-pole",
          "inputs": {
            "totalSlots": 40,
            "singlePoleCount": 18,
            "doublePoleCount": 6
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "slots",
          "confidence": "high",
          "steps": [
            {
              "label": "Slots used",
              "value": 30,
              "unit": "slots"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30-slot panel, 12 single-pole + 5 double-pole",
          "inputs": {
            "totalSlots": 30,
            "singlePoleCount": 12,
            "doublePoleCount": 5
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "slots",
          "confidence": "high",
          "steps": [
            {
              "label": "Slots used",
              "value": 22,
              "unit": "slots"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "parapet-height-thickness-ratio-calculator",
      "title": "Masonry Parapet Height-to-Thickness Ratio Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/parapet-height-thickness-ratio-calculator/",
      "sources": [
        "Unreinforced masonry parapets are commonly limited to a height-to-thickness ratio of about 3, a widely-cited conservative guideline used in seismic retrofit and life-safety assessments — exact code limits vary by jurisdiction and Seismic Design Category"
      ],
      "vectors": [
        {
          "name": "0.9m height, 0.2m thickness (exceeds limit)",
          "inputs": {
            "parapetHeight": 0.9,
            "parapetThickness": 0.2
          },
          "expected": 4.5,
          "toleranceDecimalPlaces": 1,
          "unit": "(h/t)",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "0.6m height, 0.25m thickness (within limit)",
          "inputs": {
            "parapetHeight": 0.6,
            "parapetThickness": 0.25
          },
          "expected": 2.4,
          "toleranceDecimalPlaces": 1,
          "unit": "(h/t)",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "parking-lot-size-calculator",
      "title": "Parking Lot Size Calculator",
      "url": "https://craftquantities.com/calculators/auto-utility/parking-lot-size-calculator/",
      "sources": [
        "Standard parking stall is commonly 9 ft x 18 ft with a 24 ft two-way drive aisle between double-loaded rows — a widely used general site-planning guideline"
      ],
      "vectors": [
        {
          "name": "60x36m lot",
          "inputs": {
            "lotLength": 60,
            "lotWidth": 36
          },
          "expected": 42,
          "toleranceDecimalPlaces": 0,
          "unit": "stalls",
          "confidence": "low",
          "steps": [
            {
              "label": "Stalls per row",
              "value": 21,
              "unit": "stalls"
            },
            {
              "label": "Double-loaded row pairs",
              "value": 1,
              "unit": "pairs"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "90x54m lot",
          "inputs": {
            "lotLength": 90,
            "lotWidth": 54
          },
          "expected": 128,
          "toleranceDecimalPlaces": 0,
          "unit": "stalls",
          "confidence": "low",
          "steps": [
            {
              "label": "Stalls per row",
              "value": 32,
              "unit": "stalls"
            },
            {
              "label": "Double-loaded row pairs",
              "value": 2,
              "unit": "pairs"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "parking-stall-layout-calculator",
      "title": "Parking Lot Stall Layout Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/parking-stall-layout-calculator/",
      "sources": [
        "Stall count = floor(usable row length ÷ standard stall width), the basic layout method for a single row of standard parking stalls — a partial stall at the end of the row cannot be striped, so the division rounds DOWN"
      ],
      "vectors": [
        {
          "name": "60m row, 2.7m stalls",
          "inputs": {
            "usableLength": 60,
            "stallWidth": 2.7
          },
          "expected": 22,
          "toleranceDecimalPlaces": 0,
          "unit": "stalls",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "90m row, 2.7m stalls",
          "inputs": {
            "usableLength": 90,
            "stallWidth": 2.7
          },
          "expected": 33,
          "toleranceDecimalPlaces": 0,
          "unit": "stalls",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "parquet-block-calculator",
      "title": "Parquet Wood Flooring Block Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/parquet-block-calculator/",
      "sources": [
        "Parquet block count = ceil((floor area ÷ block area) × (1 + waste allowance)), the same coverage method used for tile, applied to standard square parquet blocks"
      ],
      "vectors": [
        {
          "name": "20m² floor, 0.09m² block, 10% waste",
          "inputs": {
            "floorArea": 20,
            "blockArea": 0.09,
            "wastePercent": 10
          },
          "expected": 245,
          "toleranceDecimalPlaces": -1,
          "unit": "blocks",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30m² floor, 0.09m² block, 12% waste",
          "inputs": {
            "floorArea": 30,
            "blockArea": 0.09,
            "wastePercent": 12
          },
          "expected": 374,
          "toleranceDecimalPlaces": -1,
          "unit": "blocks",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "patio-level-dig-depth-calculator",
      "title": "Patio Levels and Dig Depth Calculator",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/patio-level-dig-depth-calculator/",
      "sources": [
        "The finished level is fixed first and the formation solved for: finished paving at the wall = the damp-proof course less the clearance below it (two brick courses, about 150 mm, in UK practice); formation = finished level less the paving, the laying course and the compacted sub-base; the dig is the existing ground less the formation, at each end",
        "The surface falls away from the building: the International Residential Code, Section R401.3, requires impervious surfaces within 10 ft (3 m) of a foundation to slope at least 2% (1:50) away from it; UK practice under the BS 7533 series works between about 1:80 at the flattest and 1:40, with 1:60 a usual target. 1:50 meets both",
        "Sub-base depth follows the traffic: about 100 mm compacted for pedestrian paving, 150 mm for a car and 200 mm for anything heavier, as the BS 7533 series and ICPI guidance support"
      ],
      "vectors": [
        {
          "name": "The guide's 5.4 by 3.6 m patio on level ground, 150 mm below a DPC 150 mm up, 1:50 — 180 mm to dig at the wall",
          "inputs": {
            "patioLength": 5.4,
            "patioDepth": 3.6,
            "dpcAboveGround": 0.15,
            "clearanceBelowDpc": 0.15,
            "fallRatio": 50,
            "pavingThickness": 0.05,
            "beddingDepth": 0.03,
            "subBaseDepth": 0.1,
            "groundAtFarEdge": 0
          },
          "expected": 180,
          "toleranceDecimalPlaces": 4,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Finished paving at the wall, above (+) or below (−) the existing ground",
              "value": 0,
              "unit": "mm"
            },
            {
              "label": "Fall across the patio",
              "value": 72.00000000000001,
              "unit": "mm"
            },
            {
              "label": "Fall, as a gradient",
              "value": 2,
              "unit": "%"
            },
            {
              "label": "Build-up: paving, laying course and sub-base",
              "value": 180,
              "unit": "mm"
            },
            {
              "label": "Dig depth at the far edge",
              "value": 252,
              "unit": "mm"
            },
            {
              "label": "Spoil to take away, as dug",
              "value": 4.19904,
              "unit": "m³"
            },
            {
              "label": "Compacted sub-base",
              "value": 1.9440000000000002,
              "unit": "m³"
            },
            {
              "label": "Laying course",
              "value": 0.5832,
              "unit": "m³"
            },
            {
              "label": "Patio area",
              "value": 19.44,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A DPC only 75 mm above the soil — the paving must finish below the ground, so the dig deepens by the difference",
          "inputs": {
            "patioLength": 5.4,
            "patioDepth": 3.6,
            "dpcAboveGround": 0.075,
            "clearanceBelowDpc": 0.15,
            "fallRatio": 50,
            "pavingThickness": 0.05,
            "beddingDepth": 0.03,
            "subBaseDepth": 0.1,
            "groundAtFarEdge": 0
          },
          "expected": 255,
          "toleranceDecimalPlaces": 4,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Finished paving at the wall, above (+) or below (−) the existing ground",
              "value": -75,
              "unit": "mm"
            },
            {
              "label": "Fall across the patio",
              "value": 72.00000000000001,
              "unit": "mm"
            },
            {
              "label": "Fall, as a gradient",
              "value": 2,
              "unit": "%"
            },
            {
              "label": "Build-up: paving, laying course and sub-base",
              "value": 180,
              "unit": "mm"
            },
            {
              "label": "Dig depth at the far edge",
              "value": 327,
              "unit": "mm"
            },
            {
              "label": "Spoil to take away, as dug",
              "value": 5.657040000000001,
              "unit": "m³"
            },
            {
              "label": "Compacted sub-base",
              "value": 1.9440000000000002,
              "unit": "m³"
            },
            {
              "label": "Laying course",
              "value": 0.5832,
              "unit": "m³"
            },
            {
              "label": "Patio area",
              "value": 19.44,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A level threshold with a drained channel: paving 30 mm under a DPC 180 mm up — 30 mm to dig at the wall",
          "inputs": {
            "patioLength": 5.4,
            "patioDepth": 3.6,
            "dpcAboveGround": 0.18,
            "clearanceBelowDpc": 0.03,
            "fallRatio": 50,
            "pavingThickness": 0.05,
            "beddingDepth": 0.03,
            "subBaseDepth": 0.1,
            "groundAtFarEdge": 0
          },
          "expected": 30,
          "toleranceDecimalPlaces": 4,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Finished paving at the wall, above (+) or below (−) the existing ground",
              "value": 150,
              "unit": "mm"
            },
            {
              "label": "Fall across the patio",
              "value": 72.00000000000001,
              "unit": "mm"
            },
            {
              "label": "Fall, as a gradient",
              "value": 2,
              "unit": "%"
            },
            {
              "label": "Build-up: paving, laying course and sub-base",
              "value": 180,
              "unit": "mm"
            },
            {
              "label": "Dig depth at the far edge",
              "value": 102.00000000000001,
              "unit": "mm"
            },
            {
              "label": "Spoil to take away, as dug",
              "value": 1.2830400000000002,
              "unit": "m³"
            },
            {
              "label": "Compacted sub-base",
              "value": 1.9440000000000002,
              "unit": "m³"
            },
            {
              "label": "Laying course",
              "value": 0.5832,
              "unit": "m³"
            },
            {
              "label": "Patio area",
              "value": 19.44,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A car-standing sub-base of 150 mm — 230 mm to dig at the wall",
          "inputs": {
            "patioLength": 5.4,
            "patioDepth": 3.6,
            "dpcAboveGround": 0.15,
            "clearanceBelowDpc": 0.15,
            "fallRatio": 60,
            "pavingThickness": 0.05,
            "beddingDepth": 0.03,
            "subBaseDepth": 0.15,
            "groundAtFarEdge": 0
          },
          "expected": 230,
          "toleranceDecimalPlaces": 4,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Finished paving at the wall, above (+) or below (−) the existing ground",
              "value": 0,
              "unit": "mm"
            },
            {
              "label": "Fall across the patio",
              "value": 60.00000000000001,
              "unit": "mm"
            },
            {
              "label": "Fall, as a gradient",
              "value": 1.6666666666666667,
              "unit": "%"
            },
            {
              "label": "Build-up: paving, laying course and sub-base",
              "value": 229.99999999999997,
              "unit": "mm"
            },
            {
              "label": "Dig depth at the far edge",
              "value": 290,
              "unit": "mm"
            },
            {
              "label": "Spoil to take away, as dug",
              "value": 5.0544,
              "unit": "m³"
            },
            {
              "label": "Compacted sub-base",
              "value": 2.916,
              "unit": "m³"
            },
            {
              "label": "Laying course",
              "value": 0.5832,
              "unit": "m³"
            },
            {
              "label": "Patio area",
              "value": 19.44,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "pavement-dowel-bar-calculator",
      "title": "Concrete Pavement Dowel Bar Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/pavement-dowel-bar-calculator/",
      "sources": [
        "American Concrete Pavement Association (ACPA) sizing guidance: dowel diameter is approximately 1/8 of the slab thickness, spaced 12 in on-center, in a standard 18 in length"
      ],
      "vectors": [
        {
          "name": "0.2m slab, 3.6m joint, 12in spacing",
          "inputs": {
            "slabThickness": 0.2,
            "jointLength": 3.6,
            "dowelSpacingIn": 0.3048
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "dowel bars",
          "confidence": "medium",
          "steps": [
            {
              "label": "Calculated dowel diameter",
              "value": 0.9842519685039371,
              "unit": "in"
            },
            {
              "label": "Standard dowel length",
              "value": 18,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "0.25m slab, 6m joint, 12in spacing",
          "inputs": {
            "slabThickness": 0.25,
            "jointLength": 6,
            "dowelSpacingIn": 0.3048
          },
          "expected": 20,
          "toleranceDecimalPlaces": 0,
          "unit": "dowel bars",
          "confidence": "medium",
          "steps": [
            {
              "label": "Calculated dowel diameter",
              "value": 1.2303149606299213,
              "unit": "in"
            },
            {
              "label": "Standard dowel length",
              "value": 18,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "paver-base-calculator",
      "title": "Paver Base & Sand Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/paver-base-calculator/",
      "sources": [
        "A typical paver installation uses a 4-6 in compacted gravel base plus a 1 in bedding sand layer beneath the pavers"
      ],
      "vectors": [
        {
          "name": "4x3m patio, 4in gravel, 1in sand",
          "inputs": {
            "patioLength": 4,
            "patioWidth": 3,
            "gravelBaseDepth": 0.1016,
            "sandDepth": 0.0254
          },
          "expected": 1.59,
          "toleranceDecimalPlaces": 1,
          "unit": "cubic yards (gravel base)",
          "confidence": "high",
          "steps": [
            {
              "label": "Patio area",
              "value": 12,
              "unit": "m²"
            },
            {
              "label": "Bedding sand needed",
              "value": 0.3986633487670267,
              "unit": "cubic yards"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "6x5m patio, 6in gravel, 1in sand",
          "inputs": {
            "patioLength": 6,
            "patioWidth": 5,
            "gravelBaseDepth": 0.1524,
            "sandDepth": 0.0254
          },
          "expected": 5.98,
          "toleranceDecimalPlaces": 1,
          "unit": "cubic yards (gravel base)",
          "confidence": "high",
          "steps": [
            {
              "label": "Patio area",
              "value": 30,
              "unit": "m²"
            },
            {
              "label": "Bedding sand needed",
              "value": 0.9966583719175668,
              "unit": "cubic yards"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "paver-calculator",
      "title": "Paver Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/paver-calculator/",
      "sources": [
        "Paver count = area to cover / (paver length x paver width), rounded up with a waste allowance for cuts along edges and curves"
      ],
      "vectors": [
        {
          "name": "4x3m patio, 12x12in pavers, 10% waste",
          "inputs": {
            "patioLength": 4,
            "patioWidth": 3,
            "paverLength": 0.3048,
            "paverWidth": 0.3048,
            "wasteFactorPercent": 10
          },
          "expected": 143,
          "toleranceDecimalPlaces": -1,
          "unit": "pavers",
          "confidence": "high",
          "steps": [
            {
              "label": "Patio area",
              "value": 129.16692500051667,
              "unit": "sq ft"
            },
            {
              "label": "Coverage per paver",
              "value": 1.0000000000000004,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "6x5m patio, 16x16in pavers, 15% waste",
          "inputs": {
            "patioLength": 6,
            "patioWidth": 5,
            "paverLength": 0.4064,
            "paverWidth": 0.4064,
            "wasteFactorPercent": 15
          },
          "expected": 209,
          "toleranceDecimalPlaces": -1,
          "unit": "pavers",
          "confidence": "high",
          "steps": [
            {
              "label": "Patio area",
              "value": 322.91731250129163,
              "unit": "sq ft"
            },
            {
              "label": "Coverage per paver",
              "value": 1.7777777777777777,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "12x8m pool surround with an 8x4m pool left out, 12x12in pavers, 10% waste",
          "inputs": {
            "patioLength": 12,
            "patioWidth": 8,
            "deductArea": 32,
            "paverLength": 0.3048,
            "paverWidth": 0.3048,
            "wasteFactorPercent": 10
          },
          "expected": 758,
          "toleranceDecimalPlaces": -1,
          "unit": "pavers",
          "confidence": "high",
          "steps": [
            {
              "label": "Patio area",
              "value": 688.8902666694222,
              "unit": "sq ft"
            },
            {
              "label": "Left unpaved",
              "value": 344.4451333347111,
              "unit": "sq ft"
            },
            {
              "label": "Coverage per paver",
              "value": 1.0000000000000004,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "paver-edging-calculator",
      "title": "Paver Edging Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/paver-edging-calculator/",
      "sources": [
        "Edging follows the full perimeter of the paved area: perimeter = 2 x (length + width); section count = perimeter / stock length, rounded up with a waste allowance — stock lengths are 8 ft and 10 ft in North America and 2.4 m and 3 m in metric markets"
      ],
      "vectors": [
        {
          "name": "6x4m paved area, 8ft edging",
          "inputs": {
            "paverAreaLength": 6,
            "paverAreaWidth": 4,
            "stockLengthFt": "8"
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "x 8 ft sections",
          "confidence": "high",
          "steps": [
            {
              "label": "Perimeter (with waste)",
              "value": 72.17847769028872,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "8x5m paved area, 10ft edging",
          "inputs": {
            "paverAreaLength": 8,
            "paverAreaWidth": 5,
            "stockLengthFt": "10"
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "x 10 ft sections",
          "confidence": "high",
          "steps": [
            {
              "label": "Perimeter (with waste)",
              "value": 93.83202099737534,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "6x4m paved area, 8ft edging, no cutting allowance",
          "inputs": {
            "paverAreaLength": 6,
            "paverAreaWidth": 4,
            "stockLengthFt": "8",
            "wastePercent": 0
          },
          "expected": 9,
          "toleranceDecimalPlaces": 0,
          "unit": "x 8 ft sections",
          "confidence": "high",
          "steps": [
            {
              "label": "Perimeter (with waste)",
              "value": 65.61679790026247,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "paver-pedestal-height-calculator",
      "title": "Rooftop Terrace Paver Pedestal Height Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/paver-pedestal-height-calculator/",
      "sources": [
        "Pedestal height = Desired Finish Height − Paver Thickness − Roof Slope Compensation Allowance — the standard sizing method for adjustable paver pedestal systems used on rooftop terraces and plaza decks, which raise pavers to a level finish surface above a sloped waterproofed roof deck."
      ],
      "vectors": [
        {
          "name": "0.15m finish height, 0.04m paver, 0.01m slope compensation",
          "inputs": {
            "desiredFinishHeight": 0.15,
            "paverThickness": 0.04,
            "slopeCompensation": 0.01
          },
          "expected": 0.1,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "0.2m finish height, 0.05m paver, 0.015m slope compensation",
          "inputs": {
            "desiredFinishHeight": 0.2,
            "paverThickness": 0.05,
            "slopeCompensation": 0.015
          },
          "expected": 0.135,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "paver-polymeric-sand-calculator",
      "title": "Paver Polymeric Sand Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/paver-polymeric-sand-calculator/",
      "sources": [
        "Polymeric sand coverage varies with joint width and paver size, but a 50 lb bag commonly covers roughly 80-100 sq ft (7.4-9.3 m²) for standard residential joint widths; the 20 kg bag sold in metric markets holds about 12% less sand and so covers roughly 6.5-8 m²"
      ],
      "vectors": [
        {
          "name": "30m² paved area, 90 sqft/bag",
          "inputs": {
            "paverArea": 30,
            "coverageSqftPerBag": 8.3612736
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "x 50 lb bags",
          "confidence": "medium",
          "steps": [
            {
              "label": "Area to fill",
              "value": 322.91731250129163,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "50m² paved area, 90 sqft/bag",
          "inputs": {
            "paverArea": 50,
            "coverageSqftPerBag": 8.3612736
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "x 50 lb bags",
          "confidence": "medium",
          "steps": [
            {
              "label": "Area to fill",
              "value": 538.195520835486,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "paver-sealer-calculator",
      "title": "Paver Sealer Calculator",
      "url": "https://craftquantities.com/calculators/auto-utility/paver-sealer-calculator/",
      "sources": [
        "Paver sealer typically covers approximately 150-200 sq ft per gallon per coat, depending on paver porosity and sealer type"
      ],
      "vectors": [
        {
          "name": "30m² paver area, 2 coats",
          "inputs": {
            "paverArea": 30,
            "coats": 2
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "gallons",
          "confidence": "medium",
          "steps": [
            {
              "label": "Area to seal (all coats)",
              "value": 645.8346250025833,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "50m² paver area, 1 coat",
          "inputs": {
            "paverArea": 50,
            "coats": 1
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "gallons",
          "confidence": "medium",
          "steps": [
            {
              "label": "Area to seal (all coats)",
              "value": 538.195520835486,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "pcf-to-kilograms-per-cubic-meter-calculator",
      "title": "pcf to kg/m³ Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/pcf-to-kilograms-per-cubic-meter-calculator/",
      "sources": [
        "A pound in a cubic foot, expressed in metric: 0.45359237 kg divided by 0.028316846592 m³ gives 16.018463373960139579… kg/m³. Both constants are definitions, so the ratio is exact even though its decimal never closes."
      ],
      "vectors": [
        {
          "name": "120 lb/ft³ converts correctly",
          "inputs": {
            "unitWeightPcf": 120
          },
          "expected": 1922.21560488,
          "toleranceDecimalPlaces": 6,
          "unit": "kg/m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 16.018463374,
              "unit": "kg/m³ per lb/ft³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "unitWeightPcf": 1200
          },
          "expected": 19222.1560488,
          "toleranceDecimalPlaces": 6,
          "unit": "kg/m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 16.018463374,
              "unit": "kg/m³ per lb/ft³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "pea-gravel-cubic-yards-to-tons-calculator",
      "title": "Pea Gravel Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/pea-gravel-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 1.3 short tons per cubic yard",
        "Density varies with moisture, compaction and composition — the supplier's ticket weight governs"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 13,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.3,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 130,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.3,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "pea-gravel-tons-to-cubic-yards-calculator",
      "title": "Pea Gravel Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/pea-gravel-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 1.3 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 7.692307692307692,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.7692307692307692,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 76.92307692307692,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.7692307692307692,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "pergola-post-spacing-calculator",
      "title": "Pergola Post Spacing Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/pergola-post-spacing-calculator/",
      "sources": [
        "Posts are placed at all 4 corners plus intermediate posts along any side exceeding the maximum beam span, spaced no farther apart than the maximum span"
      ],
      "vectors": [
        {
          "name": "4x3m pergola, 8ft max spacing",
          "inputs": {
            "pergolaLength": 4,
            "pergolaWidth": 3,
            "maxPostSpacingFt": "8"
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "posts",
          "confidence": "medium",
          "steps": [
            {
              "label": "Posts along each long side",
              "value": 3,
              "unit": "posts"
            },
            {
              "label": "Posts along each short side",
              "value": 3,
              "unit": "posts"
            },
            {
              "label": "Post centres down each long side",
              "value": 6.561679790026246,
              "unit": "ft"
            },
            {
              "label": "Post centres across each short side",
              "value": 4.921259842519685,
              "unit": "ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "6x4m pergola, 8ft max spacing",
          "inputs": {
            "pergolaLength": 6,
            "pergolaWidth": 4,
            "maxPostSpacingFt": "8"
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "posts",
          "confidence": "medium",
          "steps": [
            {
              "label": "Posts along each long side",
              "value": 4,
              "unit": "posts"
            },
            {
              "label": "Posts along each short side",
              "value": 3,
              "unit": "posts"
            },
            {
              "label": "Post centres down each long side",
              "value": 6.561679790026247,
              "unit": "ft"
            },
            {
              "label": "Post centres across each short side",
              "value": 6.561679790026246,
              "unit": "ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "pergola-rafter-spacing-calculator",
      "title": "Pergola/Trellis Rafter Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/pergola-rafter-spacing-calculator/",
      "sources": [
        "Rafter count = ceil(Pergola Width ÷ Maximum Rafter Spacing) + 1 — the standard support-count method (identical in principle to this site's joist/stud spacing calculators) applied to pergola or trellis rafter layout."
      ],
      "vectors": [
        {
          "name": "4m wide pergola, 0.6m max spacing",
          "inputs": {
            "pergolaWidth": 4,
            "maxRafterSpacing": 0.6
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "rafters",
          "confidence": "high",
          "steps": [
            {
              "label": "Bays across the pergola",
              "value": 7
            },
            {
              "label": "Rafter centres, as laid out",
              "value": 0.5714285714285714,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "6m wide pergola, 0.5m max spacing",
          "inputs": {
            "pergolaWidth": 6,
            "maxRafterSpacing": 0.5
          },
          "expected": 13,
          "toleranceDecimalPlaces": 0,
          "unit": "rafters",
          "confidence": "high",
          "steps": [
            {
              "label": "Bays across the pergola",
              "value": 12
            },
            {
              "label": "Rafter centres, as laid out",
              "value": 0.5,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "perimeter-joint-width-calculator",
      "title": "Curtain Wall Perimeter Joint Width Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/perimeter-joint-width-calculator/",
      "sources": [
        "ASTM C1193, Standard Guide for Use of Joint Sealants — a butt joint's width is sized so the anticipated movement stays inside the sealant's rated movement capability, with the construction tolerance added on top rather than absorbed by it",
        "ASTM C920, Standard Specification for Elastomeric Joint Sealants — the movement classes offered here (12½, 25, 35, 50) are that specification's own, and the class number is the percentage of installed joint width the sealant is qualified to move",
        "Backer rod diameter of 1.25 x the joint width is a RULE OF THUMB, stated as one: the rod must compress to stay put without being crushed, and the 25% oversize is the figure the trade works to rather than a value published in a standard",
        "Bead depth follows the 2:1 width-to-depth rule with a 6 mm floor and a 12 mm ceiling — again a rule of thumb, and again the sealant manufacturer's own data sheet governs where the two disagree"
      ],
      "vectors": [
        {
          "name": "6 mm movement, Class 25, 6 mm tolerance",
          "inputs": {
            "anticipatedMovement": 0.006,
            "movementClass": "25",
            "constructionTolerance": 0.006
          },
          "expected": 30,
          "toleranceDecimalPlaces": 3,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Width demanded by movement alone",
              "value": 24,
              "unit": "mm"
            },
            {
              "label": "Construction tolerance added",
              "value": 6,
              "unit": "mm"
            },
            {
              "label": "Backer rod diameter",
              "value": 37.5,
              "unit": "mm"
            },
            {
              "label": "Sealant bead depth at mid-joint",
              "value": 12.7,
              "unit": "mm"
            },
            {
              "label": "Movement the finished joint can absorb",
              "value": 7.5,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "12 mm movement, Class 50 silicone, 3 mm tolerance",
          "inputs": {
            "anticipatedMovement": 0.012,
            "movementClass": "50",
            "constructionTolerance": 0.003
          },
          "expected": 27,
          "toleranceDecimalPlaces": 3,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Width demanded by movement alone",
              "value": 24,
              "unit": "mm"
            },
            {
              "label": "Construction tolerance added",
              "value": 3,
              "unit": "mm"
            },
            {
              "label": "Backer rod diameter",
              "value": 33.75,
              "unit": "mm"
            },
            {
              "label": "Sealant bead depth at mid-joint",
              "value": 12.7,
              "unit": "mm"
            },
            {
              "label": "Movement the finished joint can absorb",
              "value": 13.5,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Tiny movement is held at the 6 mm practical minimum",
          "inputs": {
            "anticipatedMovement": 0.0005,
            "movementClass": "50",
            "constructionTolerance": 0
          },
          "expected": 6,
          "toleranceDecimalPlaces": 3,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Width demanded by movement alone",
              "value": 1,
              "unit": "mm"
            },
            {
              "label": "Construction tolerance added",
              "value": 0,
              "unit": "mm"
            },
            {
              "label": "Backer rod diameter",
              "value": 7.5,
              "unit": "mm"
            },
            {
              "label": "Sealant bead depth at mid-joint",
              "value": 6,
              "unit": "mm"
            },
            {
              "label": "Movement the finished joint can absorb",
              "value": 3,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "permeable-joint-fill-stone-calculator",
      "title": "Permeable Pavement Joint Fill Stone Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/permeable-joint-fill-stone-calculator/",
      "sources": [
        "ASCE/T&DI 68-18, Permeable Interlocking Concrete Pavement, which covers the construction and the maintenance regime that makes joint replenishment a recurring quantity rather than a one-off",
        "ASTM D448 defines the standard size numbers used for jointing and bedding aggregate in permeable pavements; the gradation chosen changes both the void structure and the bulk density entered here",
        "The top-up and replenishment percentages are rules of thumb, not published figures — the joints take more stone during compaction than their nominal volume, and lose some at every cleaning cycle, by amounts that depend on the unit, the plant and the site"
      ],
      "vectors": [
        {
          "name": "100 m² at 10% open area, 50 mm deep, 1500 kg/m³, 15% top-up",
          "inputs": {
            "laidArea": 100,
            "openAreaPercent": 10,
            "jointDepth": 0.05,
            "bulkDensity": 1500,
            "topUpPercent": 15,
            "replenishmentPercent": 5
          },
          "expected": 862.5,
          "toleranceDecimalPlaces": 2,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Loose stone volume in the joints",
              "value": 0.5,
              "unit": "m³"
            },
            {
              "label": "Stone before the compaction allowance",
              "value": 750,
              "unit": "kg"
            },
            {
              "label": "Stone for each replenishment round",
              "value": 37.5,
              "unit": "kg"
            },
            {
              "label": "First fill plus one replenishment round",
              "value": 899.9999999999999,
              "unit": "kg"
            }
          ],
          "includesAllowance": {
            "label": "Compaction top-up allowance",
            "percent": 15
          },
          "basis": "ambiguous"
        },
        {
          "name": "450 m² at 8.5% open area, 40 mm deep, 1600 kg/m³, 20% top-up",
          "inputs": {
            "laidArea": 450,
            "openAreaPercent": 8.5,
            "jointDepth": 0.04,
            "bulkDensity": 1600,
            "topUpPercent": 20,
            "replenishmentPercent": 8
          },
          "expected": 2937.6,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Loose stone volume in the joints",
              "value": 1.53,
              "unit": "m³"
            },
            {
              "label": "Stone before the compaction allowance",
              "value": 2448,
              "unit": "kg"
            },
            {
              "label": "Stone for each replenishment round",
              "value": 195.84,
              "unit": "kg"
            },
            {
              "label": "First fill plus one replenishment round",
              "value": 3133.44,
              "unit": "kg"
            }
          ],
          "includesAllowance": {
            "label": "Compaction top-up allowance",
            "percent": 20
          },
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "picp-infiltration-storage-calculator",
      "title": "PICP Permeable Pavement Infiltration Storage Calculator",
      "url": "https://craftquantities.com/calculators/sustainability-compliance/picp-infiltration-storage-calculator/",
      "sources": [
        "Storage volume = surface area × reservoir depth × aggregate void ratio, the standard method for estimating the water storage capacity within a permeable pavement system's open-graded aggregate base"
      ],
      "vectors": [
        {
          "name": "100m² surface, 300mm reservoir, 0.4 void ratio",
          "inputs": {
            "surfaceArea": 100,
            "reservoirDepth": 0.3,
            "voidRatio": 0.4
          },
          "expected": 12000,
          "toleranceDecimalPlaces": -1,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150m² surface, 250mm reservoir, 0.35 void ratio",
          "inputs": {
            "surfaceArea": 150,
            "reservoirDepth": 0.25,
            "voidRatio": 0.35
          },
          "expected": 13125,
          "toleranceDecimalPlaces": -1,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "pier-adfreeze-uplift-calculator",
      "title": "Pier Adfreeze Uplift Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/pier-adfreeze-uplift-calculator/",
      "sources": [
        "Uplift = adfreeze bond stress × the shaft's bonded surface area inside the frost zone (π × diameter × frost depth). Restraint = dead load + pier self-weight + the weight of soil standing over the bell's projecting annulus.",
        "The adfreeze bond stress is a SITE-SPECIFIC soil property you supply from the geotechnical report; this page applies no table of published values, because bond stress varies with soil type, moisture, freezing rate and shaft finish.",
        "ASCE/SEI 32, Design and Construction of Frost-Protected Shallow Foundations — the standard the frost-heave design case belongs to",
        "ACI 318, Building Code Requirements for Structural Concrete — the code governing development of the vertical bars that carry the tension computed here",
        "Normalweight concrete self-weight taken as 2,400 kg/m³ (about 150 pcf), the conventional design value"
      ],
      "vectors": [
        {
          "name": "300 mm shaft, 1.5 m frost, belled, uplift governs",
          "inputs": {
            "frostDepth": 1.5,
            "shaftDiameter": 0.3,
            "adfreezeStress": 65000,
            "deadLoad": 20000,
            "pierLength": 2.4,
            "bellDiameter": 0.6,
            "soilDensity": 1800,
            "verticalSteelArea": 800
          },
          "expected": 58.915,
          "toleranceDecimalPlaces": 2,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Adfreeze uplift on the shaft",
              "value": 91.89158511750145,
              "unit": "kN"
            },
            {
              "label": "Restraint from dead load, pier and bell",
              "value": 32.97654002997266,
              "unit": "kN"
            },
            {
              "label": "Tension the vertical steel must carry",
              "value": 58.915045087528796,
              "unit": "kN"
            },
            {
              "label": "Stress in the vertical steel",
              "value": 73.643806359411,
              "unit": "MPa"
            },
            {
              "label": "Bonded shaft area inside the frost zone",
              "value": 1.413716694115407,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Same pier under a heavier dead load — held down",
          "inputs": {
            "frostDepth": 1.5,
            "shaftDiameter": 0.3,
            "adfreezeStress": 65000,
            "deadLoad": 120000,
            "pierLength": 2.4,
            "bellDiameter": 0.6,
            "soilDensity": 1800,
            "verticalSteelArea": 800
          },
          "expected": -41.085,
          "toleranceDecimalPlaces": 2,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Adfreeze uplift on the shaft",
              "value": 91.89158511750145,
              "unit": "kN"
            },
            {
              "label": "Restraint from dead load, pier and bell",
              "value": 132.97654002997265,
              "unit": "kN"
            },
            {
              "label": "Tension the vertical steel must carry",
              "value": 0,
              "unit": "kN"
            },
            {
              "label": "Stress in the vertical steel",
              "value": 0,
              "unit": "MPa"
            },
            {
              "label": "Bonded shaft area inside the frost zone",
              "value": 1.413716694115407,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "450 mm shaft, 2 m frost, higher bond stress",
          "inputs": {
            "frostDepth": 2,
            "shaftDiameter": 0.45,
            "adfreezeStress": 80000,
            "deadLoad": 30000,
            "pierLength": 3,
            "bellDiameter": 0.9,
            "soilDensity": 1900,
            "verticalSteelArea": 1200
          },
          "expected": 158.294,
          "toleranceDecimalPlaces": 2,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Adfreeze uplift on the shaft",
              "value": 226.1946710584651,
              "unit": "kN"
            },
            {
              "label": "Restraint from dead load, pier and bell",
              "value": 67.90023109715571,
              "unit": "kN"
            },
            {
              "label": "Tension the vertical steel must carry",
              "value": 158.2944399613094,
              "unit": "kN"
            },
            {
              "label": "Stress in the vertical steel",
              "value": 131.91203330109118,
              "unit": "MPa"
            },
            {
              "label": "Bonded shaft area inside the frost zone",
              "value": 2.827433388230814,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "pile-group-block-failure-calculator",
      "title": "Pile Group Block Failure Calculator (Clay)",
      "url": "https://craftquantities.com/calculators/heavy-civil/pile-group-block-failure-calculator/",
      "sources": [
        "Block failure of a pile group in clay (Terzaghi and Peck; Tomlinson and Woodward, Pile Design and Construction Practice): Q = 2(B + L) × D × c̄u + B × L × cu × Nc, where B and L are the group's plan dimensions out to out, D the pile length, c̄u the average undrained strength along the shaft and cu the strength at the base",
        "Skempton's bearing capacity factor for a rectangular base in clay: Nc = 5 × (1 + 0.2 D/B) × (1 + 0.2 B/L), with D/B taken no greater than 2.5, so Nc reaches 9 under a deep square block",
        "The Converse-Labarre group efficiency E = 1 − θ × [(n − 1)m + (m − 1)n] ÷ (90 × m × n), θ = arctan(d/s) in degrees, for m columns and n rows (Bowles, Foundation Analysis and Design)"
      ],
      "vectors": [
        {
          "name": "The soft-ground guide's 3 × 3 group of 400 mm piles at 1.2 m, 15 m long",
          "inputs": {
            "rows": 3,
            "columns": 3,
            "spacing": 1.2,
            "diameter": 0.4,
            "pileLength": 15,
            "shaftStrength": 40000,
            "baseStrength": 60000,
            "singlePileCapacity": 900000
          },
          "expected": 10953.6,
          "toleranceDecimalPlaces": 1,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Block width, out to out",
              "value": 2.8,
              "unit": "m"
            },
            {
              "label": "Block length, out to out",
              "value": 2.8,
              "unit": "m"
            },
            {
              "label": "Bearing capacity factor Nc",
              "value": 9
            },
            {
              "label": "Shear round the block's sides",
              "value": 6720,
              "unit": "kN"
            },
            {
              "label": "End bearing under the block",
              "value": 4233.599999999999,
              "unit": "kN"
            },
            {
              "label": "Converse-Labarre efficiency",
              "value": 0.726889647067822
            },
            {
              "label": "Sum of the single piles",
              "value": 8100,
              "unit": "kN"
            },
            {
              "label": "Sum reduced by the efficiency",
              "value": 5887.806141249359,
              "unit": "kN"
            },
            {
              "label": "The smaller of the two",
              "value": 5887.806141249359,
              "unit": "kN"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A 2 × 4 group: a rectangular block",
          "inputs": {
            "rows": 2,
            "columns": 4,
            "spacing": 1,
            "diameter": 0.3,
            "pileLength": 10,
            "shaftStrength": 30000,
            "baseStrength": 45000,
            "singlePileCapacity": 0
          },
          "expected": 4321.95,
          "toleranceDecimalPlaces": 1,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Block width, out to out",
              "value": 1.3,
              "unit": "m"
            },
            {
              "label": "Block length, out to out",
              "value": 3.3,
              "unit": "m"
            },
            {
              "label": "Bearing capacity factor Nc",
              "value": 8.090909090909092
            },
            {
              "label": "Shear round the block's sides",
              "value": 2760,
              "unit": "kN"
            },
            {
              "label": "End bearing under the block",
              "value": 1561.9500000000003,
              "unit": "kN"
            },
            {
              "label": "Converse-Labarre efficiency",
              "value": 0.7680660523056442
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Short piles: D/B below 2.5 lowers Nc",
          "inputs": {
            "rows": 2,
            "columns": 2,
            "spacing": 1.2,
            "diameter": 0.6,
            "pileLength": 3,
            "shaftStrength": 50000,
            "baseStrength": 50000,
            "singlePileCapacity": 0
          },
          "expected": 2376,
          "toleranceDecimalPlaces": 1,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Block width, out to out",
              "value": 1.7999999999999998,
              "unit": "m"
            },
            {
              "label": "Block length, out to out",
              "value": 1.7999999999999998,
              "unit": "m"
            },
            {
              "label": "Bearing capacity factor Nc",
              "value": 8.000000000000002
            },
            {
              "label": "Shear round the block's sides",
              "value": 1080,
              "unit": "kN"
            },
            {
              "label": "End bearing under the block",
              "value": 1296,
              "unit": "kN"
            },
            {
              "label": "Converse-Labarre efficiency",
              "value": 0.7048327646991335
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "pile-group-efficiency-calculator",
      "title": "Pile Group Efficiency Calculator (Converse-Labarre)",
      "url": "https://craftquantities.com/calculators/heavy-civil/pile-group-efficiency-calculator/",
      "sources": [
        "Converse-Labarre pile group efficiency formula: Eg = 1 − θ x [(n−1)m + (m−1)n] / (90mn), where θ = arctan(d/s) in degrees, d is pile diameter, s is center-to-center spacing, m is the number of rows, and n is the number of columns"
      ],
      "vectors": [
        {
          "name": "0.4m dia, 1.2m spacing, 3x3 group",
          "inputs": {
            "pileDiameter": 0.4,
            "pileSpacing": 1.2,
            "rows": 3,
            "columns": 3
          },
          "expected": 0.727,
          "toleranceDecimalPlaces": 2,
          "unit": "(Eg)",
          "confidence": "medium",
          "steps": [
            {
              "label": "θ = arctan(d/s)",
              "value": 18.434948822922014,
              "unit": "°"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "0.5m dia, 1.5m spacing, 2x4 group",
          "inputs": {
            "pileDiameter": 0.5,
            "pileSpacing": 1.5,
            "rows": 2,
            "columns": 4
          },
          "expected": 0.744,
          "toleranceDecimalPlaces": 2,
          "unit": "(Eg)",
          "confidence": "medium",
          "steps": [
            {
              "label": "θ = arctan(d/s)",
              "value": 18.43494882292201,
              "unit": "°"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "pipe-expansion-loop-calculator",
      "title": "Pipe Thermal Expansion Loop Sizing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/pipe-expansion-loop-calculator/",
      "sources": [
        "Simplified expansion loop sizing: L(in) = √(3 · E · Do(in) · ΔL(in) / σ), the guided-cantilever relation for sizing a square/U-shaped expansion loop's leg length from the pipe's outside diameter and expected linear expansion, keeping bending stress within allowable limits"
      ],
      "vectors": [
        {
          "name": "4in OD carbon steel, 2in expansion",
          "inputs": {
            "pipeMaterial": "carbon-steel",
            "outsideDiameter": 0.1016,
            "expectedExpansion": 0.0508
          },
          "expected": 15.5457,
          "toleranceDecimalPlaces": 1,
          "unit": "ft",
          "confidence": "medium",
          "steps": [
            {
              "label": "Modulus of elasticity used (psi)",
              "value": 29000000,
              "unit": "psi"
            },
            {
              "label": "Allowable bending stress used (psi)",
              "value": 20000,
              "unit": "psi"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "6in OD carbon steel, 3in expansion",
          "inputs": {
            "pipeMaterial": "carbon-steel",
            "outsideDiameter": 0.1524,
            "expectedExpansion": 0.0762
          },
          "expected": 23.3185,
          "toleranceDecimalPlaces": 1,
          "unit": "ft",
          "confidence": "medium",
          "steps": [
            {
              "label": "Modulus of elasticity used (psi)",
              "value": 29000000,
              "unit": "psi"
            },
            {
              "label": "Allowable bending stress used (psi)",
              "value": 20000,
              "unit": "psi"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Copper needs a longer loop than steel for the same movement",
          "inputs": {
            "pipeMaterial": "copper",
            "outsideDiameter": 0.1016,
            "expectedExpansion": 0.0508
          },
          "expected": 21.7315,
          "toleranceDecimalPlaces": 1,
          "unit": "ft",
          "confidence": "medium",
          "steps": [
            {
              "label": "Modulus of elasticity used (psi)",
              "value": 17000000,
              "unit": "psi"
            },
            {
              "label": "Allowable bending stress used (psi)",
              "value": 6000,
              "unit": "psi"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "PVC needs about a third of the steel length",
          "inputs": {
            "pipeMaterial": "pvc",
            "outsideDiameter": 0.1016,
            "expectedExpansion": 0.0508
          },
          "expected": 5.7735,
          "toleranceDecimalPlaces": 1,
          "unit": "ft",
          "confidence": "medium",
          "steps": [
            {
              "label": "Modulus of elasticity used (psi)",
              "value": 400000,
              "unit": "psi"
            },
            {
              "label": "Allowable bending stress used (psi)",
              "value": 2000,
              "unit": "psi"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "pipe-fitting-equivalent-length-calculator",
      "title": "Pipe Fitting Equivalent Length Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/pipe-fitting-equivalent-length-calculator/",
      "sources": [
        "Total equivalent length = Σ(fitting count × equivalent length per fitting), the standard method for converting pipe fittings into an equivalent length of straight pipe for friction loss calculations"
      ],
      "vectors": [
        {
          "name": "4 elbows @0.5m, 2 tees @0.9m",
          "inputs": {
            "elbowCount": 4,
            "elbowEquivLength": 0.5,
            "teeCount": 2,
            "teeEquivLength": 0.9
          },
          "expected": 3.8,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "6 elbows @0.6m, 3 tees @1.1m",
          "inputs": {
            "elbowCount": 6,
            "elbowEquivLength": 0.6,
            "teeCount": 3,
            "teeEquivLength": 1.1
          },
          "expected": 6.9,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "pipe-hanger-spacing-calculator",
      "title": "Pipe Hanger Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/pipe-hanger-spacing-calculator/",
      "sources": [
        "Hanger count = ceil(pipe run length ÷ maximum hanger spacing) + 1, the standard layout method for spacing pipe supports at or within the maximum spacing permitted by plumbing/mechanical code for the pipe's material and size"
      ],
      "vectors": [
        {
          "name": "20m run, 2.4m max spacing",
          "inputs": {
            "runLength": 20,
            "maxSpacing": 2.4
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "hangers",
          "confidence": "medium",
          "steps": [
            {
              "label": "Bays along the pipe run",
              "value": 9
            },
            {
              "label": "Hanger centres along the pipe",
              "value": 2.2222222222222223,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30m run, 3.0m max spacing",
          "inputs": {
            "runLength": 30,
            "maxSpacing": 3
          },
          "expected": 11,
          "toleranceDecimalPlaces": 0,
          "unit": "hangers",
          "confidence": "medium",
          "steps": [
            {
              "label": "Bays along the pipe run",
              "value": 10
            },
            {
              "label": "Hanger centres along the pipe",
              "value": 3,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "pipe-insulation-calculator",
      "title": "Pipe Insulation Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/pipe-insulation-calculator/",
      "sources": [
        "Foam pipe insulation sleeves are commonly sold in 6 ft sections in North America and in 1 m lengths in metric markets (2 m is also stocked); section count = pipe length / stock length, rounded up with a waste allowance"
      ],
      "vectors": [
        {
          "name": "15m of pipe",
          "inputs": {
            "pipeLength": 15
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "x 6 ft sections",
          "confidence": "high",
          "steps": [
            {
              "label": "Pipe length (with waste)",
              "value": 54.13385826771653,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30m of pipe",
          "inputs": {
            "pipeLength": 30
          },
          "expected": 19,
          "toleranceDecimalPlaces": 0,
          "unit": "x 6 ft sections",
          "confidence": "high",
          "steps": [
            {
              "label": "Pipe length (with waste)",
              "value": 108.26771653543307,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15m of pipe with no bend waste",
          "inputs": {
            "pipeLength": 15,
            "wastePercent": 0
          },
          "expected": 9,
          "toleranceDecimalPlaces": 0,
          "unit": "x 6 ft sections",
          "confidence": "high",
          "steps": [
            {
              "label": "Pipe length (with waste)",
              "value": 49.212598425196845,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "pipe-volume-calculator",
      "title": "Pipe Volume Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/pipe-volume-calculator/",
      "sources": [
        "Standard cylinder volume formula: V = pi x r² x length"
      ],
      "vectors": [
        {
          "name": "0.75in ID, 10m length",
          "inputs": {
            "innerDiameter": 0.01905,
            "pipeLength": 10
          },
          "expected": 0.75,
          "toleranceDecimalPlaces": 1,
          "unit": "gallons",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume (liters)",
              "value": 2.850229569923426,
              "unit": "liters"
            },
            {
              "label": "Volume (cubic in)",
              "value": 173.931679886246,
              "unit": "cubic in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2in ID, 5m length",
          "inputs": {
            "innerDiameter": 0.0508,
            "pipeLength": 5
          },
          "expected": 2.68,
          "toleranceDecimalPlaces": 1,
          "unit": "gallons",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume (liters)",
              "value": 10.134149581949954,
              "unit": "liters"
            },
            {
              "label": "Volume (cubic in)",
              "value": 618.4237507066522,
              "unit": "cubic in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "plant-spacing-calculator",
      "title": "Plant Spacing Calculator (Plants per Bed or Row, Square or Triangular)",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/plant-spacing-calculator/",
      "sources": [
        "Geometry of planting patterns: a square pattern gives each plant s²; an equilateral triangular pattern gives each plant a 60° rhombus of side s, s² × sin 60° = (√3/2)s² ≈ 0.866 s², so it holds 2/√3 ≈ 1.1547 times as many plants per area at the same spacing, in rows 0.866 s apart",
        "University of Illinois Extension, Ground Covers: plant groundcovers in a staggered or diamond pattern for best results; Determining the Number of Plants Needed: 100 square feet at 6-inch spacing takes 400 plants, at 12-inch spacing 100 plants",
        "Royal Horticultural Society, Hedges: planting guide: within a single row, planting distances vary from 30–60 cm (1–2 ft); for hedges thicker than 90 cm (3 ft), plant a staggered double row 45 cm (18 in) apart, with plants 90 cm (3 ft) apart"
      ],
      "vectors": [
        {
          "name": "The opening: a 10 m² bed at 30 cm, triangular",
          "inputs": {
            "planting": "bed",
            "pattern": "triangular",
            "bedArea": 10,
            "plantCentres": 0.3
          },
          "expected": 129,
          "toleranceDecimalPlaces": 0,
          "unit": "plants",
          "confidence": "high",
          "steps": [
            {
              "label": "Ground each plant takes",
              "value": 0.07794228634059946,
              "unit": "m²"
            },
            {
              "label": "Plants the area holds, before rounding up",
              "value": 128.30005981991687,
              "unit": "plants"
            },
            {
              "label": "Distance between rows in this pattern",
              "value": 0.25980762113533157,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The same bed in a square grid",
          "inputs": {
            "planting": "bed",
            "pattern": "square",
            "bedArea": 10,
            "plantCentres": 0.3
          },
          "expected": 112,
          "toleranceDecimalPlaces": 0,
          "unit": "plants",
          "confidence": "high",
          "steps": [
            {
              "label": "Ground each plant takes",
              "value": 0.09,
              "unit": "m²"
            },
            {
              "label": "Plants the area holds, before rounding up",
              "value": 111.11111111111111,
              "unit": "plants"
            },
            {
              "label": "Distance between rows in this pattern",
              "value": 0.3,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Illinois Extension's chart: 100 sq ft at 12 in, square, 100 plants",
          "inputs": {
            "planting": "bed",
            "pattern": "square",
            "bedArea": 9.290304,
            "plantCentres": 0.3048
          },
          "expected": 100,
          "toleranceDecimalPlaces": 0,
          "unit": "plants",
          "confidence": "high",
          "steps": [
            {
              "label": "Ground each plant takes",
              "value": 0.09290304,
              "unit": "m²"
            },
            {
              "label": "Plants the area holds, before rounding up",
              "value": 100,
              "unit": "plants"
            },
            {
              "label": "Distance between rows in this pattern",
              "value": 0.3048,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A 10 m hedge at 30 cm in a single row",
          "inputs": {
            "planting": "row",
            "pattern": "square",
            "rowLength": 10,
            "rows": 1,
            "plantCentres": 0.3
          },
          "expected": 34,
          "toleranceDecimalPlaces": 0,
          "unit": "plants",
          "confidence": "high",
          "steps": [
            {
              "label": "Plants in each row",
              "value": 34,
              "unit": "plants"
            },
            {
              "label": "Rows",
              "value": 1,
              "unit": "rows"
            },
            {
              "label": "Distance the plants close up to along a row",
              "value": 0.29411764705882354,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The RHS staggered double hedge, 10 m long, plants 90 cm apart",
          "inputs": {
            "planting": "row",
            "pattern": "triangular",
            "rowLength": 10,
            "rows": 2,
            "plantCentres": 0.9
          },
          "expected": 23,
          "toleranceDecimalPlaces": 0,
          "unit": "plants",
          "confidence": "high",
          "steps": [
            {
              "label": "Plants in each full row",
              "value": 12,
              "unit": "plants"
            },
            {
              "label": "Plants in each shifted row",
              "value": 11,
              "unit": "plants"
            },
            {
              "label": "Rows",
              "value": 2,
              "unit": "rows"
            },
            {
              "label": "Distance the plants close up to along a row",
              "value": 0.8333333333333334,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "plaster-bead-calculator",
      "title": "Plaster Angle and Stop Bead Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/plaster-bead-calculator/",
      "sources": [
        "A bead runs the full height or width of its corner in one piece, so each run consumes a whole stock length: the count is runs divided by the runs a length yields, rounded up",
        "Angle bead forms an external corner and stop bead forms an edge where plaster ends — different sections, ordered separately",
        "Offcut is the stock length times the count, less the length actually run — a real figure rather than an assumed percentage"
      ],
      "vectors": [
        {
          "name": "4 corners at 2.4 m and 6 stop runs at 2.1 m, from 3 m stock",
          "inputs": {
            "angleRuns": 4,
            "angleRunLength": 2.4,
            "stopRuns": 6,
            "stopRunLength": 2.1,
            "stockLength": 3
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "lengths",
          "confidence": "high",
          "steps": [
            {
              "label": "Angle bead lengths",
              "value": 4,
              "unit": "lengths"
            },
            {
              "label": "Stop bead lengths",
              "value": 6,
              "unit": "lengths"
            },
            {
              "label": "Offcut, as a share of what is bought",
              "value": 25.99999999999999,
              "unit": "%"
            },
            {
              "label": "Bead actually run",
              "value": 72.83464566929135,
              "unit": "ft"
            },
            {
              "label": "Bead bought",
              "value": 98.42519685039369,
              "unit": "ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Short runs share a length: 6 window heads at 0.6 m from 3 m stock",
          "inputs": {
            "angleRuns": 0,
            "angleRunLength": 2.4,
            "stopRuns": 6,
            "stopRunLength": 0.6,
            "stockLength": 3
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "lengths",
          "confidence": "high",
          "steps": [
            {
              "label": "Angle bead lengths",
              "value": 0,
              "unit": "lengths"
            },
            {
              "label": "Stop bead lengths",
              "value": 2,
              "unit": "lengths"
            },
            {
              "label": "Offcut, as a share of what is bought",
              "value": 40.00000000000001,
              "unit": "%"
            },
            {
              "label": "Bead actually run",
              "value": 11.811023622047243,
              "unit": "ft"
            },
            {
              "label": "Bead bought",
              "value": 19.68503937007874,
              "unit": "ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Ordering by total length would say six, and six will not do it",
          "inputs": {
            "angleRuns": 8,
            "angleRunLength": 2.4,
            "stopRuns": 0,
            "stopRunLength": 2.1,
            "stockLength": 3
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "lengths",
          "confidence": "high",
          "steps": [
            {
              "label": "Angle bead lengths",
              "value": 8,
              "unit": "lengths"
            },
            {
              "label": "Stop bead lengths",
              "value": 0,
              "unit": "lengths"
            },
            {
              "label": "Offcut, as a share of what is bought",
              "value": 20.000000000000004,
              "unit": "%"
            },
            {
              "label": "Bead actually run",
              "value": 62.99212598425196,
              "unit": "ft"
            },
            {
              "label": "Bead bought",
              "value": 78.74015748031496,
              "unit": "ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "plaster-brown-coat-calculator",
      "title": "Gypsum Plaster Brown Coat Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/plaster-brown-coat-calculator/",
      "sources": [
        "Three-coat plaster system volume per coat = wall area × coat thickness; the brown coat levels the surface and is typically thinner than the scratch coat (commonly ~6 mm)"
      ],
      "vectors": [
        {
          "name": "30m² area, 6mm brown coat",
          "inputs": {
            "wallArea": 30,
            "coatThickness": 0.006
          },
          "expected": 180,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Equivalent volume",
              "value": 0.18,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "45m² area, 6mm brown coat",
          "inputs": {
            "wallArea": 45,
            "coatThickness": 0.006
          },
          "expected": 270,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Equivalent volume",
              "value": 0.27,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "plaster-finish-coat-calculator",
      "title": "Gypsum Plaster Finish Coat Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/plaster-finish-coat-calculator/",
      "sources": [
        "Three-coat plaster system volume per coat = wall area × coat thickness; the finish coat is the thinnest, smoothest layer (commonly ~3 mm)"
      ],
      "vectors": [
        {
          "name": "30m² area, 3mm finish coat",
          "inputs": {
            "wallArea": 30,
            "coatThickness": 0.003
          },
          "expected": 90,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Equivalent volume",
              "value": 0.09,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "45m² area, 3mm finish coat",
          "inputs": {
            "wallArea": 45,
            "coatThickness": 0.003
          },
          "expected": 135,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Equivalent volume",
              "value": 0.135,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "plaster-scratch-coat-calculator",
      "title": "Gypsum Plaster Scratch Coat Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/plaster-scratch-coat-calculator/",
      "sources": [
        "Three-coat plaster system volume per coat = wall area × coat thickness; the scratch coat is typically the thickest of the three coats (commonly ~10 mm)"
      ],
      "vectors": [
        {
          "name": "30m² area, 10mm scratch coat",
          "inputs": {
            "wallArea": 30,
            "coatThickness": 0.01
          },
          "expected": 300,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Equivalent volume",
              "value": 0.3,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "45m² area, 10mm scratch coat",
          "inputs": {
            "wallArea": 45,
            "coatThickness": 0.01
          },
          "expected": 450,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Equivalent volume",
              "value": 0.45,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "plate-block-shear-net-section-calculator",
      "title": "Steel Plate Block Shear and Net Section Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/plate-block-shear-net-section-calculator/",
      "sources": [
        "AISC 360, Specification for Structural Steel Buildings, Section J4.1 — tensile yielding on the gross area (Rn = Fy·Ag) and tensile rupture on the effective net area, with the effective net area of a connecting element capped at 0.85 times its gross area",
        "AISC 360, Specification for Structural Steel Buildings, Section J4.2 — shear yielding on the gross area at 0.60·Fy·Agv and shear rupture on the net area at 0.60·Fu·Anv",
        "AISC 360, Specification for Structural Steel Buildings, Section J4.3 — block shear rupture, Rn = 0.60·Fu·Anv + Ubs·Fu·Ant, not taken greater than 0.60·Fy·Agv + Ubs·Fu·Ant, with Ubs 1.0 for uniform tension stress and 0.5 where it is non-uniform",
        "R. E. Whitmore, Experimental Investigation of Stresses in Gusset Plates, University of Tennessee Engineering Experiment Station Bulletin No. 16 (1952) — the effective width taken as the thirty-degree spread from the outer fasteners of the first row to the last row, the convention the AISC Steel Construction Manual uses for gusset plate checks",
        "AISC 360 Section B4.3 — for net area, the width of a bolt hole is taken larger than the hole itself; this page asks for that deduction width directly rather than adding an allowance behind your back"
      ],
      "vectors": [
        {
          "name": "10 mm plate, 2 lines of 3 M20 bolts in 22 mm holes deducted at 24 mm, 345/450 grade — net section governs",
          "inputs": {
            "plateThickness": 0.01,
            "yieldStrength": 345000000,
            "tensileStrength": 450000000,
            "holeDiameter": 0.024,
            "boltLines": 2,
            "boltsPerLine": 3,
            "gauge": 0.075,
            "pitch": 0.075,
            "edgeDistance": 0.04,
            "endDistance": 0.04,
            "blockShearUbs": "1"
          },
          "expected": 361.125,
          "toleranceDecimalPlaces": 2,
          "unit": "kN",
          "confidence": "high",
          "steps": [
            {
              "label": "Net section tension rupture",
              "value": 361.125,
              "unit": "kN"
            },
            {
              "label": "Block shear rupture",
              "value": 698.6250000000001,
              "unit": "kN"
            },
            {
              "label": "Yielding on the Whitmore section",
              "value": 481.275,
              "unit": "kN"
            },
            {
              "label": "Gross section tension yielding",
              "value": 481.275,
              "unit": "kN"
            },
            {
              "label": "Nominal strength at the governing limit state",
              "value": 481.5,
              "unit": "kN"
            },
            {
              "label": "Allowable strength at the governing limit state",
              "value": 240.75,
              "unit": "kN"
            },
            {
              "label": "Whitmore effective width from the thirty-degree spread",
              "value": 248.2050807568877,
              "unit": "mm"
            },
            {
              "label": "Gross plate width across the bolt group",
              "value": 155,
              "unit": "mm"
            },
            {
              "label": "Area remaining on the rupture line",
              "value": 1070,
              "unit": "mm²"
            },
            {
              "label": "Area remaining on the two shear planes",
              "value": 2600.0000000000005,
              "unit": "mm²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "12 mm plate, 3 lines of 4 bolts, 250/400 grade",
          "inputs": {
            "plateThickness": 0.012,
            "yieldStrength": 250000000,
            "tensileStrength": 400000000,
            "holeDiameter": 0.024,
            "boltLines": 3,
            "boltsPerLine": 4,
            "gauge": 0.08,
            "pitch": 0.08,
            "edgeDistance": 0.045,
            "endDistance": 0.045,
            "blockShearUbs": "1"
          },
          "expected": 640.8,
          "toleranceDecimalPlaces": 2,
          "unit": "kN",
          "confidence": "high",
          "steps": [
            {
              "label": "Net section tension rupture",
              "value": 640.8,
              "unit": "kN"
            },
            {
              "label": "Block shear rupture",
              "value": 1172.7,
              "unit": "kN"
            },
            {
              "label": "Yielding on the Whitmore section",
              "value": 675,
              "unit": "kN"
            },
            {
              "label": "Gross section tension yielding",
              "value": 675,
              "unit": "kN"
            },
            {
              "label": "Nominal strength at the governing limit state",
              "value": 854.4,
              "unit": "kN"
            },
            {
              "label": "Allowable strength at the governing limit state",
              "value": 427.2,
              "unit": "kN"
            },
            {
              "label": "Whitmore effective width from the thirty-degree spread",
              "value": 437.1281292110203,
              "unit": "mm"
            },
            {
              "label": "Gross plate width across the bolt group",
              "value": 250,
              "unit": "mm"
            },
            {
              "label": "Area remaining on the rupture line",
              "value": 2136,
              "unit": "mm²"
            },
            {
              "label": "Area remaining on the two shear planes",
              "value": 4823.999999999999,
              "unit": "mm²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Short end distance on an 8 mm plate — block shear governs",
          "inputs": {
            "plateThickness": 0.008,
            "yieldStrength": 345000000,
            "tensileStrength": 450000000,
            "holeDiameter": 0.018,
            "boltLines": 2,
            "boltsPerLine": 2,
            "gauge": 0.14,
            "pitch": 0.05,
            "edgeDistance": 0.06,
            "endDistance": 0.02,
            "blockShearUbs": "1"
          },
          "expected": 468.72,
          "toleranceDecimalPlaces": 2,
          "unit": "kN",
          "confidence": "high",
          "steps": [
            {
              "label": "Net section tension rupture",
              "value": 596.7000000000002,
              "unit": "kN"
            },
            {
              "label": "Block shear rupture",
              "value": 468.72000000000014,
              "unit": "kN"
            },
            {
              "label": "Yielding on the Whitmore section",
              "value": 491.17380686670316,
              "unit": "kN"
            },
            {
              "label": "Gross section tension yielding",
              "value": 645.8400000000001,
              "unit": "kN"
            },
            {
              "label": "Nominal strength at the governing limit state",
              "value": 624.9600000000002,
              "unit": "kN"
            },
            {
              "label": "Allowable strength at the governing limit state",
              "value": 312.4800000000001,
              "unit": "kN"
            },
            {
              "label": "Whitmore effective width from the thirty-degree spread",
              "value": 197.73502691896257,
              "unit": "mm"
            },
            {
              "label": "Gross plate width across the bolt group",
              "value": 260,
              "unit": "mm"
            },
            {
              "label": "Area remaining on the rupture line",
              "value": 1768.0000000000002,
              "unit": "mm²"
            },
            {
              "label": "Area remaining on the two shear planes",
              "value": 688.0000000000001,
              "unit": "mm²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Wide plate, short bolt group — the Whitmore section governs",
          "inputs": {
            "plateThickness": 0.008,
            "yieldStrength": 345000000,
            "tensileStrength": 450000000,
            "holeDiameter": 0.018,
            "boltLines": 2,
            "boltsPerLine": 2,
            "gauge": 0.14,
            "pitch": 0.06,
            "edgeDistance": 0.06,
            "endDistance": 0.03,
            "blockShearUbs": "1"
          },
          "expected": 519.8566,
          "toleranceDecimalPlaces": 2,
          "unit": "kN",
          "confidence": "high",
          "steps": [
            {
              "label": "Net section tension rupture",
              "value": 596.7000000000002,
              "unit": "kN"
            },
            {
              "label": "Block shear rupture",
              "value": 533.52,
              "unit": "kN"
            },
            {
              "label": "Yielding on the Whitmore section",
              "value": 519.8565682400437,
              "unit": "kN"
            },
            {
              "label": "Gross section tension yielding",
              "value": 645.8400000000001,
              "unit": "kN"
            },
            {
              "label": "Nominal strength at the governing limit state",
              "value": 577.6184091556041,
              "unit": "kN"
            },
            {
              "label": "Allowable strength at the governing limit state",
              "value": 345.87928691952345,
              "unit": "kN"
            },
            {
              "label": "Whitmore effective width from the thirty-degree spread",
              "value": 209.2820323027551,
              "unit": "mm"
            },
            {
              "label": "Gross plate width across the bolt group",
              "value": 260,
              "unit": "mm"
            },
            {
              "label": "Area remaining on the rupture line",
              "value": 1768.0000000000002,
              "unit": "mm²"
            },
            {
              "label": "Area remaining on the two shear planes",
              "value": 1008,
              "unit": "mm²"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "plywood-sheet-calculator",
      "title": "Plywood and OSB Sheet Calculator (Subfloor, Wall and Roof)",
      "url": "https://craftquantities.com/calculators/materials-quantities/plywood-sheet-calculator/",
      "sources": [
        "Standard plywood/OSB sheet size is 4 ft x 8 ft (32 sq ft) in North America and 2440 x 1220 mm (2.98 m²) in metric markets; sheet count = area / one sheet's area, rounded up with a waste allowance"
      ],
      "vectors": [
        {
          "name": "6x8m area, 10% waste",
          "inputs": {
            "areaLength": 6,
            "areaWidth": 8,
            "wasteFactorPercent": 10
          },
          "expected": 18,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets (4x8 ft)",
          "confidence": "high",
          "steps": [
            {
              "label": "Area to cover",
              "value": 516.6677000020667,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "10x10m area, 15% waste",
          "inputs": {
            "areaLength": 10,
            "areaWidth": 10,
            "wasteFactorPercent": 15
          },
          "expected": 39,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets (4x8 ft)",
          "confidence": "high",
          "steps": [
            {
              "label": "Area to cover",
              "value": 1076.391041670972,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "point-detector-coverage-calculator",
      "title": "Fire Detector Spacing and Count Calculator (BS 5839-1 and NFPA 72)",
      "url": "https://craftquantities.com/calculators/electrical/point-detector-coverage-calculator/",
      "sources": [
        "BS 5839-1:2025, clause 21: on a flat ceiling no point more than 7.5 m horizontally from the nearest point smoke detector or 5.3 m from the nearest point heat detector; in corridors under 2 m wide the coverage need not overlap",
        "NFPA 72, National Fire Alarm and Signaling Code, Chapter 17: spot detectors at their listed spacing (a nominal 30 ft, 9.1 m, for smoke on a smooth ceiling), with every point within 0.7 times the spacing of a detector",
        "Grid geometry: a rectangular cell's farthest point is its corner, at √((sx ÷ 2)² + (sy ÷ 2)²) from the detector"
      ],
      "vectors": [
        {
          "name": "The fire detection guide's open floor: 30 × 24 m, smoke detectors",
          "inputs": {
            "standard": "bs5839-smoke",
            "listedSpacing": 9.144,
            "roomLength": 30,
            "roomWidth": 24
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "detectors",
          "confidence": "high",
          "steps": [
            {
              "label": "Coverage radius",
              "value": 7.5,
              "unit": "m"
            },
            {
              "label": "Detectors along the length",
              "value": 4
            },
            {
              "label": "Detectors across the width",
              "value": 2
            },
            {
              "label": "Spacing along the length",
              "value": 7.5,
              "unit": "m"
            },
            {
              "label": "Spacing across the width",
              "value": 12,
              "unit": "m"
            },
            {
              "label": "Farthest point from a detector (a cell's corner)",
              "value": 7.075485849042453,
              "unit": "m"
            },
            {
              "label": "Floor area each detector covers on this grid",
              "value": 90,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The guide's 4 × 26 m store: 104 m² and still two heads",
          "inputs": {
            "standard": "bs5839-smoke",
            "listedSpacing": 9.144,
            "roomLength": 26,
            "roomWidth": 4
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "detectors",
          "confidence": "high",
          "steps": [
            {
              "label": "Coverage radius",
              "value": 7.5,
              "unit": "m"
            },
            {
              "label": "Detectors along the length",
              "value": 2
            },
            {
              "label": "Detectors across the width",
              "value": 1
            },
            {
              "label": "Spacing along the length",
              "value": 13,
              "unit": "m"
            },
            {
              "label": "Spacing across the width",
              "value": 4,
              "unit": "m"
            },
            {
              "label": "Farthest point from a detector (a cell's corner)",
              "value": 6.800735254367722,
              "unit": "m"
            },
            {
              "label": "Floor area each detector covers on this grid",
              "value": 52,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The same 30 × 24 m floor with heat detectors at 5.3 m",
          "inputs": {
            "standard": "bs5839-heat",
            "listedSpacing": 9.144,
            "roomLength": 30,
            "roomWidth": 24
          },
          "expected": 15,
          "toleranceDecimalPlaces": 0,
          "unit": "detectors",
          "confidence": "high",
          "steps": [
            {
              "label": "Coverage radius",
              "value": 5.3,
              "unit": "m"
            },
            {
              "label": "Detectors along the length",
              "value": 5
            },
            {
              "label": "Detectors across the width",
              "value": 3
            },
            {
              "label": "Spacing along the length",
              "value": 6,
              "unit": "m"
            },
            {
              "label": "Spacing across the width",
              "value": 8,
              "unit": "m"
            },
            {
              "label": "Farthest point from a detector (a cell's corner)",
              "value": 5,
              "unit": "m"
            },
            {
              "label": "Floor area each detector covers on this grid",
              "value": 48,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A 1.8 m corridor 40 m long, smoke detectors",
          "inputs": {
            "standard": "bs5839-smoke",
            "listedSpacing": 9.144,
            "roomLength": 40,
            "roomWidth": 1.8
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "detectors",
          "confidence": "high",
          "steps": [
            {
              "label": "Coverage radius",
              "value": 7.5,
              "unit": "m"
            },
            {
              "label": "Detectors along the length",
              "value": 3
            },
            {
              "label": "Detectors across the width",
              "value": 1
            },
            {
              "label": "Spacing along the length",
              "value": 13.333333333333334,
              "unit": "m"
            },
            {
              "label": "Spacing across the width",
              "value": 1.8,
              "unit": "m"
            },
            {
              "label": "Farthest point along the corridor from a detector",
              "value": 6.666666666666667,
              "unit": "m"
            },
            {
              "label": "Floor area each detector covers on this grid",
              "value": 24,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "NFPA 72 at a 30 ft listed spacing over a 100 × 60 ft room",
          "inputs": {
            "standard": "nfpa72",
            "listedSpacing": 9.144,
            "roomLength": 30.48,
            "roomWidth": 18.288
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "detectors",
          "confidence": "high",
          "steps": [
            {
              "label": "Coverage radius",
              "value": 6.400799999999999,
              "unit": "m"
            },
            {
              "label": "Detectors along the length",
              "value": 4
            },
            {
              "label": "Detectors across the width",
              "value": 2
            },
            {
              "label": "Spacing along the length",
              "value": 7.62,
              "unit": "m"
            },
            {
              "label": "Spacing across the width",
              "value": 9.144,
              "unit": "m"
            },
            {
              "label": "Farthest point from a detector (a cell's corner)",
              "value": 5.951410253040871,
              "unit": "m"
            },
            {
              "label": "Floor area each detector covers on this grid",
              "value": 69.67728,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "pond-volume-and-liner-calculator",
      "title": "Pond Volume and Liner Size Calculator",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/pond-volume-and-liner-calculator/",
      "sources": [
        "Anjon Manufacturing (maker of LifeGuard EPDM and PolyGuard PVC pond liners), Pond Liner: Pond Length ft + (Depth ft x 2) + 2 ft = Liner Length, and Pond Width ft + (Depth ft x 2) + 2 ft = Liner Width; a finished pond 12 ft long, 7 ft wide and 3 ft deep needs a 20 x 15 ft liner; the basic formula works for all pond shapes",
        "Pontec (an OASE brand), Calculating the pond size: length + 2 x depth (at the deepest point of the excavation) + 2 x 50 cm = length of the liner, and width + 2 x depth (at the deepest point of the excavation) + 2 x 50 cm = width of the liner",
        "Penn State Extension, Bryan R. Swistock and Tom McCarty, Pond Measurements: Area, Volume and Residence Time (updated 19 May 2025): for an irregular pond, measure numerous lengths and widths and multiply their averages (typically within ±20%), or divide it into trapezoids (±5–10%), or map its edge by GPS (about 1%); \"For a typical bowl-shaped pond the average depth can be estimated as 0.4 times the maximum depth\"",
        "Geometry and units: a round pond's water surface is π/4 times its diameter squared, the volume is the plan area times the average depth, and one cubic metre is 1,000 litres"
      ],
      "vectors": [
        {
          "name": "The opening: a 3 x 2 m pond, 0.6 m average, its water",
          "inputs": {
            "answerFor": "volume",
            "shape": "rectangular",
            "pondLength": 3,
            "pondWidth": 2,
            "deepestPoint": 0.9,
            "averageDepth": 0.6,
            "edgeOverlap": 0.5
          },
          "expected": 3600,
          "toleranceDecimalPlaces": 6,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Water the pond holds",
              "value": 3599.9999999999995,
              "unit": "L"
            },
            {
              "label": "Water surface area",
              "value": 6,
              "unit": "m²"
            },
            {
              "label": "Liner sheet length",
              "value": 5.8,
              "unit": "m"
            },
            {
              "label": "Liner sheet width",
              "value": 4.8,
              "unit": "m"
            },
            {
              "label": "Liner sheet area",
              "value": 27.84,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "The same pond's liner, Pontec's 50 cm at each edge",
          "inputs": {
            "answerFor": "liner",
            "shape": "rectangular",
            "pondLength": 3,
            "pondWidth": 2,
            "deepestPoint": 0.9,
            "averageDepth": 0.6,
            "edgeOverlap": 0.5
          },
          "expected": 27.84,
          "toleranceDecimalPlaces": 6,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Water the pond holds",
              "value": 3599.9999999999995,
              "unit": "L"
            },
            {
              "label": "Water surface area",
              "value": 6,
              "unit": "m²"
            },
            {
              "label": "Liner sheet length",
              "value": 5.8,
              "unit": "m"
            },
            {
              "label": "Liner sheet width",
              "value": 4.8,
              "unit": "m"
            },
            {
              "label": "Liner sheet area",
              "value": 27.84,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Anjon's worked pond: 12 x 7 ft, 3 ft deep, 1 ft at each edge, a 20 x 15 ft liner",
          "inputs": {
            "answerFor": "liner",
            "shape": "rectangular",
            "pondLength": 3.6576,
            "pondWidth": 2.1336,
            "deepestPoint": 0.9144,
            "averageDepth": 0.9144,
            "edgeOverlap": 0.3048
          },
          "expected": 27.870912,
          "toleranceDecimalPlaces": 6,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Water the pond holds",
              "value": 7135.845341184,
              "unit": "L"
            },
            {
              "label": "Water surface area",
              "value": 7.80385536,
              "unit": "m²"
            },
            {
              "label": "Liner sheet length",
              "value": 6.096,
              "unit": "m"
            },
            {
              "label": "Liner sheet width",
              "value": 4.572,
              "unit": "m"
            },
            {
              "label": "Liner sheet area",
              "value": 27.870912,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A round pond 2.5 m across, 0.6 m average depth",
          "inputs": {
            "answerFor": "volume",
            "shape": "round",
            "pondDiameter": 2.5,
            "deepestPoint": 0.9,
            "averageDepth": 0.6,
            "edgeOverlap": 0.5
          },
          "expected": 2945.243,
          "toleranceDecimalPlaces": 3,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Water the pond holds",
              "value": 2945.243112740431,
              "unit": "L"
            },
            {
              "label": "Water surface area",
              "value": 4.908738521234052,
              "unit": "m²"
            },
            {
              "label": "Liner sheet length",
              "value": 5.3,
              "unit": "m"
            },
            {
              "label": "Liner sheet width",
              "value": 5.3,
              "unit": "m"
            },
            {
              "label": "Liner sheet area",
              "value": 28.09,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "An irregular pond: 3.4 m average length by 2.2 m average width, 0.5 m average depth",
          "inputs": {
            "answerFor": "volume",
            "shape": "irregular",
            "longestAcross": 4,
            "widestAcross": 3,
            "averageAlong": 3.4,
            "averageAcross": 2.2,
            "deepestPoint": 0.9,
            "averageDepth": 0.5,
            "edgeOverlap": 0.5
          },
          "expected": 3740,
          "toleranceDecimalPlaces": 6,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Water the pond holds",
              "value": 3740,
              "unit": "L"
            },
            {
              "label": "Water surface area",
              "value": 7.48,
              "unit": "m²"
            },
            {
              "label": "Liner sheet length",
              "value": 6.8,
              "unit": "m"
            },
            {
              "label": "Liner sheet width",
              "value": 5.8,
              "unit": "m"
            },
            {
              "label": "Liner sheet area",
              "value": 39.44,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "pool-alkalinity-adjustment-calculator",
      "title": "Pool Total Alkalinity Adjustment Calculator",
      "url": "https://craftquantities.com/calculators/pools-water/pool-alkalinity-adjustment-calculator/",
      "sources": [
        "Total alkalinity is reported as ppm of calcium carbonate, whose equivalent weight is 50.043 g/eq; a reagent carrying one equivalent per mole moves alkalinity by its molar mass over that figure",
        "Sodium bicarbonate (84.007 g/mol) raises alkalinity strongly and pH only slightly, which is why alkalinity is set before pH rather than after it",
        "Acid removes alkalinity and pH together in fixed proportion; aeration drives off dissolved carbon dioxide and raises pH without restoring alkalinity, which is how the two are separated in practice",
        "Cyanuric acid contributes to a titrated alkalinity reading — roughly a third of the cyanurate concentration near pH 7.5 — so a stabilised pool's carbonate alkalinity is lower than its test kit says"
      ],
      "vectors": [
        {
          "name": "50 m³ pool, 60 to 100 ppm with bicarbonate",
          "inputs": {
            "volume": 50000,
            "currentTA": 60,
            "targetTA": 100,
            "cyanuricAcid": 40,
            "product": "bicarb"
          },
          "expected": 7.401784,
          "toleranceDecimalPlaces": 4,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Change asked for",
              "value": 40,
              "unit": "ppm"
            },
            {
              "label": "Carbonate alkalinity, cyanurate removed",
              "value": 46.666666666666664,
              "unit": "ppm"
            },
            {
              "label": "Alkalinity the cyanuric acid is reading as",
              "value": 13.333333333333334,
              "unit": "ppm"
            },
            {
              "label": "Dose per 10,000 gal per ppm",
              "value": 0.14009399752228843,
              "unit": "lb"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "The same pool taken down 20 ppm with muriatic acid",
          "inputs": {
            "volume": 50000,
            "currentTA": 120,
            "targetTA": 100,
            "cyanuricAcid": 40,
            "product": "muriatic"
          },
          "expected": 1.9966,
          "toleranceDecimalPlaces": 3,
          "unit": "litres",
          "confidence": "medium",
          "steps": [
            {
              "label": "The same, to measure out",
              "value": 67.5254837916193,
              "unit": "fl oz"
            },
            {
              "label": "Change asked for",
              "value": 20,
              "unit": "ppm"
            },
            {
              "label": "Carbonate alkalinity, cyanurate removed",
              "value": 106.66666666666667,
              "unit": "ppm"
            },
            {
              "label": "Alkalinity the cyanuric acid is reading as",
              "value": 13.333333333333334,
              "unit": "ppm"
            },
            {
              "label": "Dose per 10,000 gal per ppm",
              "value": 0.07559342001954851,
              "unit": "litres"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "The same drop taken with dry acid instead",
          "inputs": {
            "volume": 50000,
            "currentTA": 120,
            "targetTA": 100,
            "cyanuricAcid": 40,
            "product": "dryAcid"
          },
          "expected": 5.674814,
          "toleranceDecimalPlaces": 4,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Change asked for",
              "value": 20,
              "unit": "ppm"
            },
            {
              "label": "Carbonate alkalinity, cyanurate removed",
              "value": 106.66666666666667,
              "unit": "ppm"
            },
            {
              "label": "Alkalinity the cyanuric acid is reading as",
              "value": 13.333333333333334,
              "unit": "ppm"
            },
            {
              "label": "Dose per 10,000 gal per ppm",
              "value": 0.21481508436708566,
              "unit": "lb"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Bicarbonate cannot lower alkalinity, and says so",
          "inputs": {
            "volume": 50000,
            "currentTA": 140,
            "targetTA": 100,
            "cyanuricAcid": 40,
            "product": "bicarb"
          },
          "expected": 0,
          "toleranceDecimalPlaces": 3,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Change asked for",
              "value": 0,
              "unit": "ppm"
            },
            {
              "label": "Carbonate alkalinity, cyanurate removed",
              "value": 126.66666666666667,
              "unit": "ppm"
            },
            {
              "label": "Alkalinity the cyanuric acid is reading as",
              "value": 13.333333333333334,
              "unit": "ppm"
            },
            {
              "label": "Dose per 10,000 gal per ppm",
              "value": 0.14009399752228843,
              "unit": "lb"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "pool-backwash-water-calculator",
      "title": "Pool Filter Backwash Water Calculator",
      "url": "https://craftquantities.com/calculators/pools-water/pool-backwash-water-calculator/",
      "sources": [
        "Backwash volume is the flow through the filter for the backwash and the rinse together; a residential sand filter backwashes with its own pump reversed through the valve, so the flow is the pump's",
        "Hayward Pro Series sand filter owner's manual (S270T): backwash when the pressure gauge rises 8 to 10 psi (0.55 to 0.69 bar) above clean; backwash until the sight glass is clear, approximately 2 minutes or less; rinse about 1/2 to 1 minute",
        "Hayward Pro Series performance data: effective filtration areas from 1.75 to 7.06 sq ft (0.163 to 0.660 m²), design flow based on 20 GPM per sq ft (814 LPM per m²), the maximum allowable NSF rating",
        "CDC Model Aquatic Health Code, 2023, 5.7.2.2.2: granular media filters shall be backwashed at a rate of at least 15 GPM per square foot (36.7 m/h) of filter bed surface area unless the manufacturer's NSF/ANSI 50 listing specifies otherwise; 5.7.2.2.3, backwashing should continue until the water leaving the filter is clear"
      ],
      "vectors": [
        {
          "name": "60 gal/min for 2 minutes of backwash and 1 of rinse: 180 gallons",
          "inputs": {
            "flow": 227.124707,
            "filterArea": 0.2917155,
            "backwashMinutes": 2,
            "rinseMinutes": 1,
            "backwashesPerMonth": 2,
            "poolVolume": 50000,
            "salt": 3200,
            "cyanuricAcid": 50
          },
          "expected": 180,
          "toleranceDecimalPlaces": 3,
          "unit": "gallons",
          "confidence": "medium",
          "steps": [
            {
              "label": "Backwash rate over the bed",
              "value": 19.10828323835485,
              "unit": "gal/min per sq ft"
            },
            {
              "label": "Share of the pool replaced each month",
              "value": 2.725496484,
              "unit": "%"
            },
            {
              "label": "Water to waste each month",
              "value": 359.9999999365987,
              "unit": "gallons"
            },
            {
              "label": "Salt thrown away each backwash",
              "value": 4.80695296351656,
              "unit": "lb"
            },
            {
              "label": "Stabiliser thrown away each backwash",
              "value": 0.07510864005494625,
              "unit": "lb"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "300 L/min for 3 minutes and a half-minute rinse",
          "inputs": {
            "flow": 300,
            "filterArea": 0.345,
            "backwashMinutes": 3,
            "rinseMinutes": 0.5,
            "backwashesPerMonth": 4,
            "poolVolume": 75000,
            "salt": 0,
            "cyanuricAcid": 30
          },
          "expected": 277.3807,
          "toleranceDecimalPlaces": 3,
          "unit": "gallons",
          "confidence": "medium",
          "steps": [
            {
              "label": "Backwash rate over the bed",
              "value": 21.341205867053183,
              "unit": "gal/min per sq ft"
            },
            {
              "label": "Share of the pool replaced each month",
              "value": 5.6000000000000005,
              "unit": "%"
            },
            {
              "label": "Water to waste each month",
              "value": 1109.5226199042233,
              "unit": "gallons"
            },
            {
              "label": "Salt thrown away each backwash",
              "value": 0,
              "unit": "lb"
            },
            {
              "label": "Stabiliser thrown away each backwash",
              "value": 0.06944561258823644,
              "unit": "lb"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "pool-calcium-hardness-calculator",
      "title": "Pool Calcium Hardness Increaser Calculator",
      "url": "https://craftquantities.com/calculators/pools-water/pool-calcium-hardness-calculator/",
      "sources": [
        "Calcium hardness is reported as ppm of calcium carbonate (100.086 g/mol); one mole of calcium chloride supplies one mole of calcium, so 110.99 / 100.086 = 1.1089 mg of calcium chloride raises hardness by 1 ppm in a litre",
        "OxyChem Calcium Chloride Handbook: molecular weight 110.99 for anhydrous CaCl2 and 147.02 for the dihydrate, which is 75.49% CaCl2; commercial grades include 94 to 97% anhydrous pellets and 83 to 87% flake; calcium chloride has an exothermic heat of solution and solid products release a large amount of heat when dissolved",
        "Pentair IntelliChlor IC15 Installation and User's Guide: calcium hardness 200 to 300 ppm for pools and 150 to 200 for spas; saturation index -0.3 to +0.3",
        "Hayward AquaRite Operation and Installation Manual: calcium 200 to 400 ppm; calcium scale on the cell usually comes from old pool water and a high calcium level"
      ],
      "vectors": [
        {
          "name": "A 50 m³ pool from 150 to 250 ppm with 94% pellets",
          "inputs": {
            "volume": 50000,
            "currentHardness": 150,
            "targetHardness": 250,
            "content": 94
          },
          "expected": 13.004298,
          "toleranceDecimalPlaces": 3,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rise asked for",
              "value": 100,
              "unit": "ppm"
            },
            {
              "label": "Calcium chloride per litre per ppm (pure)",
              "value": 1.108946306176688,
              "unit": "mg"
            },
            {
              "label": "Product per 10,000 gal per 10 ppm",
              "value": 0.984532493682694,
              "unit": "lb"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "10 ppm in 10,000 US gallons with pure calcium chloride",
          "inputs": {
            "volume": 37854.11784,
            "currentHardness": 200,
            "targetHardness": 210,
            "content": 100
          },
          "expected": 0.925461,
          "toleranceDecimalPlaces": 4,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rise asked for",
              "value": 10,
              "unit": "ppm"
            },
            {
              "label": "Calcium chloride per litre per ppm (pure)",
              "value": 1.108946306176688,
              "unit": "mg"
            },
            {
              "label": "Product per 10,000 gal per 10 ppm",
              "value": 0.9254605440617324,
              "unit": "lb"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The hot tub guide's table: +10 ppm in 1,000 L is 11.1 g of anhydrous calcium chloride",
          "inputs": {
            "volume": 1000,
            "currentHardness": 150,
            "targetHardness": 160,
            "content": 100
          },
          "expected": 0.0244481,
          "toleranceDecimalPlaces": 6,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rise asked for",
              "value": 10,
              "unit": "ppm"
            },
            {
              "label": "Calcium chloride per litre per ppm (pure)",
              "value": 1.108946306176688,
              "unit": "mg"
            },
            {
              "label": "Product per 10,000 gal per 10 ppm",
              "value": 0.9254605440617324,
              "unit": "lb"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The same guide's 77% product: 14.4 g",
          "inputs": {
            "volume": 1000,
            "currentHardness": 150,
            "targetHardness": 160,
            "content": 77
          },
          "expected": 0.0317508,
          "toleranceDecimalPlaces": 6,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rise asked for",
              "value": 10,
              "unit": "ppm"
            },
            {
              "label": "Calcium chloride per litre per ppm (pure)",
              "value": 1.108946306176688,
              "unit": "mg"
            },
            {
              "label": "Product per 10,000 gal per 10 ppm",
              "value": 1.2018968104697823,
              "unit": "lb"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Above the target: nothing a dose can do",
          "inputs": {
            "volume": 50000,
            "currentHardness": 450,
            "targetHardness": 300,
            "content": 94
          },
          "expected": 0,
          "toleranceDecimalPlaces": 3,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rise asked for",
              "value": 0,
              "unit": "ppm"
            },
            {
              "label": "Calcium chloride per litre per ppm (pure)",
              "value": 1.108946306176688,
              "unit": "mg"
            },
            {
              "label": "Product per 10,000 gal per 10 ppm",
              "value": 0.984532493682694,
              "unit": "lb"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "pool-chlorine-calculator",
      "title": "Pool Chlorine Dose Calculator",
      "url": "https://craftquantities.com/calculators/pools-water/pool-chlorine-calculator/",
      "sources": [
        "Recommended free chlorine 1-3 ppm for residential pools — CDC Model Aquatic Health Code and WHO guidance",
        "1 ppm = 1 g per 1000 L. Product strengths: sodium hypochlorite 10-15% available chlorine; cal hypo 65-73%; dichlor 56%; trichlor 90%"
      ],
      "vectors": [
        {
          "name": "50 m³, 0.5 to 2 ppm, 12% liquid",
          "inputs": {
            "volume": 50000,
            "currentPpm": 0.5,
            "targetPpm": 2,
            "product": "liquid12"
          },
          "expected": 0.625,
          "toleranceDecimalPlaces": 2,
          "unit": "litres",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rise required",
              "value": 1.5,
              "unit": "ppm"
            },
            {
              "label": "Pure available chlorine",
              "value": 75,
              "unit": "g"
            },
            {
              "label": "Product volume",
              "value": 0.625,
              "unit": "L"
            },
            {
              "label": "Pool volume",
              "value": 50000,
              "unit": "L"
            },
            {
              "label": "Pool volume in US gallons",
              "value": 13208.6026,
              "unit": "gal"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Same rise with 68% cal hypo",
          "inputs": {
            "volume": 50000,
            "currentPpm": 0.5,
            "targetPpm": 2,
            "product": "calHypo"
          },
          "expected": 110.29,
          "toleranceDecimalPlaces": -1,
          "unit": "grams",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rise required",
              "value": 1.5,
              "unit": "ppm"
            },
            {
              "label": "Pure available chlorine",
              "value": 75,
              "unit": "g"
            },
            {
              "label": "Product",
              "value": 110.29411764705881,
              "unit": "g"
            },
            {
              "label": "Pool volume",
              "value": 50000,
              "unit": "L"
            },
            {
              "label": "Pool volume in US gallons",
              "value": 13208.6026,
              "unit": "gal"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Already at target needs nothing",
          "inputs": {
            "volume": 50000,
            "currentPpm": 2,
            "targetPpm": 2,
            "product": "liquid12"
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "litres",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rise required",
              "value": 0,
              "unit": "ppm"
            },
            {
              "label": "Pure available chlorine",
              "value": 0,
              "unit": "g"
            },
            {
              "label": "Product volume",
              "value": 0,
              "unit": "L"
            },
            {
              "label": "Pool volume",
              "value": 50000,
              "unit": "L"
            },
            {
              "label": "Pool volume in US gallons",
              "value": 13208.6026,
              "unit": "gal"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Double the pool, double the dose",
          "inputs": {
            "volume": 100000,
            "currentPpm": 0.5,
            "targetPpm": 2,
            "product": "liquid12"
          },
          "expected": 1.25,
          "toleranceDecimalPlaces": 1,
          "unit": "litres",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rise required",
              "value": 1.5,
              "unit": "ppm"
            },
            {
              "label": "Pure available chlorine",
              "value": 150,
              "unit": "g"
            },
            {
              "label": "Product volume",
              "value": 1.25,
              "unit": "L"
            },
            {
              "label": "Pool volume",
              "value": 100000,
              "unit": "L"
            },
            {
              "label": "Pool volume in US gallons",
              "value": 26417.2052,
              "unit": "gal"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "pool-drain-refill-calculator",
      "title": "Pool Partial Drain and Refill Calculator",
      "url": "https://craftquantities.com/calculators/pools-water/pool-drain-refill-calculator/",
      "sources": [
        "Dilution by replacement is a mass balance: draining a share f and refilling with water at level F takes a pool from C to (1 - f)C + fF, so f = (C - T) / (C - F); replacing water continuously, perfectly mixed, needs V x ln((C - F) / (T - F)) of fill water instead",
        "Hayward AquaRite Operation and Installation Manual: the only way to lower the salt concentration is to partially drain the pool and refill with fresh water; salt is lost only with water leaving the pool, not to evaporation",
        "CDC Model Aquatic Health Code, 2023, 5.7.3.1.3.2: the CYA level at all aquatic venues shall remain at or below 90 ppm — a limit that, once exceeded, is met by replacing water"
      ],
      "vectors": [
        {
          "name": "Stabiliser from 120 to 80 ppm with clean fill water: a third of 75 m³",
          "inputs": {
            "volume": 75000,
            "currentLevel": 120,
            "targetLevel": 80,
            "fillLevel": 0,
            "surfaceArea": 50
          },
          "expected": 6604.3,
          "toleranceDecimalPlaces": 1,
          "unit": "gallons",
          "confidence": "high",
          "steps": [
            {
              "label": "Share of the pool to replace",
              "value": 33.33333333333333,
              "unit": "%"
            },
            {
              "label": "Share for each of two equal stages",
              "value": 18.350341907227396,
              "unit": "%"
            },
            {
              "label": "Extra water if drained and filled at once",
              "value": 21.639532432449315,
              "unit": "%"
            },
            {
              "label": "Level drop over the surface",
              "value": 19.68503937007874,
              "unit": "in"
            },
            {
              "label": "Water used if drained and filled at once",
              "value": 8033.441232641423,
              "unit": "gallons"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Calcium from 450 to 300 with fill water at 150: half the pool",
          "inputs": {
            "volume": 75000,
            "currentLevel": 450,
            "targetLevel": 300,
            "fillLevel": 150,
            "surfaceArea": 50
          },
          "expected": 9906.45,
          "toleranceDecimalPlaces": 1,
          "unit": "gallons",
          "confidence": "high",
          "steps": [
            {
              "label": "Share of the pool to replace",
              "value": 50,
              "unit": "%"
            },
            {
              "label": "Share for each of two equal stages",
              "value": 29.28932188134524,
              "unit": "%"
            },
            {
              "label": "Extra water if drained and filled at once",
              "value": 38.62943611198906,
              "unit": "%"
            },
            {
              "label": "Level drop over the surface",
              "value": 29.52755905511811,
              "unit": "in"
            },
            {
              "label": "Water used if drained and filled at once",
              "value": 13733.258495608863,
              "unit": "gallons"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Fill water at the target: draining cannot reach it",
          "inputs": {
            "volume": 75000,
            "currentLevel": 450,
            "targetLevel": 300,
            "fillLevel": 300,
            "surfaceArea": 50
          },
          "expected": 0,
          "toleranceDecimalPlaces": 3,
          "unit": "gallons",
          "confidence": "high",
          "steps": [
            {
              "label": "Share of the pool to replace",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Share for each of two equal stages",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Extra water if drained and filled at once",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Level drop over the surface",
              "value": 0,
              "unit": "in"
            },
            {
              "label": "Water used if drained and filled at once",
              "value": 0,
              "unit": "gallons"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Salt from 4,000 to 3,200 ppm: a fifth, the manual's only remedy",
          "inputs": {
            "volume": 75000,
            "currentLevel": 4000,
            "targetLevel": 3200,
            "fillLevel": 0,
            "surfaceArea": 50
          },
          "expected": 3962.58,
          "toleranceDecimalPlaces": 1,
          "unit": "gallons",
          "confidence": "high",
          "steps": [
            {
              "label": "Share of the pool to replace",
              "value": 20,
              "unit": "%"
            },
            {
              "label": "Share for each of two equal stages",
              "value": 10.557280900008415,
              "unit": "%"
            },
            {
              "label": "Extra water if drained and filled at once",
              "value": 11.571775657104876,
              "unit": "%"
            },
            {
              "label": "Level drop over the surface",
              "value": 11.811023622047244,
              "unit": "in"
            },
            {
              "label": "Water used if drained and filled at once",
              "value": 4421.121744087045,
              "unit": "gallons"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "pool-heater-sizing-calculator",
      "title": "Pool Heater Sizing Calculator",
      "url": "https://craftquantities.com/calculators/pools-water/pool-heater-sizing-calculator/",
      "sources": [
        "Specific heat capacity of water 4.186 kJ/kg·K; 1 m³ of water = 1000 kg",
        "Evaporation is the dominant heat loss from an uncovered pool, typically 50-70% of the total — ASHRAE Handbook, Applications: Natatoriums"
      ],
      "vectors": [
        {
          "name": "50 m³, 8 K rise over 24 h, covered",
          "inputs": {
            "volume": 50000,
            "temperatureRise": 8,
            "heatUpHours": 24,
            "covered": "yes"
          },
          "expected": 22.71,
          "toleranceDecimalPlaces": 1,
          "unit": "kW",
          "confidence": "low",
          "steps": [
            {
              "label": "Energy to raise the water",
              "value": 465.1111111111111,
              "unit": "kWh"
            },
            {
              "label": "Heat-up power",
              "value": 19.37962962962963,
              "unit": "kW"
            },
            {
              "label": "Standing loss allowance",
              "value": 3.333333333333334,
              "unit": "kW"
            },
            {
              "label": "BTU/h",
              "value": 77499.8465376195,
              "unit": "BTU/h"
            },
            {
              "label": "Approximate surface area used",
              "value": 33.333333333333336,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Uncovered raises the standing loss",
          "inputs": {
            "volume": 50000,
            "temperatureRise": 8,
            "heatUpHours": 24,
            "covered": "no"
          },
          "expected": 29.37,
          "toleranceDecimalPlaces": 0,
          "unit": "kW",
          "confidence": "low",
          "steps": [
            {
              "label": "Energy to raise the water",
              "value": 465.1111111111111,
              "unit": "kWh"
            },
            {
              "label": "Heat-up power",
              "value": 19.37962962962963,
              "unit": "kW"
            },
            {
              "label": "Standing loss allowance",
              "value": 10,
              "unit": "kW"
            },
            {
              "label": "BTU/h",
              "value": 100247.45742513928,
              "unit": "BTU/h"
            },
            {
              "label": "Approximate surface area used",
              "value": 33.333333333333336,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A slower heat-up needs less power",
          "inputs": {
            "volume": 50000,
            "temperatureRise": 8,
            "heatUpHours": 48,
            "covered": "yes"
          },
          "expected": 13.0231,
          "toleranceDecimalPlaces": 2,
          "unit": "kW",
          "confidence": "low",
          "steps": [
            {
              "label": "Energy to raise the water",
              "value": 465.1111111111111,
              "unit": "kWh"
            },
            {
              "label": "Heat-up power",
              "value": 9.689814814814815,
              "unit": "kW"
            },
            {
              "label": "Standing loss allowance",
              "value": 3.333333333333334,
              "unit": "kW"
            },
            {
              "label": "BTU/h",
              "value": 44436.82599068969,
              "unit": "BTU/h"
            },
            {
              "label": "Approximate surface area used",
              "value": 33.333333333333336,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A larger pool needs more",
          "inputs": {
            "volume": 100000,
            "temperatureRise": 8,
            "heatUpHours": 24,
            "covered": "yes"
          },
          "expected": 45.43,
          "toleranceDecimalPlaces": 1,
          "unit": "kW",
          "confidence": "low",
          "steps": [
            {
              "label": "Energy to raise the water",
              "value": 930.2222222222222,
              "unit": "kWh"
            },
            {
              "label": "Heat-up power",
              "value": 38.75925925925926,
              "unit": "kW"
            },
            {
              "label": "Standing loss allowance",
              "value": 6.666666666666668,
              "unit": "kW"
            },
            {
              "label": "BTU/h",
              "value": 154999.693075239,
              "unit": "BTU/h"
            },
            {
              "label": "Approximate surface area used",
              "value": 66.66666666666667,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "pool-ph-adjustment-calculator",
      "title": "Pool pH Adjustment Calculator (Acid or Soda Ash)",
      "url": "https://craftquantities.com/calculators/pools-water/pool-ph-adjustment-calculator/",
      "sources": [
        "Wojtowicz, J.A., The Carbonate System in Swimming Pool Water, Journal of the Swimming Pool and Spa Industry 4(1) (2001) 54-59: Davies activity coefficients with ionic strength 2.5 x 10^-5 x TDS; Plummer and Busenberg's temperature equations for K1 and K2; carbonate alkalinity CT(a1 + 2a2)",
        "Wojtowicz, J.A., Swimming Pool Water Balance Part 1: the effect of cyanuric acid and other interferences on carbonate alkalinity measurement, JSPSI 1(1) (1995) 7-13: the first ionisation constant of cyanuric acid, 1.47 x 10^-7 at 80 F and zero TDS; cyanurate is titrated as alkalinity",
        "Wojtowicz, J.A., Swimming Pool Water Buffer Chemistry, JSPSI 3(2): buffer intensity of 0.002 M bicarbonate and cyanurate at pH 7.5, 80 F and 1,000 ppm TDS is 12.9 and 30.4 ppm as CaCO3 per pH unit — the figures this page's model reproduces",
        "Doses by equivalents: hydrochloric acid 36.458 g per equivalent, taken as 31.45% HCl at a specific gravity of 1.16; sodium bisulfate 120.06 g per equivalent at 93.2%; sodium carbonate 105.99 g per mole, adding two equivalents of alkalinity and one mole of carbonate"
      ],
      "vectors": [
        {
          "name": "50 m³ from pH 7.8 to 7.5 at 100 ppm alkalinity and 30 ppm stabiliser, with muriatic acid",
          "inputs": {
            "volume": 50000,
            "currentPh": 7.8,
            "targetPh": 7.5,
            "totalAlkalinity": 100,
            "cyanuricAcid": 30,
            "temperature": 27,
            "tds": 1000,
            "product": "muriatic"
          },
          "expected": 0.355051,
          "toleranceDecimalPlaces": 4,
          "unit": "litres",
          "confidence": "medium",
          "steps": [
            {
              "label": "The same, to measure out",
              "value": 12.005705377460252,
              "unit": "fl oz"
            },
            {
              "label": "Total alkalinity afterwards",
              "value": 96.44409644971685,
              "unit": "ppm"
            },
            {
              "label": "Carbonate alkalinity, stabiliser taken out",
              "value": 89.35744722762381,
              "unit": "ppm"
            },
            {
              "label": "Dissolved carbon dioxide now",
              "value": 2.3371399015661747,
              "unit": "ppm"
            },
            {
              "label": "Carbon dioxide aeration would drive off instead",
              "value": 0,
              "unit": "ppm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The same change with dry acid",
          "inputs": {
            "volume": 50000,
            "currentPh": 7.8,
            "targetPh": 7.5,
            "totalAlkalinity": 100,
            "cyanuricAcid": 30,
            "temperature": 27,
            "tds": 1000,
            "product": "dryAcid"
          },
          "expected": 1.009005,
          "toleranceDecimalPlaces": 4,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total alkalinity afterwards",
              "value": 96.44409644971685,
              "unit": "ppm"
            },
            {
              "label": "Carbonate alkalinity, stabiliser taken out",
              "value": 89.35744722762381,
              "unit": "ppm"
            },
            {
              "label": "Dissolved carbon dioxide now",
              "value": 2.3371399015661747,
              "unit": "ppm"
            },
            {
              "label": "Carbon dioxide aeration would drive off instead",
              "value": 0,
              "unit": "ppm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "Raising 7.2 to 7.5 at 80 ppm alkalinity with soda ash",
          "inputs": {
            "volume": 50000,
            "currentPh": 7.2,
            "targetPh": 7.5,
            "totalAlkalinity": 80,
            "cyanuricAcid": 30,
            "temperature": 27,
            "tds": 1000,
            "product": "sodaAsh"
          },
          "expected": 1.203857,
          "toleranceDecimalPlaces": 4,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total alkalinity afterwards",
              "value": 90.31285552053755,
              "unit": "ppm"
            },
            {
              "label": "Carbonate alkalinity, stabiliser taken out",
              "value": 71.50961242555984,
              "unit": "ppm"
            },
            {
              "label": "Dissolved carbon dioxide now",
              "value": 7.499406043394248,
              "unit": "ppm"
            },
            {
              "label": "Carbon dioxide aeration would drive off instead",
              "value": 5.053793240550589,
              "unit": "ppm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "10,000 US gallons, no stabiliser, 7.8 to 7.4 at 25 °C",
          "inputs": {
            "volume": 37854.11784,
            "currentPh": 7.8,
            "targetPh": 7.4,
            "totalAlkalinity": 100,
            "cyanuricAcid": 0,
            "temperature": 25,
            "tds": 1000,
            "product": "muriatic"
          },
          "expected": 0.34609,
          "toleranceDecimalPlaces": 4,
          "unit": "litres",
          "confidence": "medium",
          "steps": [
            {
              "label": "The same, to measure out",
              "value": 11.702680557031849,
              "unit": "fl oz"
            },
            {
              "label": "Total alkalinity afterwards",
              "value": 95.42169716194375,
              "unit": "ppm"
            },
            {
              "label": "Carbonate alkalinity, stabiliser taken out",
              "value": 99.99999999999999,
              "unit": "ppm"
            },
            {
              "label": "Dissolved carbon dioxide now",
              "value": 2.678681231351494,
              "unit": "ppm"
            },
            {
              "label": "Carbon dioxide aeration would drive off instead",
              "value": 0,
              "unit": "ppm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Soda ash cannot lower pH, and says so",
          "inputs": {
            "volume": 50000,
            "currentPh": 7.8,
            "targetPh": 7.5,
            "totalAlkalinity": 100,
            "cyanuricAcid": 30,
            "temperature": 27,
            "tds": 1000,
            "product": "sodaAsh"
          },
          "expected": 0,
          "toleranceDecimalPlaces": 3,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total alkalinity afterwards",
              "value": 99.99999999999999,
              "unit": "ppm"
            },
            {
              "label": "Carbonate alkalinity, stabiliser taken out",
              "value": 89.35744722762381,
              "unit": "ppm"
            },
            {
              "label": "Dissolved carbon dioxide now",
              "value": 2.3371399015661747,
              "unit": "ppm"
            },
            {
              "label": "Carbon dioxide aeration would drive off instead",
              "value": 0,
              "unit": "ppm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "pool-pump-turnover-calculator",
      "title": "Pool Pump Turnover Calculator",
      "url": "https://craftquantities.com/calculators/pools-water/pool-pump-turnover-calculator/",
      "sources": [
        "Residential pools are commonly designed for one to two complete turnovers per day — APSP/PHTA design standards",
        "Turnover rate = pool volume ÷ desired turnover time"
      ],
      "vectors": [
        {
          "name": "50 m³, one turnover, 8 hours",
          "inputs": {
            "volume": 50000,
            "turnoversPerDay": 1,
            "runHours": 8
          },
          "expected": 104.1667,
          "toleranceDecimalPlaces": 1,
          "unit": "L/min",
          "confidence": "high",
          "steps": [
            {
              "label": "Flow rate in m³/hr (metric filter and pump rating basis)",
              "value": 6.25,
              "unit": "m³/hr"
            },
            {
              "label": "Volume circulated per day",
              "value": 50,
              "unit": "m³"
            },
            {
              "label": "Turnover time",
              "value": 8,
              "unit": "hours"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Two turnovers doubles the flow",
          "inputs": {
            "volume": 50000,
            "turnoversPerDay": 2,
            "runHours": 8
          },
          "expected": 208.3333,
          "toleranceDecimalPlaces": 1,
          "unit": "L/min",
          "confidence": "high",
          "steps": [
            {
              "label": "Flow rate in m³/hr (metric filter and pump rating basis)",
              "value": 12.5,
              "unit": "m³/hr"
            },
            {
              "label": "Volume circulated per day",
              "value": 100,
              "unit": "m³"
            },
            {
              "label": "Turnover time",
              "value": 4,
              "unit": "hours"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Running longer lowers the flow needed",
          "inputs": {
            "volume": 50000,
            "turnoversPerDay": 1,
            "runHours": 16
          },
          "expected": 52.0833,
          "toleranceDecimalPlaces": 1,
          "unit": "L/min",
          "confidence": "high",
          "steps": [
            {
              "label": "Flow rate in m³/hr (metric filter and pump rating basis)",
              "value": 3.125,
              "unit": "m³/hr"
            },
            {
              "label": "Volume circulated per day",
              "value": 50,
              "unit": "m³"
            },
            {
              "label": "Turnover time",
              "value": 16,
              "unit": "hours"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A bigger pool needs more flow",
          "inputs": {
            "volume": 100000,
            "turnoversPerDay": 1,
            "runHours": 8
          },
          "expected": 208.3333,
          "toleranceDecimalPlaces": 0,
          "unit": "L/min",
          "confidence": "high",
          "steps": [
            {
              "label": "Flow rate in m³/hr (metric filter and pump rating basis)",
              "value": 12.5,
              "unit": "m³/hr"
            },
            {
              "label": "Volume circulated per day",
              "value": 100,
              "unit": "m³"
            },
            {
              "label": "Turnover time",
              "value": 8,
              "unit": "hours"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "pool-salt-calculator",
      "title": "Pool Salt Calculator (Salt Chlorine Generator)",
      "url": "https://craftquantities.com/calculators/pools-water/pool-salt-calculator/",
      "sources": [
        "Salt is read as parts per million of sodium chloride, which is milligrams per litre, so the salt to add is the rise times the pool's litres divided by the salt's purity — the basis of the makers' own addition tables",
        "Hayward AquaRite Operation and Installation Manual: ideal salt 2,700 to 3,400 ppm with 3,200 optimal; salt begins to be tasted at about 3,500 to 4,000 ppm; use sodium chloride over 99% pure, never rock salt, salt with yellow prussiate of soda, anti-caking additives or iodised salt; the only way to lower salt is to partially drain and refill",
        "Pentair IntelliChlor IC15 Installation and User's Guide: 3,000 to 3,500 ppm recommended for optimum water conditions; below 2,600 ppm the unit turns off; above 4,500 ppm may cause excessive corrosion; use salt at least 99.8% pure sodium chloride, with no anti-caking agent (sodium ferrocyanide, YPS)"
      ],
      "vectors": [
        {
          "name": "Hayward's own table: 10,000 gal from 0 to 3,200 ppm is 267 lb",
          "inputs": {
            "volume": 37854.11784,
            "currentSalt": 0,
            "targetSalt": 3200,
            "purity": 100,
            "bag": "bag1"
          },
          "expected": 267.05,
          "toleranceDecimalPlaces": 1,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rise asked for",
              "value": 3200,
              "unit": "ppm"
            },
            {
              "label": "40 lb bags",
              "value": 7,
              "unit": "bags"
            },
            {
              "label": "Share of the pool to drain, if lowering",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Salt per 10,000 gal per 100 ppm",
              "value": 8.34540445201933,
              "unit": "lb"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A 50 m³ pool topped up from 2,400 to 3,200 ppm with 99.8% salt",
          "inputs": {
            "volume": 50000,
            "currentSalt": 2400,
            "targetSalt": 3200,
            "purity": 99.8,
            "bag": "bag1"
          },
          "expected": 88.362,
          "toleranceDecimalPlaces": 2,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rise asked for",
              "value": 800,
              "unit": "ppm"
            },
            {
              "label": "40 lb bags",
              "value": 3,
              "unit": "bags"
            },
            {
              "label": "Share of the pool to drain, if lowering",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Salt per 10,000 gal per 100 ppm",
              "value": 8.362128709438208,
              "unit": "lb"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A new 50 m³ salt pool from 0 to 3,200 ppm, counted in the larger bag (80 lb; 20 kg in metric)",
          "inputs": {
            "volume": 50000,
            "currentSalt": 0,
            "targetSalt": 3200,
            "purity": 99.8,
            "bag": "bag2"
          },
          "expected": 353.446513,
          "toleranceDecimalPlaces": 3,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rise asked for",
              "value": 3200,
              "unit": "ppm"
            },
            {
              "label": "80 lb bags",
              "value": 5,
              "unit": "bags"
            },
            {
              "label": "Share of the pool to drain, if lowering",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Salt per 10,000 gal per 100 ppm",
              "value": 8.362128709438208,
              "unit": "lb"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "Above the target: nothing to add, and the drain share instead",
          "inputs": {
            "volume": 50000,
            "currentSalt": 4000,
            "targetSalt": 3200,
            "purity": 99.8,
            "bag": "bag1"
          },
          "expected": 0,
          "toleranceDecimalPlaces": 3,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rise asked for",
              "value": 0,
              "unit": "ppm"
            },
            {
              "label": "40 lb bags",
              "value": 0,
              "unit": "bags"
            },
            {
              "label": "Share of the pool to drain, if lowering",
              "value": 20,
              "unit": "%"
            },
            {
              "label": "Salt per 10,000 gal per 100 ppm",
              "value": 8.362128709438208,
              "unit": "lb"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "pool-shell-volume-calculator",
      "title": "In-Ground Concrete Pool Shell Volume Calculator",
      "url": "https://craftquantities.com/calculators/pools-water/pool-shell-volume-calculator/",
      "sources": [
        "Shell surface area = floor area + wall area = (Length x Width) + 2x(Length + Width) x Wall Height; Shell volume = Shell surface area x Shell thickness — a standard method for estimating gunite/shotcrete shell material for a simple rectangular pool. This is DISTINCT from this site's existing pool-volume-calculator, which computes the pool's WATER capacity for chemical dosing, not the concrete shell structure itself."
      ],
      "vectors": [
        {
          "name": "10x5m pool, 1.5m wall height, 0.15m shell",
          "inputs": {
            "poolLength": 10,
            "poolWidth": 5,
            "wallHeight": 1.5,
            "shellThickness": 0.15
          },
          "expected": 14.25,
          "toleranceDecimalPlaces": 1,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Shell surface area (floor + walls)",
              "value": 95,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "12x6m pool, 1.8m wall height, 0.2m shell",
          "inputs": {
            "poolLength": 12,
            "poolWidth": 6,
            "wallHeight": 1.8,
            "shellThickness": 0.2
          },
          "expected": 27.36,
          "toleranceDecimalPlaces": 1,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Shell surface area (floor + walls)",
              "value": 136.8,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "pool-solar-cover-calculator",
      "title": "Pool Cover & Liner Area Calculator",
      "url": "https://craftquantities.com/calculators/pools-water/pool-solar-cover-calculator/",
      "sources": [
        "Solar covers are cut to the water surface; overlapping the coping traps debris and shortens cover life",
        "Liner area = floor + walls, plus an allowance for the bead track and floor radius"
      ],
      "vectors": [
        {
          "name": "8 × 4 m cover",
          "inputs": {
            "length": 8,
            "width": 4,
            "averageDepth": 1.5,
            "item": "cover"
          },
          "expected": 32,
          "toleranceDecimalPlaces": 0,
          "unit": "m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Water surface",
              "value": 32,
              "unit": "m²"
            },
            {
              "label": "Wall area",
              "value": 36,
              "unit": "m²"
            },
            {
              "label": "Liner area with 8% allowance",
              "value": 73.44,
              "unit": "m²"
            },
            {
              "label": "Water volume",
              "value": 48,
              "unit": "m³"
            },
            {
              "label": "Area in ft²",
              "value": 344.4451333347111,
              "unit": "ft²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Same pool as a liner",
          "inputs": {
            "length": 8,
            "width": 4,
            "averageDepth": 1.5,
            "item": "liner"
          },
          "expected": 73.44,
          "toleranceDecimalPlaces": 2,
          "unit": "m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Water surface",
              "value": 32,
              "unit": "m²"
            },
            {
              "label": "Wall area",
              "value": 36,
              "unit": "m²"
            },
            {
              "label": "Liner area with 8% allowance",
              "value": 73.44,
              "unit": "m²"
            },
            {
              "label": "Water volume",
              "value": 48,
              "unit": "m³"
            },
            {
              "label": "Area in ft²",
              "value": 790.501581003162,
              "unit": "ft²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A deeper pool needs more liner but the same cover",
          "inputs": {
            "length": 8,
            "width": 4,
            "averageDepth": 2,
            "item": "liner"
          },
          "expected": 86.4,
          "toleranceDecimalPlaces": 2,
          "unit": "m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Water surface",
              "value": 32,
              "unit": "m²"
            },
            {
              "label": "Wall area",
              "value": 48,
              "unit": "m²"
            },
            {
              "label": "Liner area with 8% allowance",
              "value": 86.4,
              "unit": "m²"
            },
            {
              "label": "Water volume",
              "value": 64,
              "unit": "m³"
            },
            {
              "label": "Area in ft²",
              "value": 930.00186000372,
              "unit": "ft²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A larger surface",
          "inputs": {
            "length": 12,
            "width": 6,
            "averageDepth": 1.5,
            "item": "cover"
          },
          "expected": 72,
          "toleranceDecimalPlaces": 0,
          "unit": "m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Water surface",
              "value": 72,
              "unit": "m²"
            },
            {
              "label": "Wall area",
              "value": 54,
              "unit": "m²"
            },
            {
              "label": "Liner area with 8% allowance",
              "value": 136.08,
              "unit": "m²"
            },
            {
              "label": "Water volume",
              "value": 108,
              "unit": "m³"
            },
            {
              "label": "Area in ft²",
              "value": 775.0015500031,
              "unit": "ft²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "The same liner with no allowance",
          "inputs": {
            "length": 8,
            "width": 4,
            "averageDepth": 1.5,
            "item": "liner",
            "linerAllowancePercent": 0
          },
          "expected": 68,
          "toleranceDecimalPlaces": 2,
          "unit": "m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Water surface",
              "value": 32,
              "unit": "m²"
            },
            {
              "label": "Wall area",
              "value": 36,
              "unit": "m²"
            },
            {
              "label": "Liner area with 0% allowance",
              "value": 68,
              "unit": "m²"
            },
            {
              "label": "Water volume",
              "value": 48,
              "unit": "m³"
            },
            {
              "label": "Area in ft²",
              "value": 731.9459083362611,
              "unit": "ft²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "pool-stabilizer-calculator",
      "title": "Pool Stabilizer (Cyanuric Acid) Calculator",
      "url": "https://craftquantities.com/calculators/pools-water/pool-stabilizer-calculator/",
      "sources": [
        "Cyanuric acid is read in ppm, which is milligrams per litre, so the stabiliser to add is the rise times the pool's litres divided by the product's cyanuric acid content",
        "CDC Model Aquatic Health Code, 2023: 5.7.3.1.3.2, the CYA level at all aquatic venues shall remain at or below 90 ppm; 5.7.3.1.1.2.2, venues using CYA maintain free chlorine of at least 2.0 ppm; 5.7.3.1.3.1, no CYA in spas and therapy pools for new construction; 6.6.3, a CYA to free chlorine ratio above 45:1 is an imminent health hazard",
        "Pentair IntelliChlor IC15 Installation and User's Guide: cyanuric acid is needed in outdoor pools; 90% of unstabilised chlorine is destroyed by the sun's UV within two hours; keep 30 to 50 ppm with a salt chlorine generator; do not use cyanuric acid in indoor pools",
        "Stabilised chlorine carries cyanuric acid in: one mole of trichloroisocyanuric acid releases three moles of chlorine (as Cl2, 70.906 g/mol) and one of cyanuric acid (129.07 g/mol); sodium dichloroisocyanurate releases two and one"
      ],
      "vectors": [
        {
          "name": "The label rule: one pound in 4,000 US gallons gives 30 ppm",
          "inputs": {
            "volume": 15141.647136,
            "currentCya": 0,
            "targetCya": 30,
            "purity": 100,
            "chlorineSource": "unstabilized"
          },
          "expected": 1.001448,
          "toleranceDecimalPlaces": 4,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rise asked for",
              "value": 30,
              "unit": "ppm"
            },
            {
              "label": "Least free chlorine at this level (45:1, and 2.0 ppm floor)",
              "value": 2,
              "unit": "ppm"
            },
            {
              "label": "Stabiliser added by each 10 ppm of chlorine from your source",
              "value": 0,
              "unit": "ppm"
            },
            {
              "label": "Share of the pool to drain, if lowering",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Stabiliser per 10,000 gal per 10 ppm",
              "value": 0.834540445201933,
              "unit": "lb"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A 50 m³ pool from 0 to 40 ppm with 99% granular",
          "inputs": {
            "volume": 50000,
            "currentCya": 0,
            "targetCya": 40,
            "purity": 99,
            "chlorineSource": "unstabilized"
          },
          "expected": 4.453766,
          "toleranceDecimalPlaces": 4,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rise asked for",
              "value": 40,
              "unit": "ppm"
            },
            {
              "label": "Least free chlorine at this level (45:1, and 2.0 ppm floor)",
              "value": 2,
              "unit": "ppm"
            },
            {
              "label": "Stabiliser added by each 10 ppm of chlorine from your source",
              "value": 0,
              "unit": "ppm"
            },
            {
              "label": "Share of the pool to drain, if lowering",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Stabiliser per 10,000 gal per 10 ppm",
              "value": 0.8429701466686191,
              "unit": "lb"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A dichlor pool of 75 m³ from 20 to 50 ppm with pure stabiliser",
          "inputs": {
            "volume": 75000,
            "currentCya": 20,
            "targetCya": 50,
            "purity": 100,
            "chlorineSource": "dichlor"
          },
          "expected": 4.960401,
          "toleranceDecimalPlaces": 4,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rise asked for",
              "value": 30,
              "unit": "ppm"
            },
            {
              "label": "Least free chlorine at this level (45:1, and 2.0 ppm floor)",
              "value": 2,
              "unit": "ppm"
            },
            {
              "label": "Stabiliser added by each 10 ppm of chlorine from your source",
              "value": 9.101486475051475,
              "unit": "ppm"
            },
            {
              "label": "Share of the pool to drain, if lowering",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Stabiliser per 10,000 gal per 10 ppm",
              "value": 0.834540445201933,
              "unit": "lb"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "Already at 120 ppm with a 60 ppm target: nothing to add",
          "inputs": {
            "volume": 50000,
            "currentCya": 120,
            "targetCya": 60,
            "purity": 99,
            "chlorineSource": "trichlor"
          },
          "expected": 0,
          "toleranceDecimalPlaces": 3,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rise asked for",
              "value": 0,
              "unit": "ppm"
            },
            {
              "label": "Least free chlorine at this level (45:1, and 2.0 ppm floor)",
              "value": 2.6666666666666665,
              "unit": "ppm"
            },
            {
              "label": "Stabiliser added by each 10 ppm of chlorine from your source",
              "value": 6.067657650034317,
              "unit": "ppm"
            },
            {
              "label": "Share of the pool to drain, if lowering",
              "value": 50,
              "unit": "%"
            },
            {
              "label": "Stabiliser per 10,000 gal per 10 ppm",
              "value": 0.8429701466686191,
              "unit": "lb"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "pool-volume-calculator",
      "title": "Pool Volume Calculator (Rectangular, Round, Oval or Kidney)",
      "url": "https://craftquantities.com/calculators/pools-water/pool-volume-calculator/",
      "sources": [
        "Pool volume (gallons) = length x width x average depth (all in ft) x 7.4805 US gallons per cubic ft, the exact 1,728 ÷ 231 (a US gallon is 231 cubic inches)",
        "Pool & Hot Tub Alliance (PHTA), Pool & Spa Operator Handbook (© 2021), Appendix B-4, Conversion & Calculation Guide: Average Depth = (Shallow Depth + Deep Depth) ÷ 2; Volume Circle (gallons) = 3.14 × radius × radius × Avg. Depth × 7.5; Volume Oval (gallons) = Short Radius × Long Radius × 3.14 × Avg. Depth × 7.5; Volume Kidney (gallons) = (Width A + Width B) × Length × 0.45 × Avg. Depth × 7.5, dimensions in feet, with a reference to the handbook's Figure 3-3 for the kidney (not reproduced here). This page uses π for 3.14 and the exact 7.4805 US gallons per cubic foot for 7.5",
        "Hayward, Chemistry Quick Start Guide (092510 Rev A), Step 1, Calculate Pool Volume: rectangular L × W × average depth × 7.5 (gallons, feet) or × 1000 (litres, metres); round D × D × average depth × 5.9 or × 785; oval L × W × average depth × 6.7 or × 893",
        "Plane geometry of an oval with straight sides: two half-circles of diameter W joined by a W × (L − W) rectangle cover W(L − W) + πW²/4, which at L = 2W is (1 + π/4)/2 = 0.893 of L × W; 0.893 × 7.5 = 6.70, which matches, to the figures printed, the 6.7 Hayward's guide gives an oval (Hayward does not say which oval it means)"
      ],
      "vectors": [
        {
          "name": "10x5m pool, 1.5m avg depth",
          "inputs": {
            "poolLength": 10,
            "poolWidth": 5,
            "avgDepth": 1.5
          },
          "expected": 19812.904,
          "toleranceDecimalPlaces": 2,
          "unit": "gallons",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume in cubic feet",
              "value": 2648.6000041116445,
              "unit": "ft³"
            },
            {
              "label": "Water surface area",
              "value": 50.00000000000001,
              "unit": "m²"
            },
            {
              "label": "Depth the volume is worked at",
              "value": 1.5000000000000002,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "8x4m pool, 1.2m avg depth",
          "inputs": {
            "poolLength": 8,
            "poolWidth": 4,
            "avgDepth": 1.2
          },
          "expected": 10144.207,
          "toleranceDecimalPlaces": 2,
          "unit": "gallons",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume in cubic feet",
              "value": 1356.0832021051615,
              "unit": "ft³"
            },
            {
              "label": "Water surface area",
              "value": 31.999999999999996,
              "unit": "m²"
            },
            {
              "label": "Depth the volume is worked at",
              "value": 1.2,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Round pool, 5.5 m across, 1.2 m deep",
          "inputs": {
            "shape": "round",
            "poolDiameter": 5.5,
            "floor": "flat",
            "avgDepth": 1.2
          },
          "expected": 7531.533,
          "toleranceDecimalPlaces": 2,
          "unit": "gallons",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume in cubic feet",
              "value": 1006.8195001410195,
              "unit": "ft³"
            },
            {
              "label": "Water surface area",
              "value": 23.758294442772815,
              "unit": "m²"
            },
            {
              "label": "Depth the volume is worked at",
              "value": 1.2,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "True ellipse, 9 x 4.5 m, 1.5 m deep",
          "inputs": {
            "shape": "oval",
            "ovalLong": 9,
            "ovalShort": 4.5,
            "floor": "flat",
            "avgDepth": 1.5
          },
          "expected": 12604.425,
          "toleranceDecimalPlaces": 2,
          "unit": "gallons",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume in cubic feet",
              "value": 1684.9665188310448,
              "unit": "ft³"
            },
            {
              "label": "Water surface area",
              "value": 31.808625617596654,
              "unit": "m²"
            },
            {
              "label": "Depth the volume is worked at",
              "value": 1.5000000000000002,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Oval with straight sides, 9 x 4.5 m, 1.5 m deep",
          "inputs": {
            "shape": "straight-oval",
            "straightOvalLong": 9,
            "straightOvalShort": 4.5,
            "floor": "flat",
            "avgDepth": 1.5
          },
          "expected": 14326.439,
          "toleranceDecimalPlaces": 2,
          "unit": "gallons",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume in cubic feet",
              "value": 1915.1662610807384,
              "unit": "ft³"
            },
            {
              "label": "Water surface area",
              "value": 36.15431280879833,
              "unit": "m²"
            },
            {
              "label": "Depth the volume is worked at",
              "value": 1.5000000000000002,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "Kidney, 9 m long, lobes 4.5 m and 3.5 m, 1.5 m deep",
          "inputs": {
            "shape": "kidney",
            "kidneyLong": 9,
            "kidneyLobeA": 4.5,
            "kidneyLobeB": 3.5,
            "floor": "flat",
            "avgDepth": 1.5
          },
          "expected": 12838.762,
          "toleranceDecimalPlaces": 2,
          "unit": "gallons",
          "confidence": "medium",
          "steps": [
            {
              "label": "Volume in cubic feet",
              "value": 1716.2928026643451,
              "unit": "ft³"
            },
            {
              "label": "Water surface area",
              "value": 32.4,
              "unit": "m²"
            },
            {
              "label": "Depth the volume is worked at",
              "value": 1.5000000000000002,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "10 x 5 m rectangle sloping from 1.0 m to 2.0 m: the same water as 1.5 m throughout",
          "inputs": {
            "shape": "rectangle",
            "poolLength": 10,
            "poolWidth": 5,
            "floor": "sloped",
            "shallowEnd": 1,
            "deepEnd": 2
          },
          "expected": 19812.904,
          "toleranceDecimalPlaces": 2,
          "unit": "gallons",
          "confidence": "medium",
          "steps": [
            {
              "label": "Volume in cubic feet",
              "value": 2648.600004111644,
              "unit": "ft³"
            },
            {
              "label": "Water surface area",
              "value": 50.00000000000001,
              "unit": "m²"
            },
            {
              "label": "Depth the volume is worked at",
              "value": 1.4999999999999998,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "post-bearing-area-calculator",
      "title": "Timber Post Bearing Area Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/post-bearing-area-calculator/",
      "sources": [
        "Required bearing area = axial load ÷ allowable compression stress perpendicular to grain (Fc-perp), the standard NDS timber bearing check"
      ],
      "vectors": [
        {
          "name": "40kN load, 3.0MPa Fc-perp",
          "inputs": {
            "axialLoad": 40000,
            "allowableBearingStress": 3000000
          },
          "expected": 133.33,
          "toleranceDecimalPlaces": 2,
          "unit": "cm²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "60kN load, 3.5MPa Fc-perp",
          "inputs": {
            "axialLoad": 60000,
            "allowableBearingStress": 3500000
          },
          "expected": 171.43,
          "toleranceDecimalPlaces": 2,
          "unit": "cm²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "post-hole-concrete-calculator",
      "title": "Post Hole Concrete Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/post-hole-concrete-calculator/",
      "sources": [
        "Common practice: hole diameter three times the post width; embedment one third of the above-ground height, or below frost depth where that is deeper",
        "IRC R403.1.4 requires footings below the local frost line — the governing figure where ground freezes"
      ],
      "vectors": [
        {
          "name": "300 mm × 600 mm holes, 100 mm post, 10 posts",
          "inputs": {
            "holeDiameter": 0.3,
            "holeDepth": 0.6,
            "postWidth": 0.1,
            "postCount": 10,
            "bagSize": "20"
          },
          "expected": 0.364,
          "toleranceDecimalPlaces": 2,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Per hole",
              "value": 0.03641150082346221,
              "unit": "m³"
            },
            {
              "label": "Bags required",
              "value": 39,
              "unit": "bags"
            },
            {
              "label": "Post displacement deducted",
              "value": 0.06000000000000001,
              "unit": "m³"
            },
            {
              "label": "Cubic yards",
              "value": 0.47624445052213893,
              "unit": "yd³"
            },
            {
              "label": "Approximate weight",
              "value": 873.8760197630929,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A single hole",
          "inputs": {
            "holeDiameter": 0.3,
            "holeDepth": 0.6,
            "postWidth": 0.1,
            "postCount": 1,
            "bagSize": "20"
          },
          "expected": 0.0364,
          "toleranceDecimalPlaces": 3,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Per hole",
              "value": 0.03641150082346221,
              "unit": "m³"
            },
            {
              "label": "Bags required",
              "value": 4,
              "unit": "bags"
            },
            {
              "label": "Post displacement deducted",
              "value": 0.006000000000000001,
              "unit": "m³"
            },
            {
              "label": "Cubic yards",
              "value": 0.047624445052213894,
              "unit": "yd³"
            },
            {
              "label": "Approximate weight",
              "value": 87.3876019763093,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Deeper holes for frost",
          "inputs": {
            "holeDiameter": 0.3,
            "holeDepth": 1.2,
            "postWidth": 0.1,
            "postCount": 10,
            "bagSize": "20"
          },
          "expected": 0.728,
          "toleranceDecimalPlaces": 2,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Per hole",
              "value": 0.07282300164692442,
              "unit": "m³"
            },
            {
              "label": "Bags required",
              "value": 78,
              "unit": "bags"
            },
            {
              "label": "Post displacement deducted",
              "value": 0.12000000000000002,
              "unit": "m³"
            },
            {
              "label": "Cubic yards",
              "value": 0.9524889010442779,
              "unit": "yd³"
            },
            {
              "label": "Approximate weight",
              "value": 1747.7520395261859,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A wider hole takes much more",
          "inputs": {
            "holeDiameter": 0.45,
            "holeDepth": 0.6,
            "postWidth": 0.1,
            "postCount": 10,
            "bagSize": "20"
          },
          "expected": 0.894,
          "toleranceDecimalPlaces": 2,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Per hole",
              "value": 0.08942587685278997,
              "unit": "m³"
            },
            {
              "label": "Bags required",
              "value": 96,
              "unit": "bags"
            },
            {
              "label": "Post displacement deducted",
              "value": 0.06000000000000001,
              "unit": "m³"
            },
            {
              "label": "Cubic yards",
              "value": 1.169646310123392,
              "unit": "yd³"
            },
            {
              "label": "Approximate weight",
              "value": 2146.221044466959,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "post-installed-anchor-drill-depth-calculator",
      "title": "Post-Installed Concrete Anchor Drill Depth Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/post-installed-anchor-drill-depth-calculator/",
      "sources": [
        "ACI 355.2 (qualification of post-installed mechanical anchors) and ACI 355.4 (qualification of adhesive anchors): an anchor's published capacity belongs to one qualified embedment and one installation procedure, both stated in the product's ICC-ES evaluation report",
        "ACI 318 Chapter 17 requires post-installed anchors to be installed in accordance with the manufacturer's printed installation instructions (MPII), which give the minimum hole depth for each anchor diameter and embedment",
        "Arithmetic only: hole depth = effective embedment + the additional depth the evaluation report specifies; embedment available = anchor length − fixture thickness − the nut, washer and thread projection above it"
      ],
      "vectors": [
        {
          "name": "70 mm embedment, 15 mm extra hole depth",
          "inputs": {
            "anchorType": "through",
            "hefRequired": 0.07,
            "extraDepth": 0.015,
            "anchorLength": 0.115,
            "fixtureThickness": 0.01,
            "projection": 0.02
          },
          "expected": 85,
          "toleranceDecimalPlaces": 3,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Embedment available from the anchor entered",
              "value": 85,
              "unit": "mm"
            },
            {
              "label": "Anchor length needed for this embedment",
              "value": 100,
              "unit": "mm"
            },
            {
              "label": "Shortfall against the required embedment",
              "value": 0,
              "unit": "mm"
            },
            {
              "label": "Drilled depth beyond the embedment",
              "value": 15,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "100 mm embedment, 20 mm extra hole depth",
          "inputs": {
            "anchorType": "through",
            "hefRequired": 0.1,
            "extraDepth": 0.02,
            "anchorLength": 0.13,
            "fixtureThickness": 0.012,
            "projection": 0.025
          },
          "expected": 120,
          "toleranceDecimalPlaces": 3,
          "unit": "mm",
          "confidence": "low",
          "steps": [
            {
              "label": "Embedment available from the anchor entered",
              "value": 93,
              "unit": "mm"
            },
            {
              "label": "Anchor length needed for this embedment",
              "value": 137,
              "unit": "mm"
            },
            {
              "label": "Shortfall against the required embedment",
              "value": 7.000000000000006,
              "unit": "mm"
            },
            {
              "label": "Drilled depth beyond the embedment",
              "value": 20,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Adhesive rod, 135 mm embedment drilled to depth",
          "inputs": {
            "anchorType": "rod",
            "hefRequired": 0.135,
            "extraDepth": 0,
            "anchorLength": 0.2,
            "fixtureThickness": 0.02,
            "projection": 0.03
          },
          "expected": 135,
          "toleranceDecimalPlaces": 3,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Embedment available from the anchor entered",
              "value": 150.00000000000003,
              "unit": "mm"
            },
            {
              "label": "Anchor length needed for this embedment",
              "value": 185,
              "unit": "mm"
            },
            {
              "label": "Shortfall against the required embedment",
              "value": 0,
              "unit": "mm"
            },
            {
              "label": "Drilled depth beyond the embedment",
              "value": 0,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "post-tensioned-anchor-loss-calculator",
      "title": "Post-Tensioned Anchor Seating Loss Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/post-tensioned-anchor-loss-calculator/",
      "sources": [
        "Post-Tensioning Institute (PTI) simplified short-tendon seating loss method: stress loss = (anchor set / tendon length) x strand modulus of elasticity — valid when the seating-loss effect propagates the full tendon length, the common case for short-to-medium span slab tendons",
        "Standard 7-wire strand elastic modulus: 28,500,000 psi; typical anchor set (wedge draw-in) is commonly 1/4 to 3/8 in depending on the anchorage system"
      ],
      "vectors": [
        {
          "name": "15m tendon, 6.35mm anchor set, 98.7mm² strand",
          "inputs": {
            "tendonLength": 15,
            "anchorSetLoss": 0.00635,
            "strandAreaMm2": 0.0000987
          },
          "expected": 83.19,
          "toleranceDecimalPlaces": 1,
          "unit": "MPa",
          "confidence": "medium",
          "steps": [
            {
              "label": "Stress loss (imperial)",
              "value": 12065,
              "unit": "psi"
            },
            {
              "label": "Force loss per strand",
              "value": 8.210380872047244,
              "unit": "kN"
            },
            {
              "label": "Force loss per strand (imperial)",
              "value": 1845.767716535433,
              "unit": "lbs"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "20m tendon, 10mm anchor set, 140mm² strand",
          "inputs": {
            "tendonLength": 20,
            "anchorSetLoss": 0.01,
            "strandAreaMm2": 0.00014
          },
          "expected": 98.22,
          "toleranceDecimalPlaces": 0,
          "unit": "MPa",
          "confidence": "medium",
          "steps": [
            {
              "label": "Stress loss (imperial)",
              "value": 14250,
              "unit": "psi"
            },
            {
              "label": "Force loss per strand",
              "value": 13.75503580507161,
              "unit": "kN"
            },
            {
              "label": "Force loss per strand (imperial)",
              "value": 3092.256184512369,
              "unit": "lbs"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "pounds-force-to-kn-calculator",
      "title": "Pounds-Force to kN Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/pounds-force-to-kn-calculator/",
      "sources": [
        "1 lbf = 4.4482216152605 N exactly, so 1 lbf = 0.0044482216 kN"
      ],
      "vectors": [
        {
          "name": "2300 lbf converts correctly",
          "inputs": {
            "poundsForce": 2300
          },
          "expected": 10.23090971509915,
          "toleranceDecimalPlaces": 6,
          "unit": "kN",
          "confidence": "high",
          "steps": [
            {
              "label": "Same load in kips",
              "value": 2.3,
              "unit": "kip"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "poundsForce": 23000
          },
          "expected": 102.3090971509915,
          "toleranceDecimalPlaces": 6,
          "unit": "kN",
          "confidence": "high",
          "steps": [
            {
              "label": "Same load in kips",
              "value": 23,
              "unit": "kip"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "pounds-per-foot-to-kilograms-per-meter-calculator",
      "title": "Pounds per Foot to Kilograms per Metre Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/pounds-per-foot-to-kilograms-per-meter-calculator/",
      "sources": [
        "Take the pound to the kilogram and the foot to the metre — 0.45359237 and 0.3048, both exact — and the ratio 0.45359237 ÷ 0.3048 gives 1.488163943569553805… kg/m per lb/ft. Exact as a ratio; the decimal runs on."
      ],
      "vectors": [
        {
          "name": "33.9 lb/ft converts correctly",
          "inputs": {
            "poundsPerFoot": 33.9
          },
          "expected": 50.4487577016,
          "toleranceDecimalPlaces": 6,
          "unit": "kg/m",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.488163944,
              "unit": "kg/m per lb/ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "poundsPerFoot": 339
          },
          "expected": 504.48757701600005,
          "toleranceDecimalPlaces": 6,
          "unit": "kg/m",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.488163944,
              "unit": "kg/m per lb/ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "pounds-per-square-foot-to-kilograms-per-square-meter-calculator",
      "title": "lb/ft² to kg/m² Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/pounds-per-square-foot-to-kilograms-per-square-meter-calculator/",
      "sources": [
        "1 lb = 0.45359237 kg and 1 ft = 0.3048 m, both exact, so 1 lb/ft² = 0.45359237 ÷ 0.09290304 = 4.882427636383050… kg/m². Note what this page does NOT do: a psf PRESSURE is 47.880 Pa, not 4.88 kg/m². The two share a number only because a pound weighs a pound-force at standard gravity, and a live load in psf belongs on the psf → kPa page instead."
      ],
      "vectors": [
        {
          "name": "12 lb/ft² converts correctly",
          "inputs": {
            "areaWeightPsf": 12
          },
          "expected": 58.589131632000004,
          "toleranceDecimalPlaces": 6,
          "unit": "kg/m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 4.882427636,
              "unit": "kg/m² per lb/ft²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "areaWeightPsf": 120
          },
          "expected": 585.89131632,
          "toleranceDecimalPlaces": 6,
          "unit": "kg/m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 4.882427636,
              "unit": "kg/m² per lb/ft²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "pounds-to-kilograms-calculator",
      "title": "Pounds to Kilograms Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/pounds-to-kilograms-calculator/",
      "sources": [
        "International yard and pound agreement (1959): 1 lb = 0.45359237 kg exactly"
      ],
      "vectors": [
        {
          "name": "100 lb converts correctly",
          "inputs": {
            "pounds": 100
          },
          "expected": 45.359237,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.45359237,
              "unit": "kg per lb"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "pounds": 1000
          },
          "expected": 453.59237,
          "toleranceDecimalPlaces": 6,
          "unit": "kg",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.45359237,
              "unit": "kg per lb"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "pounds-to-stone-calculator",
      "title": "Pounds to Stone Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/pounds-to-stone-calculator/",
      "sources": [
        "1 stone = 14 avoirdupois pounds (exact), UK statutory definition",
        "International yard and pound agreement (1959): 1 lb = 0.45359237 kg exactly"
      ],
      "vectors": [
        {
          "name": "175 lb converts correctly",
          "inputs": {
            "pounds": 175
          },
          "expected": 12.5,
          "toleranceDecimalPlaces": 6,
          "unit": "st",
          "confidence": "high",
          "steps": [
            {
              "label": "Whole stone",
              "value": 12,
              "unit": "st"
            },
            {
              "label": "Pounds remaining",
              "value": 7,
              "unit": "lb"
            },
            {
              "label": "Same weight in kilograms",
              "value": 79.37866475,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "pounds": 1750
          },
          "expected": 125,
          "toleranceDecimalPlaces": 6,
          "unit": "st",
          "confidence": "high",
          "steps": [
            {
              "label": "Whole stone",
              "value": 125,
              "unit": "st"
            },
            {
              "label": "Pounds remaining",
              "value": 0,
              "unit": "lb"
            },
            {
              "label": "Same weight in kilograms",
              "value": 793.7866475000001,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "preliminaries-cost-calculator",
      "title": "Construction Preliminaries (General Conditions) Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/preliminaries-cost-calculator/",
      "sources": [
        "Standard methods of measurement (NRM 1/2 in the UK, and the general conditions divisions of CSI MasterFormat 01 in North America) classify site-running costs as fixed charges, time-related charges and value-related charges — the split that lets a change in programme be priced separately from a change in scope",
        "Preliminaries on a main building contract commonly run 8-15% of the contract sum, higher on small, short or constrained sites and lower on large repetitive ones, because the fixed element is spread over more value",
        "The time-related total divided by the programme duration is the weekly prolongation rate — the basis on which loss and expense is evaluated when an extension of time is granted. It excludes fixed charges, which are not incurred again by a delay"
      ],
      "vectors": [
        {
          "name": "26-week job, two staff, ordinary weekly items",
          "inputs": {
            "programmeWeeks": 26,
            "siteStaffCount": 2,
            "siteStaffWeeklyCost": 1400,
            "accommodationWeekly": 450,
            "servicesWeekly": 300,
            "plantStandingWeekly": 800,
            "setupCost": 12000,
            "removalCost": 6000,
            "contractSum": 900000,
            "insuranceAndBondPercent": 1.2
          },
          "expected": 141900,
          "toleranceDecimalPlaces": 0,
          "unit": "currency",
          "confidence": "low",
          "steps": [
            {
              "label": "Time-related, per week",
              "value": 4350,
              "unit": "per week"
            },
            {
              "label": "Time-related over 26 weeks",
              "value": 113100,
              "unit": "currency"
            },
            {
              "label": "Fixed (setting up and clearing away)",
              "value": 18000,
              "unit": "currency"
            },
            {
              "label": "Value-related (insurance and bonds)",
              "value": 10800,
              "unit": "currency"
            },
            {
              "label": "Share of the contract sum",
              "value": 15.77,
              "unit": "%"
            },
            {
              "label": "Cost of one week's delay",
              "value": 4350,
              "unit": "per week"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "the weekly rate excludes the fixed charges a delay does not repeat",
          "inputs": {
            "programmeWeeks": 52,
            "siteStaffCount": 2,
            "siteStaffWeeklyCost": 1400,
            "accommodationWeekly": 450,
            "servicesWeekly": 300,
            "plantStandingWeekly": 800,
            "setupCost": 12000,
            "removalCost": 6000,
            "contractSum": 1800000,
            "insuranceAndBondPercent": 1.2
          },
          "expected": 265800,
          "toleranceDecimalPlaces": 0,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Time-related, per week",
              "value": 4350,
              "unit": "per week"
            },
            {
              "label": "Time-related over 52 weeks",
              "value": 226200,
              "unit": "currency"
            },
            {
              "label": "Fixed (setting up and clearing away)",
              "value": 18000,
              "unit": "currency"
            },
            {
              "label": "Value-related (insurance and bonds)",
              "value": 21600,
              "unit": "currency"
            },
            {
              "label": "Share of the contract sum",
              "value": 14.77,
              "unit": "%"
            },
            {
              "label": "Cost of one week's delay",
              "value": 4350,
              "unit": "per week"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "a bare site with no staff still costs its setting up",
          "inputs": {
            "programmeWeeks": 4,
            "siteStaffCount": 0,
            "siteStaffWeeklyCost": 1400,
            "accommodationWeekly": 0,
            "servicesWeekly": 0,
            "plantStandingWeekly": 0,
            "setupCost": 3000,
            "removalCost": 1500,
            "contractSum": 40000,
            "insuranceAndBondPercent": 1
          },
          "expected": 4900,
          "toleranceDecimalPlaces": 0,
          "unit": "currency",
          "confidence": "medium",
          "steps": [
            {
              "label": "Time-related, per week",
              "value": 0,
              "unit": "per week"
            },
            {
              "label": "Time-related over 4 weeks",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Fixed (setting up and clearing away)",
              "value": 4500,
              "unit": "currency"
            },
            {
              "label": "Value-related (insurance and bonds)",
              "value": 400,
              "unit": "currency"
            },
            {
              "label": "Share of the contract sum",
              "value": 12.25,
              "unit": "%"
            },
            {
              "label": "Cost of one week's delay",
              "value": 0,
              "unit": "per week"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "pressure-conversion-calculator",
      "title": "Pressure Conversion Calculator (PSI ↔ kPa)",
      "url": "https://craftquantities.com/calculators/measurements-conversions/pressure-conversion-calculator/",
      "sources": [
        "1 PSI = 6.89476 kPa (exact conversion factor)"
      ],
      "vectors": [
        {
          "name": "30 PSI to kPa",
          "inputs": {
            "pressureValue": 30,
            "fromUnit": "psi"
          },
          "expected": 206.843,
          "toleranceDecimalPlaces": 0.5,
          "unit": "kPa",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "200 kPa to PSI",
          "inputs": {
            "pressureValue": 200,
            "fromUnit": "kpa"
          },
          "expected": 29.008,
          "toleranceDecimalPlaces": 0.1,
          "unit": "PSI",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "proctor-compaction-percentage-calculator",
      "title": "Standard/Modified Proctor Compaction Percentage Calculator",
      "url": "https://craftquantities.com/calculators/heavy-civil/proctor-compaction-percentage-calculator/",
      "sources": [
        "Standard compaction QC check: percent compaction = (field dry density / laboratory maximum Proctor dry density) x 100; most specifications require 90-98% depending on the application"
      ],
      "vectors": [
        {
          "name": "Field 1870, max 1950, spec 95% (pass)",
          "inputs": {
            "fieldDryDensity": 1870,
            "maxProctorDensity": 1950,
            "requiredCompactionPercent": 95
          },
          "expected": 95.9,
          "toleranceDecimalPlaces": 1,
          "unit": "%",
          "confidence": "medium",
          "steps": [
            {
              "label": "Specified minimum",
              "value": 95,
              "unit": "%"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Field 1750, max 1950, spec 92% (fail)",
          "inputs": {
            "fieldDryDensity": 1750,
            "maxProctorDensity": 1950,
            "requiredCompactionPercent": 92
          },
          "expected": 89.74,
          "toleranceDecimalPlaces": 1,
          "unit": "%",
          "confidence": "medium",
          "steps": [
            {
              "label": "Specified minimum",
              "value": 92,
              "unit": "%"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "project-contingency-calculator",
      "title": "Project Contingency Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/project-contingency-calculator/",
      "sources": [
        "Total budget with contingency = base budget x (1 + contingency percent / 100); 10-20% is a commonly recommended contingency range for renovation projects"
      ],
      "vectors": [
        {
          "name": "$20,000 budget, 15% contingency",
          "inputs": {
            "baseBudget": 20000,
            "contingencyPercent": 15
          },
          "expected": 23000,
          "toleranceDecimalPlaces": 0,
          "unit": "$ (total recommended budget)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Contingency amount",
              "value": 3000,
              "unit": "$"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "$50,000 budget, 20% contingency",
          "inputs": {
            "baseBudget": 50000,
            "contingencyPercent": 20
          },
          "expected": 60000,
          "toleranceDecimalPlaces": 0,
          "unit": "$ (total recommended budget)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Contingency amount",
              "value": 10000,
              "unit": "$"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "propane-tank-sizing-calculator",
      "title": "Propane Tank Sizing Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/propane-tank-sizing-calculator/",
      "sources": [
        "Common propane supplier sizing guidance by total connected BTU/hr load: up to 100,000 BTU/hr = 120 gal, up to 200,000 = 250 gal, up to 400,000 = 500 gal, above that = 1,000 gal"
      ],
      "vectors": [
        {
          "name": "80,000 BTU/hr (23.4 kW) load",
          "inputs": {
            "totalBtuLoad": 23445.6856137776
          },
          "expected": 120,
          "toleranceDecimalPlaces": 0,
          "unit": "gallons",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "250,000 BTU/hr (73.3 kW) load",
          "inputs": {
            "totalBtuLoad": 73267.767543055
          },
          "expected": 500,
          "toleranceDecimalPlaces": 0,
          "unit": "gallons",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "exactly 100,000 BTU/hr sits at the top of the 120 gal bracket",
          "inputs": {
            "totalBtuLoad": 29307.107017222
          },
          "expected": 120,
          "toleranceDecimalPlaces": 0,
          "unit": "gallons",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "property-tax-increase-calculator",
      "title": "Property Tax Increase Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/property-tax-increase-calculator/",
      "sources": [
        "Annual tax increase = (added home value x assessment ratio) x local tax rate — the same math local assessors use to translate added value into added tax"
      ],
      "vectors": [
        {
          "name": "$15,000 added value, 1.1% rate, 100% assessment",
          "inputs": {
            "addedValue": 15000,
            "taxRatePercent": 1.1,
            "assessmentRatioPercent": 100
          },
          "expected": 165,
          "toleranceDecimalPlaces": 0,
          "unit": "currency/year",
          "confidence": "low",
          "steps": [
            {
              "label": "Assessed value increase",
              "value": 15000,
              "unit": "$"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "$20,000 added value, 1.5% rate, 80% assessment",
          "inputs": {
            "addedValue": 20000,
            "taxRatePercent": 1.5,
            "assessmentRatioPercent": 80
          },
          "expected": 240,
          "toleranceDecimalPlaces": 0,
          "unit": "currency/year",
          "confidence": "low",
          "steps": [
            {
              "label": "Assessed value increase",
              "value": 16000,
              "unit": "$"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "prv-sizing-calculator",
      "title": "Pressure Reducing Valve (PRV) Sizing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/prv-sizing-calculator/",
      "sources": [
        "Simplified valve flow coefficient equation for water: Cv = Q ÷ √(ΔP), where Q is flow rate (gpm) and ΔP is the pressure drop across the valve (psi) — the standard method used in valve manufacturers' catalogs to select a valve size for a target flow and pressure drop"
      ],
      "vectors": [
        {
          "name": "189.27 L/min (50 gpm), 137.9 kPa (20 psi) drop",
          "inputs": {
            "designFlow": 189.2705892,
            "pressureDrop": 137895.14586336
          },
          "expected": 11.18,
          "toleranceDecimalPlaces": 1,
          "unit": "Cv",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "302.83 L/min (80 gpm), 172.4 kPa (25 psi) drop",
          "inputs": {
            "designFlow": 302.83294272,
            "pressureDrop": 172368.9323292
          },
          "expected": 16,
          "toleranceDecimalPlaces": 1,
          "unit": "Cv",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "psf-to-kpa-calculator",
      "title": "psf to kPa Floor Load Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/psf-to-kpa-calculator/",
      "sources": [
        "1 psf = 4.4482216152605 N ÷ 0.09290304 m² = 47.880258980335842… Pa = 0.047880258980335842… kPa. Both inputs are exact definitions — 1 lb = 0.45359237 kg, g₀ = 9.80665 m/s², 1 ft = 0.3048 m — so the factor is an exact ratio; its decimal expansion repeats, and the displayed digits are the quotient carried to full working precision."
      ],
      "vectors": [
        {
          "name": "40 psf converts correctly",
          "inputs": {
            "poundsPerSquareFoot": 40
          },
          "expected": 1.9152103592134337,
          "toleranceDecimalPlaces": 6,
          "unit": "kPa",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.04788025898033584,
              "unit": "kPa per psf"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "poundsPerSquareFoot": 400
          },
          "expected": 19.15210359213434,
          "toleranceDecimalPlaces": 6,
          "unit": "kPa",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.04788025898033584,
              "unit": "kPa per psf"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "psi-to-bar-calculator",
      "title": "PSI to Bar Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/psi-to-bar-calculator/",
      "sources": [
        "1 bar = 100,000 Pa exactly; 1 psi = 6,894.757293 Pa, so 1 psi = 0.0689476 bar"
      ],
      "vectors": [
        {
          "name": "60 psi converts correctly",
          "inputs": {
            "psi": 60
          },
          "expected": 4.136854374,
          "toleranceDecimalPlaces": 6,
          "unit": "bar",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.0689475729,
              "unit": "bar per psi"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "psi": 600
          },
          "expected": 41.36854374,
          "toleranceDecimalPlaces": 6,
          "unit": "bar",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.0689475729,
              "unit": "bar per psi"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "psi-to-feet-of-head-calculator",
      "title": "PSI to Feet of Head Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/psi-to-feet-of-head-calculator/",
      "sources": [
        "Water at 4 °C weighs 62.428 lb/ft³, so 1 psi supports 144 ÷ 62.428 = 2.3067 ft of column — the jobsite “2.31” is this figure rounded"
      ],
      "vectors": [
        {
          "name": "50 PSI",
          "inputs": {
            "pressurePsi": 50
          },
          "expected": 115.333,
          "toleranceDecimalPlaces": 2,
          "unit": "ft of head",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "80 PSI",
          "inputs": {
            "pressurePsi": 80
          },
          "expected": 184.533,
          "toleranceDecimalPlaces": 2,
          "unit": "ft of head",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "pump-drawdown-time-calculator",
      "title": "Pump Drain Time Calculator",
      "url": "https://craftquantities.com/calculators/pools-water/pump-drawdown-time-calculator/",
      "sources": [
        "Hazen–Williams empirical head-loss formula, h_f = 10.67·L·Q^1.852 / (C^1.852·d^4.87), with C = 150 for smooth plastic/rubber hose — standard engineering hydraulics form (SI units)",
        "Pump performance approximated as a linear curve from rated flow at zero head to zero flow at rated maximum head — the standard first approximation for small utility and submersible pumps; the manufacturer's published curve governs where one exists"
      ],
      "vectors": [
        {
          "name": "50 m³ (50,000 L) pool, 200 L/min pump, 8 m head, 2 m lift, 25 mm × 10 m hose",
          "inputs": {
            "volume": 50000,
            "ratedFlow": 200,
            "maxHead": 8,
            "staticLift": 2,
            "hoseDia": 0.025,
            "hoseLength": 10
          },
          "expected": 10.648,
          "toleranceDecimalPlaces": 0.01,
          "unit": "hours",
          "confidence": "medium",
          "steps": [
            {
              "label": "Delivered flow at the operating point",
              "value": 78.26282428228797,
              "unit": "L/min"
            },
            {
              "label": "Share of rated flow surviving lift and hose",
              "value": 39.13141214114398,
              "unit": "%"
            },
            {
              "label": "Friction head in the hose",
              "value": 2.8694870287084835,
              "unit": "m"
            },
            {
              "label": "Total dynamic head",
              "value": 4.869487028708484,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "10 m³ (10,000 L) through a 32 mm × 5 m hose, 1 m lift",
          "inputs": {
            "volume": 10000,
            "ratedFlow": 100,
            "maxHead": 6,
            "staticLift": 1,
            "hoseDia": 0.032,
            "hoseLength": 5
          },
          "expected": 2.18,
          "toleranceDecimalPlaces": 2,
          "unit": "hours",
          "confidence": "medium",
          "steps": [
            {
              "label": "Delivered flow at the operating point",
              "value": 76.45187494427394,
              "unit": "L/min"
            },
            {
              "label": "Share of rated flow surviving lift and hose",
              "value": 76.45187494427394,
              "unit": "%"
            },
            {
              "label": "Friction head in the hose",
              "value": 0.4128875033435627,
              "unit": "m"
            },
            {
              "label": "Total dynamic head",
              "value": 1.4128875033435628,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Lift exceeds maximum head: 0 means never, flagged low confidence",
          "inputs": {
            "volume": 5000,
            "ratedFlow": 100,
            "maxHead": 5,
            "staticLift": 6,
            "hoseDia": 0.025,
            "hoseLength": 10
          },
          "expected": 0,
          "toleranceDecimalPlaces": 0,
          "unit": "hours",
          "confidence": "low",
          "steps": [
            {
              "label": "Delivered flow at the operating point",
              "value": 0,
              "unit": "L/min"
            },
            {
              "label": "Share of rated flow surviving lift and hose",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Friction head in the hose",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Total dynamic head",
              "value": 6,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "500 L flooded floor — minutes, not days (the 1000x regression)",
          "inputs": {
            "volume": 500,
            "ratedFlow": 200,
            "maxHead": 8,
            "staticLift": 2,
            "hoseDia": 0.025,
            "hoseLength": 10
          },
          "expected": 0.1065,
          "toleranceDecimalPlaces": 2,
          "unit": "hours",
          "confidence": "medium",
          "steps": [
            {
              "label": "Delivered flow at the operating point",
              "value": 78.26282428228797,
              "unit": "L/min"
            },
            {
              "label": "Share of rated flow surviving lift and hose",
              "value": 39.13141214114398,
              "unit": "%"
            },
            {
              "label": "Friction head in the hose",
              "value": 2.8694870287084835,
              "unit": "m"
            },
            {
              "label": "Total dynamic head",
              "value": 4.869487028708484,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "pump-power-calculator",
      "title": "Pump Power Calculator (Horsepower and kW)",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/pump-power-calculator/",
      "sources": [
        "US Department of Energy Industrial Technologies Program and the Hydraulic Institute, Improving Pumping System Performance: A Sourcebook for Industry, second edition (May 2006), section 1: fluid power = H x Q x s.g. / 3,960 (head in feet, flow in gpm, power in horsepower); pump efficiency = fluid power / shaft power, the motor's brake horsepower for a directly coupled pump; pump efficiencies from 35% to more than 90%; motor input = brake horsepower x 0.746 kW/hp / motor efficiency; a radial centrifugal pump's brake horsepower rises with flow, an axial pump's falls",
        "The same sourcebook, Appendix C, Pumping Systems Tip Sheet 3 (DOE/GO-102005-2157, October 2005): 15,000 gpm at a total head of 150 ft, specific gravity 1.0, pumps at 81% and 78% efficiency, a reduction of (150 x 15,000 x 1.0 / 3,960) x (1/0.78 - 1/0.81) = 27 bhp (the tip sheet prints the two terms the other way round, which as written is negative)",
        "NIST Special Publication 811, Guide for the Use of the International System of Units, Appendix B.8: horsepower (550 ft·lbf/s) = 745.6999 W, horsepower (electric) = 746 W, horsepower (metric) = 735.4988 W; standard acceleration of free fall gn = 9.80665 m/s², exact"
      ],
      "vectors": [
        {
          "name": "Worked example: 10 L/s against 20 m, water, pump 70%, motor 90%",
          "inputs": {
            "flow": 600,
            "head": 20,
            "specificGravity": 1,
            "pumpEfficiency": 70,
            "motorEfficiency": 90
          },
          "expected": 3.75741,
          "toleranceDecimalPlaces": 5,
          "unit": "horsepower",
          "confidence": "high",
          "steps": [
            {
              "label": "Water power, the energy the fluid gains",
              "value": 2.6301868549854164,
              "unit": "horsepower"
            },
            {
              "label": "Brake power at the pump shaft",
              "value": 3.7574097928363095,
              "unit": "horsepower"
            },
            {
              "label": "Motor input from the supply",
              "value": 4.174899769818121,
              "unit": "horsepower"
            },
            {
              "label": "Brake power in kilowatts (kW)",
              "value": 2.8019000000000007,
              "unit": "kW"
            },
            {
              "label": "Brake power in horsepower (hp)",
              "value": 3.7574097928363095,
              "unit": "hp"
            },
            {
              "label": "The head as a pressure, in this fluid",
              "value": 196.133,
              "unit": "kPa"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "DOE Tip Sheet 3: 15,000 gpm at 150 ft, water, the 81% pump",
          "inputs": {
            "flow": 56781.176759999995,
            "head": 45.72,
            "specificGravity": 1,
            "pumpEfficiency": 81,
            "motorEfficiency": 96
          },
          "expected": 702.4751,
          "toleranceDecimalPlaces": 2,
          "unit": "horsepower",
          "confidence": "high",
          "steps": [
            {
              "label": "Water power, the energy the fluid gains",
              "value": 569.0048490013179,
              "unit": "horsepower"
            },
            {
              "label": "Brake power at the pump shaft",
              "value": 702.4751222238493,
              "unit": "horsepower"
            },
            {
              "label": "Motor input from the supply",
              "value": 731.7449189831763,
              "unit": "horsepower"
            },
            {
              "label": "Brake power in kilowatts (kW)",
              "value": 523.835608432064,
              "unit": "kW"
            },
            {
              "label": "Brake power in horsepower (hp)",
              "value": 702.4751222238493,
              "unit": "hp"
            },
            {
              "label": "The head as a pressure, in this fluid",
              "value": 448.360038,
              "unit": "kPa"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "The same pump at 78%: 729.49 hp, the 27 bhp DOE's tip sheet sets between them",
          "inputs": {
            "flow": 56781.176759999995,
            "head": 45.72,
            "specificGravity": 1,
            "pumpEfficiency": 78,
            "motorEfficiency": 96
          },
          "expected": 729.4934,
          "toleranceDecimalPlaces": 2,
          "unit": "horsepower",
          "confidence": "high",
          "steps": [
            {
              "label": "Water power, the energy the fluid gains",
              "value": 569.0048490013179,
              "unit": "horsepower"
            },
            {
              "label": "Brake power at the pump shaft",
              "value": 729.4933961555357,
              "unit": "horsepower"
            },
            {
              "label": "Motor input from the supply",
              "value": 759.8889543286831,
              "unit": "horsepower"
            },
            {
              "label": "Brake power in kilowatts (kW)",
              "value": 543.9831318332972,
              "unit": "kW"
            },
            {
              "label": "Brake power in horsepower (hp)",
              "value": 729.4933961555357,
              "unit": "hp"
            },
            {
              "label": "The head as a pressure, in this fluid",
              "value": 448.360038,
              "unit": "kPa"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Brine at specific gravity 1.2: 20% more power for the same flow and head",
          "inputs": {
            "flow": 600,
            "head": 20,
            "specificGravity": 1.2,
            "pumpEfficiency": 70,
            "motorEfficiency": 90
          },
          "expected": 4.508892,
          "toleranceDecimalPlaces": 5,
          "unit": "horsepower",
          "confidence": "high",
          "steps": [
            {
              "label": "Water power, the energy the fluid gains",
              "value": 3.1562242259824993,
              "unit": "horsepower"
            },
            {
              "label": "Brake power at the pump shaft",
              "value": 4.508891751403571,
              "unit": "horsepower"
            },
            {
              "label": "Motor input from the supply",
              "value": 5.009879723781745,
              "unit": "horsepower"
            },
            {
              "label": "Brake power in kilowatts (kW)",
              "value": 3.36228,
              "unit": "kW"
            },
            {
              "label": "Brake power in horsepower (hp)",
              "value": 4.508891751403571,
              "unit": "hp"
            },
            {
              "label": "The head as a pressure, in this fluid",
              "value": 235.35959999999997,
              "unit": "kPa"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "purlin-spacing-calculator",
      "title": "Purlin Row Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/purlin-spacing-calculator/",
      "sources": [
        "Number of purlin rows = ceil(roof run length ÷ maximum purlin spacing) + 1, providing intermediate support between widely-spaced rafters or trusses"
      ],
      "vectors": [
        {
          "name": "6m run, 0.6m max spacing",
          "inputs": {
            "roofRunLength": 6,
            "maxPurlinSpacing": 0.6
          },
          "expected": 11,
          "toleranceDecimalPlaces": 0,
          "unit": "rows",
          "confidence": "high",
          "steps": [
            {
              "label": "Bays between purlin rows",
              "value": 10
            },
            {
              "label": "Purlin centres up the slope",
              "value": 0.6,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "9m run, 0.75m max spacing",
          "inputs": {
            "roofRunLength": 9,
            "maxPurlinSpacing": 0.75
          },
          "expected": 13,
          "toleranceDecimalPlaces": 0,
          "unit": "rows",
          "confidence": "high",
          "steps": [
            {
              "label": "Bays between purlin rows",
              "value": 12
            },
            {
              "label": "Purlin centres up the slope",
              "value": 0.75,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "pv-string-sizing-calculator",
      "title": "Solar PV String Sizing Calculator",
      "url": "https://craftquantities.com/calculators/solar-energy/pv-string-sizing-calculator/",
      "sources": [
        "Maximum panels per string = floor(maximum system voltage ÷ (panel open-circuit voltage × low-temperature correction factor)), per NEC 690.7 which requires PV source circuit voltage calculations to account for Voc increasing in cold temperatures using either the manufacturer's temperature coefficient or NEC Table 690.7(A) correction factors"
      ],
      "vectors": [
        {
          "name": "600V system, 40V Voc, 1.12 correction",
          "inputs": {
            "maxSystemVoltage": 600,
            "panelVoc": 40,
            "tempCorrectionFactor": 1.12
          },
          "expected": 13,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "medium",
          "steps": [
            {
              "label": "Temperature-corrected Voc per panel",
              "value": 44.800000000000004,
              "unit": "V"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1000V system, 45V Voc, 1.14 correction",
          "inputs": {
            "maxSystemVoltage": 1000,
            "panelVoc": 45,
            "tempCorrectionFactor": 1.14
          },
          "expected": 19,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "medium",
          "steps": [
            {
              "label": "Temperature-corrected Voc per panel",
              "value": 51.3,
              "unit": "V"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "quarry-tile-grout-volume-calculator",
      "title": "Quarry Tile Acid-Resistant Grout Joint Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/quarry-tile-grout-volume-calculator/",
      "sources": [
        "Grout volume = total joint length × joint width × joint depth — quarry tile in industrial/commercial kitchens commonly uses wider joints (8-12mm) filled with epoxy or furan chemical-resistant grout rather than standard cement grout"
      ],
      "vectors": [
        {
          "name": "60m joint, 10mm wide, 15mm deep",
          "inputs": {
            "totalJointLength": 60,
            "jointWidth": 0.01,
            "jointDepth": 0.015
          },
          "expected": 9,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "80m joint, 12mm wide, 18mm deep",
          "inputs": {
            "totalJointLength": 80,
            "jointWidth": 0.012,
            "jointDepth": 0.018
          },
          "expected": 17.28,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "r-value-calculator",
      "title": "R-Value Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/r-value-calculator/",
      "sources": [
        "Thermal resistances (R-values) in a layered assembly add directly: total R = sum of each layer's R-value",
        "A combined interior + exterior air film allowance of approximately R-0.85 is commonly included in total assembly R-value calculations"
      ],
      "vectors": [
        {
          "name": "R-13 batt + R-1.5 sheathing + R-0.45 drywall",
          "inputs": {
            "layer1RValue": 13,
            "layer2RValue": 1.5,
            "layer3RValue": 0.45
          },
          "expected": 15.8,
          "toleranceDecimalPlaces": 1,
          "unit": "R-value",
          "confidence": "high",
          "steps": [
            {
              "label": "Sum of material layers",
              "value": 14.95,
              "unit": "R"
            },
            {
              "label": "Air film allowance",
              "value": 0.85,
              "unit": "R"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "R-38 attic insulation only",
          "inputs": {
            "layer1RValue": 38,
            "layer2RValue": 0,
            "layer3RValue": 0
          },
          "expected": 38.85,
          "toleranceDecimalPlaces": 1,
          "unit": "R-value",
          "confidence": "high",
          "steps": [
            {
              "label": "Sum of material layers",
              "value": 38,
              "unit": "R"
            },
            {
              "label": "Air film allowance",
              "value": 0.85,
              "unit": "R"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "r-value-to-rsi-calculator",
      "title": "R-Value to RSI Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/r-value-to-rsi-calculator/",
      "sources": [
        "NIST SP 811, Appendix B — thermal insulance: 1 h·ft²·°F/BTU = 0.176110 m²·K/W",
        "ASTM C168, Standard Terminology Relating to Thermal Insulation (defines thermal resistance and its IP/SI forms)"
      ],
      "vectors": [
        {
          "name": "R-30 attic batt is RSI 5.28",
          "inputs": {
            "rValue": 30
          },
          "expected": 5.2833055,
          "toleranceDecimalPlaces": 5,
          "unit": "m²·K/W",
          "confidence": "high",
          "steps": [
            {
              "label": "R-value entered",
              "value": 30,
              "unit": "h·ft²·°F/BTU"
            },
            {
              "label": "Metric U-value (the reciprocal)",
              "value": 0.18927544470378152,
              "unit": "W/m²·K"
            },
            {
              "label": "IP U-factor (the reciprocal in IP)",
              "value": 0.03333333333333333,
              "unit": "BTU/h·ft²·°F"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "R-13 wall batt is RSI 2.29",
          "inputs": {
            "rValue": 13
          },
          "expected": 2.2894324,
          "toleranceDecimalPlaces": 5,
          "unit": "m²·K/W",
          "confidence": "high",
          "steps": [
            {
              "label": "R-value entered",
              "value": 13,
              "unit": "h·ft²·°F/BTU"
            },
            {
              "label": "Metric U-value (the reciprocal)",
              "value": 0.43678948777795734,
              "unit": "W/m²·K"
            },
            {
              "label": "IP U-factor (the reciprocal in IP)",
              "value": 0.07692307692307693,
              "unit": "BTU/h·ft²·°F"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "R-49 is RSI 8.63",
          "inputs": {
            "rValue": 49
          },
          "expected": 8.629399,
          "toleranceDecimalPlaces": 4,
          "unit": "m²·K/W",
          "confidence": "high",
          "steps": [
            {
              "label": "R-value entered",
              "value": 49,
              "unit": "h·ft²·°F/BTU"
            },
            {
              "label": "Metric U-value (the reciprocal)",
              "value": 0.11588292532884582,
              "unit": "W/m²·K"
            },
            {
              "label": "IP U-factor (the reciprocal in IP)",
              "value": 0.02040816326530612,
              "unit": "BTU/h·ft²·°F"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "R-1 is the factor itself, inverted",
          "inputs": {
            "rValue": 1
          },
          "expected": 0.17611018,
          "toleranceDecimalPlaces": 6,
          "unit": "m²·K/W",
          "confidence": "high",
          "steps": [
            {
              "label": "R-value entered",
              "value": 1,
              "unit": "h·ft²·°F/BTU"
            },
            {
              "label": "Metric U-value (the reciprocal)",
              "value": 5.678263341113445,
              "unit": "W/m²·K"
            },
            {
              "label": "IP U-factor (the reciprocal in IP)",
              "value": 1,
              "unit": "BTU/h·ft²·°F"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "r-value-to-u-value-calculator",
      "title": "R-Value to U-Value Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/r-value-to-u-value-calculator/",
      "sources": [
        "Thermal transmittance is the reciprocal of thermal resistance: U = 1 / R",
        "Heat transfer through an assembly: Q = U x A x deltaT"
      ],
      "vectors": [
        {
          "name": "19 hr·ft²·°F/BTU converts correctly",
          "inputs": {
            "rValue": 19
          },
          "expected": 0.05263157894736842,
          "toleranceDecimalPlaces": 6,
          "unit": "BTU/hr·ft²·°F",
          "confidence": "high",
          "steps": [],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "rValue": 190
          },
          "expected": 0.005263157894736842,
          "toleranceDecimalPlaces": 6,
          "unit": "BTU/hr·ft²·°F",
          "confidence": "high",
          "steps": [],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "radiant-barrier-coverage-calculator",
      "title": "Radiant Barrier Foil Coverage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/radiant-barrier-coverage-calculator/",
      "sources": [
        "Material needed = roof area × (1 + waste allowance), the standard coverage-with-waste method applied to reflective radiant barrier foil installation"
      ],
      "vectors": [
        {
          "name": "150m² roof, 5% waste",
          "inputs": {
            "roofArea": 150,
            "wastePercent": 5
          },
          "expected": 157.5,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "200m² roof, 8% waste",
          "inputs": {
            "roofArea": 200,
            "wastePercent": 8
          },
          "expected": 216,
          "toleranceDecimalPlaces": 0,
          "unit": "m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "radiant-cable-spacing-calculator",
      "title": "Radiant Floor Heating Cable Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/radiant-cable-spacing-calculator/",
      "sources": [
        "For loose cable (not a pre-made mat) laid in a serpentine pattern, total cable length ≈ floor area ÷ spacing between adjacent cable runs"
      ],
      "vectors": [
        {
          "name": "10m² floor, 100mm spacing",
          "inputs": {
            "floorArea": 10,
            "cableSpacing": 0.1
          },
          "expected": 100,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15m² floor, 75mm spacing",
          "inputs": {
            "floorArea": 15,
            "cableSpacing": 0.075
          },
          "expected": 200,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "400m² freezer bay, 300mm centres",
          "inputs": {
            "floorArea": 400,
            "cableSpacing": 0.3
          },
          "expected": 1333.33,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "200m² slab at 600mm centres",
          "inputs": {
            "floorArea": 200,
            "cableSpacing": 0.6
          },
          "expected": 333.33,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "radiant-floor-pex-calculator",
      "title": "Radiant Floor PEX Tubing Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/radiant-floor-pex-calculator/",
      "sources": [
        "Standard radiant-floor industry formula: tubing length (ft) = floor area (sq ft) x (12 / tube spacing in inches)",
        "10% extra is standard to account for manifold connections, wall penetrations, and the return run at each loop's start and end",
        "Leader tubing (the flow and return between the heated area and a manifold outside it) is a measured length: circuits x 2 x the route, added to the total as it stands"
      ],
      "vectors": [
        {
          "name": "20m² area, 12in spacing",
          "inputs": {
            "floorArea": 20,
            "tubeSpacingIn": "12"
          },
          "expected": 236.81,
          "toleranceDecimalPlaces": 1,
          "unit": "linear ft of PEX",
          "confidence": "medium",
          "steps": [
            {
              "label": "Tubing before manifold allowance",
              "value": 215.27820833419443,
              "unit": "linear ft"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "30m² area, 9in spacing",
          "inputs": {
            "floorArea": 30,
            "tubeSpacingIn": "9"
          },
          "expected": 473.61,
          "toleranceDecimalPlaces": 1,
          "unit": "linear ft of PEX",
          "confidence": "medium",
          "steps": [
            {
              "label": "Tubing before manifold allowance",
              "value": 430.5564166683888,
              "unit": "linear ft"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "20m² area, 12in spacing, 10% allowance, 30 m of leaders",
          "inputs": {
            "floorArea": 20,
            "tubeSpacingIn": "12",
            "connectionAllowancePercent": 10,
            "leaderLength": 30
          },
          "expected": 335.23,
          "toleranceDecimalPlaces": 1,
          "unit": "linear ft of PEX",
          "confidence": "medium",
          "steps": [
            {
              "label": "Tubing before manifold allowance",
              "value": 215.27820833419443,
              "unit": "linear ft"
            },
            {
              "label": "Loop tubing with connection allowance",
              "value": 236.8060291676139,
              "unit": "linear ft"
            },
            {
              "label": "Leader tubing, flow and return",
              "value": 98.42519685039369,
              "unit": "linear ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "20m² area, 12in spacing, no connection allowance",
          "inputs": {
            "floorArea": 20,
            "tubeSpacingIn": "12",
            "connectionAllowancePercent": 0
          },
          "expected": 215.28,
          "toleranceDecimalPlaces": 1,
          "unit": "linear ft of PEX",
          "confidence": "medium",
          "steps": [
            {
              "label": "Tubing before manifold allowance",
              "value": 215.27820833419443,
              "unit": "linear ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "radiator-output-delta-t-calculator",
      "title": "Radiator Output at Lower Flow Temperature (ΔT Correction) Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/radiator-output-delta-t-calculator/",
      "sources": [
        "EN 442-2: a radiator's output at other conditions is its rated output × (ΔT ÷ ΔT at rating)^n, where ΔT is the excess of the mean water temperature over the room air and n is the radiator exponent the manufacturer publishes. The standard rating conditions are 75 °C flow, 65 °C return and 20 °C air — a 50 K excess, 'ΔT50'",
        "EN 442-2: where (return − room) ÷ (flow − room) falls below 0.7, the logarithmic mean excess temperature, (flow − return) ÷ ln((flow − room) ÷ (return − room)), is used in place of the arithmetic mean",
        "US hydronic catalogues quote output against average water temperature; the row most often read is 180 °F average water in a 65 °F room, an excess of 115 °F-degrees (63.9 K), and the same ratio method applies with that excess in place of 50 K"
      ],
      "vectors": [
        {
          "name": "EN 442 standard conditions, 75/65 in a 20 room — the rating comes back unchanged (in BTU/h)",
          "inputs": {
            "roomHeatLoss": 1000,
            "flowTemp": 75,
            "returnTemp": 65,
            "roomTemp": 20,
            "exponent": 1.3,
            "ratingBasis": "en442",
            "customRatingDeltaT": 50
          },
          "expected": 3412.142,
          "toleranceDecimalPlaces": 1,
          "unit": "BTU/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Output at these conditions, as a share of the catalogue rating",
              "value": 100,
              "unit": "%"
            },
            {
              "label": "Mean water temperature",
              "value": 70,
              "unit": "°C"
            },
            {
              "label": "Excess temperature — mean water minus room",
              "value": 50,
              "unit": "Δ°C"
            },
            {
              "label": "Excess temperature the catalogue rating is quoted at",
              "value": 50,
              "unit": "Δ°C"
            },
            {
              "label": "The same rating in watts, as European-made panels are catalogued",
              "value": 1000,
              "unit": "W"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Heat pump at 45/40 in a 21 room — about a third of the rating, so three times the loss",
          "inputs": {
            "roomHeatLoss": 1000,
            "flowTemp": 45,
            "returnTemp": 40,
            "roomTemp": 21,
            "exponent": 1.3,
            "ratingBasis": "en442",
            "customRatingDeltaT": 50
          },
          "expected": 10221.581,
          "toleranceDecimalPlaces": 1,
          "unit": "BTU/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Output at these conditions, as a share of the catalogue rating",
              "value": 33.38174169271837,
              "unit": "%"
            },
            {
              "label": "Mean water temperature",
              "value": 42.5,
              "unit": "°C"
            },
            {
              "label": "Excess temperature — mean water minus room",
              "value": 21.5,
              "unit": "Δ°C"
            },
            {
              "label": "Excess temperature the catalogue rating is quoted at",
              "value": 50,
              "unit": "Δ°C"
            },
            {
              "label": "The same rating in watts, as European-made panels are catalogued",
              "value": 2995.6495655771373,
              "unit": "W"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A 20-degree drop at 55/35 in a 20 room — below EN 442's 0.7 ratio, so the log-mean applies",
          "inputs": {
            "roomHeatLoss": 1000,
            "flowTemp": 55,
            "returnTemp": 35,
            "roomTemp": 20,
            "exponent": 1.3,
            "ratingBasis": "en442",
            "customRatingDeltaT": 50
          },
          "expected": 9053.073,
          "toleranceDecimalPlaces": 1,
          "unit": "BTU/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Output at these conditions, as a share of the catalogue rating",
              "value": 37.69042599606158,
              "unit": "%"
            },
            {
              "label": "Mean water temperature",
              "value": 45,
              "unit": "°C"
            },
            {
              "label": "Excess temperature — log-mean, as EN 442 requires here",
              "value": 23.604450022876573,
              "unit": "Δ°C"
            },
            {
              "label": "Excess temperature the catalogue rating is quoted at",
              "value": 50,
              "unit": "Δ°C"
            },
            {
              "label": "The same rating in watts, as European-made panels are catalogued",
              "value": 2653.1936786930823,
              "unit": "W"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "US basis at its own reference, 190/170 °F in a 65 °F room — 10,000 BTU/h comes back unchanged",
          "inputs": {
            "roomHeatLoss": 2930.7107017222,
            "flowTemp": 87.77777777777779,
            "returnTemp": 76.66666666666667,
            "roomTemp": 18.333333333333336,
            "exponent": 1.3,
            "ratingBasis": "us180",
            "customRatingDeltaT": 50
          },
          "expected": 10000,
          "toleranceDecimalPlaces": 1,
          "unit": "BTU/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Output at these conditions, as a share of the catalogue rating",
              "value": 100,
              "unit": "%"
            },
            {
              "label": "Mean water temperature",
              "value": 82.22222222222223,
              "unit": "°C"
            },
            {
              "label": "Excess temperature — mean water minus room",
              "value": 63.88888888888889,
              "unit": "Δ°C"
            },
            {
              "label": "Excess temperature the catalogue rating is quoted at",
              "value": 63.88888888888889,
              "unit": "Δ°C"
            },
            {
              "label": "The same rating in watts, as European-made panels are catalogued",
              "value": 2930.7107017222,
              "unit": "W"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "Another rating point — a catalogue quoting 80 °C mean water in a 20 °C room, a 60-degree excess",
          "inputs": {
            "roomHeatLoss": 1000,
            "flowTemp": 45,
            "returnTemp": 40,
            "roomTemp": 21,
            "exponent": 1.3,
            "ratingBasis": "custom",
            "customRatingDeltaT": 60
          },
          "expected": 12955.485,
          "toleranceDecimalPlaces": 1,
          "unit": "BTU/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Output at these conditions, as a share of the catalogue rating",
              "value": 26.33742866873766,
              "unit": "%"
            },
            {
              "label": "Mean water temperature",
              "value": 42.5,
              "unit": "°C"
            },
            {
              "label": "Excess temperature — mean water minus room",
              "value": 21.5,
              "unit": "Δ°C"
            },
            {
              "label": "Excess temperature the catalogue rating is quoted at",
              "value": 60,
              "unit": "Δ°C"
            },
            {
              "label": "The same rating in watts, as European-made panels are catalogued",
              "value": 3796.877867530754,
              "unit": "W"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "radius-to-area-calculator",
      "title": "Radius to Area Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/radius-to-area-calculator/",
      "sources": [
        "Area of a circle A = pi x r^2"
      ],
      "vectors": [
        {
          "name": "10 ft converts correctly",
          "inputs": {
            "radiusFt": 10
          },
          "expected": 314.1592653589793,
          "toleranceDecimalPlaces": 6,
          "unit": "sq ft",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "radiusFt": 100
          },
          "expected": 31415.926535897932,
          "toleranceDecimalPlaces": 6,
          "unit": "sq ft",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "raft-slab-thickenings-volume-calculator",
      "title": "Raft Slab Concrete Volume Calculator (Edge Thickenings and Downstands)",
      "url": "https://craftquantities.com/calculators/materials-quantities/raft-slab-thickenings-volume-calculator/",
      "sources": [
        "Volume from the plan and the section: slab area × thickness, plus each thickening's length × width × depth below the slab; a perimeter band of width b round an L × W slab has a centre line of 2(L + W) − 4b, so its corners are counted once",
        "A 45° inner face on the edge thickening adds a triangle of depth² ÷ 2, run along its own centroid line, 2(L + W) − 8(b + depth ÷ 3)"
      ],
      "vectors": [
        {
          "name": "A 10 × 8 m raft, 150 mm, with a 300 × 300 mm vertical edge band",
          "inputs": {
            "slabLength": 10,
            "slabWidth": 8,
            "slabThickness": 0.15,
            "edgeWidth": 0.3,
            "edgeDepth": 0.3,
            "edgeInnerFace": "vertical",
            "internalLength": 0,
            "internalWidth": 0.3,
            "internalDepth": 0.25,
            "padCount": 0,
            "padLength": 1,
            "padWidth": 1,
            "padDepth": 0.3,
            "wastePercent": 0
          },
          "expected": 15.132,
          "toleranceDecimalPlaces": 3,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Slab",
              "value": 12,
              "unit": "m³"
            },
            {
              "label": "Edge thickening",
              "value": 3.1319999999999997,
              "unit": "m³"
            },
            {
              "label": "Internal downstands",
              "value": 0,
              "unit": "m³"
            },
            {
              "label": "Pad thickenings",
              "value": 0,
              "unit": "m³"
            },
            {
              "label": "Concrete before waste",
              "value": 15.132,
              "unit": "m³"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The same edge with a 45° inner face",
          "inputs": {
            "slabLength": 10,
            "slabWidth": 8,
            "slabThickness": 0.15,
            "edgeWidth": 0.3,
            "edgeDepth": 0.3,
            "edgeInnerFace": "haunch-45",
            "internalLength": 0,
            "internalWidth": 0.3,
            "internalDepth": 0.25,
            "padCount": 0,
            "padLength": 1,
            "padWidth": 1,
            "padDepth": 0.3,
            "wastePercent": 0
          },
          "expected": 16.608,
          "toleranceDecimalPlaces": 3,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Slab",
              "value": 12,
              "unit": "m³"
            },
            {
              "label": "Edge thickening",
              "value": 4.608,
              "unit": "m³"
            },
            {
              "label": "Internal downstands",
              "value": 0,
              "unit": "m³"
            },
            {
              "label": "Pad thickenings",
              "value": 0,
              "unit": "m³"
            },
            {
              "label": "Concrete before waste",
              "value": 16.608,
              "unit": "m³"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "With internal downstands, four pads and 5% waste",
          "inputs": {
            "slabLength": 10,
            "slabWidth": 8,
            "slabThickness": 0.15,
            "edgeWidth": 0.3,
            "edgeDepth": 0.3,
            "edgeInnerFace": "vertical",
            "internalLength": 8,
            "internalWidth": 0.3,
            "internalDepth": 0.25,
            "padCount": 4,
            "padLength": 1,
            "padWidth": 1,
            "padDepth": 0.3,
            "wastePercent": 5
          },
          "expected": 17.7786,
          "toleranceDecimalPlaces": 3,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Slab",
              "value": 12,
              "unit": "m³"
            },
            {
              "label": "Edge thickening",
              "value": 3.1319999999999997,
              "unit": "m³"
            },
            {
              "label": "Internal downstands",
              "value": 0.6,
              "unit": "m³"
            },
            {
              "label": "Pad thickenings",
              "value": 1.2,
              "unit": "m³"
            },
            {
              "label": "Concrete before waste",
              "value": 16.932,
              "unit": "m³"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "rain-barrel-collection-calculator",
      "title": "Rain Barrel and Rainwater Collection Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/rain-barrel-collection-calculator/",
      "sources": [
        "Standard rainwater harvesting formula: gallons collected = roof catchment area (sq ft) x rainfall (inches) x 0.623"
      ],
      "vectors": [
        {
          "name": "100m² roof, 1in rain",
          "inputs": {
            "roofArea": 100,
            "rainfallIn": 0.0254
          },
          "expected": 670.6,
          "toleranceDecimalPlaces": -1,
          "unit": "gallons",
          "confidence": "medium",
          "steps": [
            {
              "label": "Roof catchment area",
              "value": 1076.391041670972,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150m² roof, 0.5in rain",
          "inputs": {
            "roofArea": 150,
            "rainfallIn": 0.0127
          },
          "expected": 502.9,
          "toleranceDecimalPlaces": -1,
          "unit": "gallons",
          "confidence": "medium",
          "steps": [
            {
              "label": "Roof catchment area",
              "value": 1614.5865625064582,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "rain-screen-fastener-calculator",
      "title": "Rain-Screen Cladding Panel Fastener Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/rain-screen-fastener-calculator/",
      "sources": [
        "Total fasteners = panel count × fasteners per panel, the standard fastening-count method for rain-screen cladding panel systems"
      ],
      "vectors": [
        {
          "name": "80 panels, 4 fasteners each",
          "inputs": {
            "panelCount": 80,
            "fastenersPerPanel": 4
          },
          "expected": 320,
          "toleranceDecimalPlaces": 0,
          "unit": "fasteners",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "120 panels, 6 fasteners each",
          "inputs": {
            "panelCount": 120,
            "fastenersPerPanel": 6
          },
          "expected": 720,
          "toleranceDecimalPlaces": 0,
          "unit": "fasteners",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "rain-screen-furring-calculator",
      "title": "Rain-Screen Cladding Furring Strip Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/rain-screen-furring-calculator/",
      "sources": [
        "Furring strip count = ceil(wall width ÷ strip spacing) + 1, running the full wall height, the standard method for creating a continuous ventilated air gap behind rain-screen cladding"
      ],
      "vectors": [
        {
          "name": "12m wide wall, 0.41m spacing, 3m tall",
          "inputs": {
            "wallWidth": 12,
            "stripSpacing": 0.41,
            "wallHeight": 3
          },
          "expected": 93,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Number of furring strips",
              "value": 31
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15m wide wall, 0.4m spacing, 3.2m tall",
          "inputs": {
            "wallWidth": 15,
            "stripSpacing": 0.4,
            "wallHeight": 3.2
          },
          "expected": 124.8,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Number of furring strips",
              "value": 39
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "rain-screen-ventilation-area-calculator",
      "title": "Rain-Screen Cladding Ventilation Net Free Area Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/rain-screen-ventilation-area-calculator/",
      "sources": [
        "Net free area = total vent gap area × the vent product's open-area percentage, since perforated or baffled vent strips only allow a fraction of their gross area to pass air"
      ],
      "vectors": [
        {
          "name": "2m² gap, 60% open area",
          "inputs": {
            "totalGapArea": 2,
            "openAreaPercent": 60
          },
          "expected": 1.2,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "3m² gap, 50% open area",
          "inputs": {
            "totalGapArea": 3,
            "openAreaPercent": 50
          },
          "expected": 1.5,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "rainwater-tank-size-calculator",
      "title": "Rainwater Tank and Cistern Size Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/rainwater-tank-size-calculator/",
      "sources": [
        "HM Government, Approved Document G: Sanitation, hot water safety and water efficiency (2015 edition incorporating 2016 and 2024 amendments), Appendix A. Table A5.1, rainwater collection by the BS 8515 intermediate approach: daily rainwater collection = collection area (m²) × yield coefficient and hydraulic filter efficiency (e.g. 0.7) × average annual rainfall (mm) ÷ 365. Table A1 use factors: a dual-flush WC used 1.46 times at full flush and 2.96 times at part flush a person a day (4.42 in all), and 2.1 kg of washing a person a day. Table 2.1 fittings: a 6/4 litre dual-flush WC and a washing machine using 8.17 litres a kilogram. Paragraph A24: for sizing storage capacity, BS 8515 should be followed",
        "Australian Bureau of Statistics, Water Account, Australia, 2023–24 (released 11 December 2025): average household water use rose from 168 kL to 174 kL per household from 2022–23 to 2023–24; household water use does not include self-extracted water such as rainwater tanks and bores",
        "Sydney Water, Rainwater tanks: a minimum tank size of 2,000 litres connected to 75% or more of the roof area as the smallest to consider; maximising the roof area flowing to the tank is the best way to maximise water savings, regardless of tank size",
        "US EPA WaterSense, Statistics and Facts: each American uses an average of 82 gallons of water a day at home (USGS, Estimated Use of Water in the United States in 2015)",
        "Station rainfall averages for 1991–2020: Met Office, UK climate averages (location-specific long-term averages), and NOAA NCEI, U.S. Climate Normals; in Australia, the Bureau of Meteorology's climate statistics for each station",
        "BRE, BREEAM Knowledge Base, KBCN1179 (18 September 2018): BS 8515:2009 (+A1:2013) has been withdrawn and replaced by BS EN 16941-1:2018, and the basic approach in BS EN 16941 is equivalent to the intermediate approach in BS 8515. BSI lists BS 8515:2009+A1:2013 as withdrawn on 19 July 2018, and BS EN 16941-1:2024 as the current edition"
      ],
      "vectors": [
        {
          "name": "The page's opening: 150 m² of roof, 600 mm a year at 0.7, four people at 38 L, 18 days",
          "inputs": {
            "roofArea": 150,
            "annualRainfall": 0.6,
            "runoffShare": 0.7,
            "people": 4,
            "usePerPerson": 38,
            "storageDays": 18
          },
          "expected": 2736,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Rainwater a year from the roof",
              "value": 62999.99999999999,
              "unit": "L"
            },
            {
              "label": "Rainwater the roof gives on an average day",
              "value": 172.60273972602738,
              "unit": "L"
            },
            {
              "label": "Rainwater the household uses a day",
              "value": 152,
              "unit": "L"
            },
            {
              "label": "Rainwater the household uses a year",
              "value": 55480,
              "unit": "L"
            },
            {
              "label": "Daily flow the tank is sized on, the smaller of the two",
              "value": 152,
              "unit": "L"
            },
            {
              "label": "The roof's year as a share of the year's use",
              "value": 113.55443403028116,
              "unit": "%"
            },
            {
              "label": "Days of use one average year's harvest supplies",
              "value": 414.47368421052624,
              "unit": "days"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Two people at 50 L a day for a 60-day dry season, 200 m² of roof in 1,200 mm a year at 0.8",
          "inputs": {
            "roofArea": 200,
            "annualRainfall": 1.2,
            "runoffShare": 0.8,
            "people": 2,
            "usePerPerson": 50,
            "storageDays": 60
          },
          "expected": 6000,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Rainwater a year from the roof",
              "value": 192000,
              "unit": "L"
            },
            {
              "label": "Rainwater the roof gives on an average day",
              "value": 526.027397260274,
              "unit": "L"
            },
            {
              "label": "Rainwater the household uses a day",
              "value": 100,
              "unit": "L"
            },
            {
              "label": "Rainwater the household uses a year",
              "value": 36500,
              "unit": "L"
            },
            {
              "label": "Daily flow the tank is sized on, the smaller of the two",
              "value": 100,
              "unit": "L"
            },
            {
              "label": "The roof's year as a share of the year's use",
              "value": 526.0273972602739,
              "unit": "%"
            },
            {
              "label": "Days of use one average year's harvest supplies",
              "value": 1920,
              "unit": "days"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A dry inland block, sized on the roof: 120 m² in 300 mm at 0.7, five people at 38 L, 90 days",
          "inputs": {
            "roofArea": 120,
            "annualRainfall": 0.3,
            "runoffShare": 0.7,
            "people": 5,
            "usePerPerson": 38,
            "storageDays": 90
          },
          "expected": 6213.6986,
          "toleranceDecimalPlaces": 3,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rainwater a year from the roof",
              "value": 25200,
              "unit": "L"
            },
            {
              "label": "Rainwater the roof gives on an average day",
              "value": 69.04109589041096,
              "unit": "L"
            },
            {
              "label": "Rainwater the household uses a day",
              "value": 190,
              "unit": "L"
            },
            {
              "label": "Rainwater the household uses a year",
              "value": 69350,
              "unit": "L"
            },
            {
              "label": "Daily flow the tank is sized on, the smaller of the two",
              "value": 69.04109589041096,
              "unit": "L"
            },
            {
              "label": "The roof's year as a share of the year's use",
              "value": 36.33741888968998,
              "unit": "%"
            },
            {
              "label": "Days of use one average year's harvest supplies",
              "value": 132.6315789473684,
              "unit": "days"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "raised-garden-bed-soil-calculator",
      "title": "Raised Garden Bed Soil Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/raised-garden-bed-soil-calculator/",
      "sources": [
        "Soil volume = bed length x width x height; a standard bagged garden soil or potting mix bag holds about 1.5 cubic ft in North America, while metric markets sell compost and topsoil in 50 litre bags (40 L and 60 L are also common)"
      ],
      "vectors": [
        {
          "name": "1.2x1.2m bed, 0.3m deep",
          "inputs": {
            "bedLength": 1.2,
            "bedWidth": 1.2,
            "bedHeight": 0.3
          },
          "expected": 11,
          "toleranceDecimalPlaces": 0,
          "unit": "x 1.5 cu ft bags",
          "confidence": "high",
          "steps": [
            {
              "label": "Soil volume",
              "value": 15.255936023683068,
              "unit": "ft³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2.4x1.2m bed, 0.3m deep",
          "inputs": {
            "bedLength": 2.4,
            "bedWidth": 1.2,
            "bedHeight": 0.3
          },
          "expected": 21,
          "toleranceDecimalPlaces": 0,
          "unit": "x 1.5 cu ft bags",
          "confidence": "high",
          "steps": [
            {
              "label": "Soil volume",
              "value": 30.511872047366136,
              "unit": "ft³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "range-hood-airflow-calculator",
      "title": "Range Hood and Cooker Hood Airflow Calculator (CFM, L/s and Make-Up Air)",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/range-hood-airflow-calculator/",
      "sources": [
        "International Code Council, 2021 International Residential Code, as adopted without amendment in the Colorado Division of Fire Prevention and Control Residential Code 2021: M1503.6 makeup air for an exhaust system capable of more than 400 cfm (0.19 m³/s) where a fuel-burning appliance that is neither direct-vent nor mechanical-draft is inside the dwelling unit's air barrier, at a rate approximately equal to the exhaust rate, with the space-cooling exception; Table M1505.4.4, kitchens 100 cfm intermittent or 25 cfm continuous (its footnote a states the bathroom rate at 0.25 in. w.c., 62 Pa; the kitchen row names no static pressure); M1505.3, fans listed and labeled for their airflow to ANSI/AMCA 210-ANSI/ASHRAE 51. Ohio's Residential Code (Ohio Adm. Code 4101:8-15-01, effective 1 July 2019) and the 2024 IRC carry the same 1503.6 wording",
        "National Research Council of Canada, National Building Code of Canada 2020 (NBC 2020), Division B: 9.32.3.7.(1)–(3), a supplemental exhaust fan of not less than 50 L/s in each kitchen and its exceptions; 9.32.3.8, protection against depressurization: with a fuel-fired space- or water-heating appliance that is not direct- or mechanically vented, outdoor makeup air from a fan rated at not less than the exhausting device's capacity and not more than 10% above it, interlocked with it, tempered to at least 12 °C or delivered to an unoccupied area; exceptions for solid fuel only, a CAN/CGSB-51.71 depressurization test, and radon subfloor systems",
        "HM Government, Approved Document F Volume 1: Dwellings (2021 edition, in force 15 June 2022): Table 1.1, intermittent extract of 30 l/s from a kitchen with a cooker hood extracting to the outside and 60 l/s without one; Table 1.2, a continuous high rate of 13 l/s; paragraph 1.21, a cooker hood 650 to 750 mm above the hob unless the maker specifies; paragraphs 0.17–0.18, fans and open-flued appliances under Approved Document J",
        "HM Government, Approved Document J (2010 edition incorporating 2010, 2013 and 2022 amendments), 1.20: where a kitchen contains an open-flued gas appliance, the kitchen extract fan's rate should not exceed 20 litres/second (72 m³/hour); 40 l/s for an oil appliance with a pressure-jet burner and 20 l/s with a vaporising burner; no extract in the same room as a solid fuel appliance; 1.21, a spillage test under the greatest depressurization",
        "Home Ventilating Institute, 'How Much Ventilation Do I Need?' (Home Ventilation Guide): range hoods against a wall 100 CFM recommended and 40 CFM minimum per linear foot of range; over an island 150 and 50; worked at 2.5 ft, 3 ft and 4 ft"
      ],
      "vectors": [
        {
          "name": "IRC: a 600 CFM hood with a natural-draft water heater inside the air barrier needs about 600 CFM (283.17 L/s) of make-up air",
          "inputs": {
            "code": "irc",
            "cooktopWidth": 0.762,
            "hoodPosition": "wall",
            "hoodRating": 283.16846580000004,
            "appliance": "heating"
          },
          "expected": 283.1685,
          "toleranceDecimalPlaces": 3,
          "unit": "L/s",
          "confidence": "medium",
          "steps": [
            {
              "label": "Hood airflow as rated",
              "value": 283.16846580000004,
              "unit": "L/s"
            },
            {
              "label": "Code minimum for a kitchen extract",
              "value": 47.19474432,
              "unit": "L/s"
            },
            {
              "label": "HVI's recommended airflow for this cooktop",
              "value": 117.9868608,
              "unit": "L/s"
            },
            {
              "label": "HVI's minimum for this cooktop",
              "value": 47.19474432,
              "unit": "L/s"
            },
            {
              "label": "Airflow at which the code's combustion-air rule starts",
              "value": 188.77897728,
              "unit": "L/s"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "IRC: the same hood in an all-electric home needs none under the 2021 text",
          "inputs": {
            "code": "irc",
            "cooktopWidth": 0.762,
            "hoodPosition": "wall",
            "hoodRating": 283.16846580000004,
            "appliance": "none"
          },
          "expected": 0,
          "toleranceDecimalPlaces": 6,
          "unit": "L/s",
          "confidence": "medium",
          "steps": [
            {
              "label": "Hood airflow as rated",
              "value": 283.16846580000004,
              "unit": "L/s"
            },
            {
              "label": "Code minimum for a kitchen extract",
              "value": 47.19474432,
              "unit": "L/s"
            },
            {
              "label": "HVI's recommended airflow for this cooktop",
              "value": 117.9868608,
              "unit": "L/s"
            },
            {
              "label": "HVI's minimum for this cooktop",
              "value": 47.19474432,
              "unit": "L/s"
            },
            {
              "label": "Airflow at which the code's combustion-air rule starts",
              "value": 188.77897728,
              "unit": "L/s"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "IRC: a hood rated exactly 400 CFM is not over the line",
          "inputs": {
            "code": "irc",
            "cooktopWidth": 0.762,
            "hoodPosition": "wall",
            "hoodRating": 188.7789772,
            "appliance": "heating"
          },
          "expected": 0,
          "toleranceDecimalPlaces": 6,
          "unit": "L/s",
          "confidence": "medium",
          "steps": [
            {
              "label": "Hood airflow as rated",
              "value": 188.7789772,
              "unit": "L/s"
            },
            {
              "label": "Code minimum for a kitchen extract",
              "value": 47.19474432,
              "unit": "L/s"
            },
            {
              "label": "HVI's recommended airflow for this cooktop",
              "value": 117.9868608,
              "unit": "L/s"
            },
            {
              "label": "HVI's minimum for this cooktop",
              "value": 47.19474432,
              "unit": "L/s"
            },
            {
              "label": "Airflow at which the code's combustion-air rule starts",
              "value": 188.77897728,
              "unit": "L/s"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "NBC: a 600 m³/h hood with naturally vented heating needs a make-up air fan of at least its 166.67 L/s",
          "inputs": {
            "code": "nbc",
            "cooktopWidth": 0.6,
            "hoodPosition": "wall",
            "hoodRating": 166.66666666666666,
            "appliance": "heating"
          },
          "expected": 166.6667,
          "toleranceDecimalPlaces": 3,
          "unit": "L/s",
          "confidence": "medium",
          "steps": [
            {
              "label": "Hood airflow as rated",
              "value": 166.66666666666666,
              "unit": "L/s"
            },
            {
              "label": "Code minimum for a kitchen extract",
              "value": 50,
              "unit": "L/s"
            },
            {
              "label": "HVI's recommended airflow for this cooktop",
              "value": 92.90303999999999,
              "unit": "L/s"
            },
            {
              "label": "HVI's minimum for this cooktop",
              "value": 37.161215999999996,
              "unit": "L/s"
            },
            {
              "label": "Airflow at which the code's combustion-air rule starts",
              "value": 0,
              "unit": "L/s"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "IRC: an island hood rated 600 CFM over a 36 in range, an open-flued appliance in the kitchen: make-up air about 600 CFM",
          "inputs": {
            "code": "irc",
            "cooktopWidth": 0.9144,
            "hoodPosition": "island",
            "hoodRating": 283.16846580000004,
            "appliance": "kitchen"
          },
          "expected": 283.1685,
          "toleranceDecimalPlaces": 3,
          "unit": "L/s",
          "confidence": "medium",
          "steps": [
            {
              "label": "Hood airflow as rated",
              "value": 283.16846580000004,
              "unit": "L/s"
            },
            {
              "label": "Code minimum for a kitchen extract",
              "value": 47.19474432,
              "unit": "L/s"
            },
            {
              "label": "HVI's recommended airflow for this cooktop",
              "value": 212.37634943999998,
              "unit": "L/s"
            },
            {
              "label": "HVI's minimum for this cooktop",
              "value": 70.79211648,
              "unit": "L/s"
            },
            {
              "label": "Airflow at which the code's combustion-air rule starts",
              "value": 188.77897728,
              "unit": "L/s"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "England: no make-up air figure, whatever the hood",
          "inputs": {
            "code": "adf",
            "cooktopWidth": 0.6,
            "hoodPosition": "wall",
            "hoodRating": 166.66666666666666,
            "appliance": "kitchen"
          },
          "expected": 0,
          "toleranceDecimalPlaces": 6,
          "unit": "L/s",
          "confidence": "medium",
          "steps": [
            {
              "label": "Hood airflow as rated",
              "value": 166.66666666666666,
              "unit": "L/s"
            },
            {
              "label": "Code minimum for a kitchen extract",
              "value": 30,
              "unit": "L/s"
            },
            {
              "label": "HVI's recommended airflow for this cooktop",
              "value": 92.90303999999999,
              "unit": "L/s"
            },
            {
              "label": "HVI's minimum for this cooktop",
              "value": 37.161215999999996,
              "unit": "L/s"
            },
            {
              "label": "Airflow at which the code's combustion-air rule starts",
              "value": 20,
              "unit": "L/s"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "rankine-passive-pressure-calculator",
      "title": "Rankine Passive Earth Pressure Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/rankine-passive-pressure-calculator/",
      "sources": [
        "Rankine passive earth pressure coefficient: Kp = tan²(45° + φ/2); passive pressure resultant: Pp = 0.5 x Kp x γ x H²"
      ],
      "vectors": [
        {
          "name": "0.6m depth, φ=30°, γ=18",
          "inputs": {
            "embedmentDepth": 0.6,
            "soilFrictionAngle": 30,
            "soilUnitWeight": 18
          },
          "expected": 9.72,
          "toleranceDecimalPlaces": 2,
          "unit": "kN/m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rankine passive coefficient (Kp)",
              "value": 2.9999999999999982
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "0.9m depth, φ=32°, γ=19",
          "inputs": {
            "embedmentDepth": 0.9,
            "soilFrictionAngle": 32,
            "soilUnitWeight": 19
          },
          "expected": 25.0441,
          "toleranceDecimalPlaces": 2,
          "unit": "kN/m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rankine passive coefficient (Kp)",
              "value": 3.254588303299862
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "rational-method-peak-runoff-calculator",
      "title": "Rational Method Peak Runoff Calculator",
      "url": "https://craftquantities.com/calculators/heavy-civil/rational-method-peak-runoff-calculator/",
      "sources": [
        "The Rational Method, Q = C x i x A, as adopted by local stormwater ordinances for small catchments; the runoff coefficients and the design-storm intensity belong to the reviewing jurisdiction and are entered here rather than supplied",
        "Intensity is read from the jurisdiction's intensity-duration-frequency curve at the design return period, for a storm duration equal to the catchment's time of concentration",
        "Worked in SI throughout — Q equals C times the intensity in metres per second times the area in square metres — then restated in the unit the visitor's market uses. No 1.008 or 1/360 shortcut factor is applied anywhere"
      ],
      "vectors": [
        {
          "name": "2,000 m² at C 0.8 plus 1,200 m² offsite at C 0.35, 75 mm/hr",
          "inputs": {
            "onsiteArea": 2000,
            "onsiteCoefficient": 0.8,
            "offsiteArea": 1200,
            "offsiteCoefficient": 0.35,
            "rainfallIntensity": 75
          },
          "expected": 1.48616,
          "toleranceDecimalPlaces": 3,
          "unit": "ft³/s",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total contributing area",
              "value": 3200,
              "unit": "m²"
            },
            {
              "label": "Area-weighted runoff coefficient",
              "value": 0.63125,
              "unit": "(C)"
            },
            {
              "label": "Contribution from beyond the boundary",
              "value": 0.30900333381302514,
              "unit": "ft³/s"
            },
            {
              "label": "Share of the peak arriving from offsite",
              "value": 20.792079207920793,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "5,000 m² at C 0.9 with no offsite area, 100 mm/hr",
          "inputs": {
            "onsiteArea": 5000,
            "onsiteCoefficient": 0.9,
            "offsiteArea": 0,
            "offsiteCoefficient": 0.3,
            "rainfallIntensity": 100
          },
          "expected": 4.41433,
          "toleranceDecimalPlaces": 3,
          "unit": "ft³/s",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total contributing area",
              "value": 5000,
              "unit": "m²"
            },
            {
              "label": "Area-weighted runoff coefficient",
              "value": 0.9,
              "unit": "(C)"
            },
            {
              "label": "Contribution from beyond the boundary",
              "value": 0,
              "unit": "ft³/s"
            },
            {
              "label": "Share of the peak arriving from offsite",
              "value": 0,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "rc-beam-moment-capacity-calculator",
      "title": "Reinforced Concrete Beam Moment Capacity Calculator (ACI 318)",
      "url": "https://craftquantities.com/calculators/materials-quantities/rc-beam-moment-capacity-calculator/",
      "sources": [
        "ACI 318 rectangular stress block method for a singly-reinforced beam: a = As x fy / (0.85 x f'c x b); Mn = As x fy x (d - a/2)"
      ],
      "vectors": [
        {
          "name": "over-reinforced: the headline becomes the section's ceiling, not a negative moment",
          "inputs": {
            "steelArea": 0.02,
            "steelYieldStrength": 275000000,
            "concreteStrength": 17000000,
            "beamWidth": 0.1,
            "effectiveDepth": 0.1
          },
          "expected": 4.31,
          "toleranceDecimalPlaces": 1,
          "unit": "kN·m",
          "confidence": "low",
          "steps": [
            {
              "label": "Stress block depth (a) of the section as entered",
              "value": 3806.2283737024222,
              "unit": "mm"
            },
            {
              "label": "Neutral axis depth (c) of the section as entered",
              "value": 4477.915733767556,
              "unit": "mm"
            },
            {
              "label": "Net tensile strain at nominal strength (εt) of the section as entered",
              "value": -0.0029330045454545456
            },
            {
              "label": "Design moment φMn of the ceiling section at φ = 0.83",
              "value": 3.577721107494722,
              "unit": "kN·m"
            },
            {
              "label": "Most steel this section can use singly-reinforced",
              "value": 191.4155844155844,
              "unit": "mm²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "transition zone: permitted, but phi is not 0.9",
          "inputs": {
            "steelArea": 0.0026,
            "steelYieldStrength": 420000000,
            "concreteStrength": 28000000,
            "beamWidth": 0.3,
            "effectiveDepth": 0.45
          },
          "expected": 407.89,
          "toleranceDecimalPlaces": 1,
          "unit": "kN·m",
          "confidence": "low",
          "steps": [
            {
              "label": "Stress block depth (a)",
              "value": 152.94117647058823,
              "unit": "mm"
            },
            {
              "label": "Neutral axis depth (c)",
              "value": 179.93079584775086,
              "unit": "mm"
            },
            {
              "label": "Net tensile strain at nominal strength (εt)",
              "value": 0.004502884615384616
            },
            {
              "label": "Design moment φMn at φ = 0.86",
              "value": 349.62449543610546,
              "unit": "kN·m"
            },
            {
              "label": "Most steel this section can use singly-reinforced",
              "value": 2786.785714285714,
              "unit": "mm²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "tension-controlled just above the 0.005 line",
          "inputs": {
            "steelArea": 0.0024,
            "steelYieldStrength": 420000000,
            "concreteStrength": 28000000,
            "beamWidth": 0.3,
            "effectiveDepth": 0.45
          },
          "expected": 382.45,
          "toleranceDecimalPlaces": 1,
          "unit": "kN·m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Stress block depth (a)",
              "value": 141.1764705882353,
              "unit": "mm"
            },
            {
              "label": "Neutral axis depth (c)",
              "value": 166.0899653979239,
              "unit": "mm"
            },
            {
              "label": "Net tensile strain at nominal strength (εt)",
              "value": 0.005128125
            },
            {
              "label": "Design moment φMn at φ = 0.90",
              "value": 344.2023529411764,
              "unit": "kN·m"
            },
            {
              "label": "Most steel this section can use singly-reinforced",
              "value": 2786.785714285714,
              "unit": "mm²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "As=1000mm², fy=420, f'c=28, b=300, d=450",
          "inputs": {
            "steelArea": 0.001,
            "steelYieldStrength": 420000000,
            "concreteStrength": 28000000,
            "beamWidth": 0.3,
            "effectiveDepth": 0.45
          },
          "expected": 176.65,
          "toleranceDecimalPlaces": -1,
          "unit": "kN·m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Stress block depth (a)",
              "value": 58.8235294117647,
              "unit": "mm"
            },
            {
              "label": "Neutral axis depth (c)",
              "value": 69.20415224913495,
              "unit": "mm"
            },
            {
              "label": "Net tensile strain at nominal strength (εt)",
              "value": 0.0165075
            },
            {
              "label": "Design moment φMn at φ = 0.90",
              "value": 158.98235294117646,
              "unit": "kN·m"
            },
            {
              "label": "Most steel this section can use singly-reinforced",
              "value": 2786.785714285714,
              "unit": "mm²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "As=1500mm², fy=420, f'c=30, b=350, d=500",
          "inputs": {
            "steelArea": 0.0015,
            "steelYieldStrength": 420000000,
            "concreteStrength": 30000000,
            "beamWidth": 0.35,
            "effectiveDepth": 0.5
          },
          "expected": 292.76,
          "toleranceDecimalPlaces": -1,
          "unit": "kN·m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Stress block depth (a)",
              "value": 70.58823529411765,
              "unit": "mm"
            },
            {
              "label": "Neutral axis depth (c)",
              "value": 84.46455505279035,
              "unit": "mm"
            },
            {
              "label": "Net tensile strain at nominal strength (εt)",
              "value": 0.014758928571428572
            },
            {
              "label": "Design moment φMn at φ = 0.90",
              "value": 263.48823529411766,
              "unit": "kN·m"
            },
            {
              "label": "Most steel this section can use singly-reinforced",
              "value": 3805.4846938775513,
              "unit": "mm²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "rc-column-axial-capacity-calculator",
      "title": "Reinforced Concrete Tied Column Axial Capacity Calculator (ACI 318)",
      "url": "https://craftquantities.com/calculators/materials-quantities/rc-column-axial-capacity-calculator/",
      "sources": [
        "ACI 318 maximum nominal axial capacity for tied columns: Pn(max) = 0.80 x [0.85 x f'c x (Ag - Ast) + fy x Ast]"
      ],
      "vectors": [
        {
          "name": "Ag=160,000mm², Ast=4,000mm², f'c=28, fy=420",
          "inputs": {
            "grossArea": 0.16,
            "steelArea": 0.004,
            "concreteStrength": 28000000,
            "steelYieldStrength": 420000000
          },
          "expected": 4314.24,
          "toleranceDecimalPlaces": -1,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Reinforcement ratio",
              "value": 2.5,
              "unit": "%"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ag=250,000mm², Ast=6,000mm², f'c=30, fy=420",
          "inputs": {
            "grossArea": 0.25,
            "steelArea": 0.006,
            "concreteStrength": 30000000,
            "steelYieldStrength": 420000000
          },
          "expected": 6993.6,
          "toleranceDecimalPlaces": -1,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Reinforcement ratio",
              "value": 2.4,
              "unit": "%"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "rebar-calculator",
      "title": "Rebar Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/rebar-calculator/",
      "sources": [
        "Rebar is most commonly sold in 20 ft lengths in North America and in 12 m mill lengths in metric markets (6 m being the common short length); grid spacing for residential slabs is commonly 12-18 in (300-450 mm) on-center in both directions",
        "A lap-splice allowance, 15% by default, is added to account for the overlap required where rebar sticks join end-to-end across a run longer than one stock length, per common ACI 318 lap-length practice"
      ],
      "vectors": [
        {
          "name": "4x3m slab, 18in grid",
          "inputs": {
            "slabLength": 4,
            "slabWidth": 3,
            "gridSpacingIn": 18
          },
          "expected": 11,
          "toleranceDecimalPlaces": 0,
          "unit": "x 20 ft sticks",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total bar length (incl. 15% lap splice)",
              "value": 207.51312335958005,
              "unit": "ft"
            },
            {
              "label": "Bars running lengthwise",
              "value": 7,
              "unit": "bars"
            },
            {
              "label": "Bars running widthwise",
              "value": 9,
              "unit": "bars"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "6x6m slab, 12in grid",
          "inputs": {
            "slabLength": 6,
            "slabWidth": 6,
            "gridSpacingIn": 12
          },
          "expected": 46,
          "toleranceDecimalPlaces": 0,
          "unit": "x 20 ft sticks",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total bar length (incl. 15% lap splice)",
              "value": 905.511811023622,
              "unit": "ft"
            },
            {
              "label": "Bars running lengthwise",
              "value": 20,
              "unit": "bars"
            },
            {
              "label": "Bars running widthwise",
              "value": 20,
              "unit": "bars"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "4x3m slab, 18in grid, no lap splice",
          "inputs": {
            "slabLength": 4,
            "slabWidth": 3,
            "gridSpacingIn": 18,
            "lapSplicePercent": 0
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "x 20 ft sticks",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total bar length (incl. 0% lap splice)",
              "value": 180.4461942257218,
              "unit": "ft"
            },
            {
              "label": "Bars running lengthwise",
              "value": 7,
              "unit": "bars"
            },
            {
              "label": "Bars running widthwise",
              "value": 9,
              "unit": "bars"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "rebar-chair-count-calculator",
      "title": "Rebar Chair and Bolster Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/rebar-chair-count-calculator/",
      "sources": [
        "CRSI Manual of Standard Practice — bar support types and classes, the practice of carrying a mat on a grid of individual chairs or on continuous bolsters, and the use of side-form spacers to hold cover on vertical faces",
        "The support spacing is an input rather than a built-in table because the figure that governs depends on bar size, mat stiffness and whether the mat is walked on. Take it from your bar-support supplier's data or from the spacing your specification names",
        "Chair count = (support lines along the mat) x (supported bars across it), which is arithmetic on the grid you enter rather than a published quantity"
      ],
      "vectors": [
        {
          "name": "12 x 8 m mat, 300 mm grid, supports at 1.2 m, every second bar",
          "inputs": {
            "matLength": 12,
            "matWidth": 8,
            "barSpacing": 0.3,
            "supportSpacing": 1.2,
            "supportEveryNth": "2",
            "matLayers": 1,
            "sideFormRun": 40,
            "sideFormSpacerSpacing": 1.2
          },
          "expected": 154,
          "toleranceDecimalPlaces": 0,
          "unit": "chairs",
          "confidence": "medium",
          "steps": [
            {
              "label": "Support lines along the mat",
              "value": 11,
              "unit": "lines"
            },
            {
              "label": "Bars across the mat at this spacing",
              "value": 27,
              "unit": "bars"
            },
            {
              "label": "Bars actually carried on each line",
              "value": 14,
              "unit": "bars"
            },
            {
              "label": "Chairs per mat",
              "value": 154,
              "unit": "chairs"
            },
            {
              "label": "Continuous bolster instead of point chairs",
              "value": 88,
              "unit": "m"
            },
            {
              "label": "Side-form spacers",
              "value": 34,
              "unit": "spacers"
            },
            {
              "label": "Mat area supported",
              "value": 96,
              "unit": "m²"
            },
            {
              "label": "Supports per unit of mat area",
              "value": 1.6041666666666667,
              "unit": "chairs/m²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "20 x 10 m two-layer mat, 200 mm grid, every bar supported",
          "inputs": {
            "matLength": 20,
            "matWidth": 10,
            "barSpacing": 0.2,
            "supportSpacing": 1,
            "supportEveryNth": "1",
            "matLayers": 2,
            "sideFormRun": 60,
            "sideFormSpacerSpacing": 1
          },
          "expected": 2142,
          "toleranceDecimalPlaces": 0,
          "unit": "chairs",
          "confidence": "medium",
          "steps": [
            {
              "label": "Support lines along the mat",
              "value": 21,
              "unit": "lines"
            },
            {
              "label": "Bars across the mat at this spacing",
              "value": 51,
              "unit": "bars"
            },
            {
              "label": "Bars actually carried on each line",
              "value": 51,
              "unit": "bars"
            },
            {
              "label": "Chairs per mat",
              "value": 1071,
              "unit": "chairs"
            },
            {
              "label": "Continuous bolster instead of point chairs",
              "value": 420,
              "unit": "m"
            },
            {
              "label": "Side-form spacers",
              "value": 61,
              "unit": "spacers"
            },
            {
              "label": "Mat area supported",
              "value": 200,
              "unit": "m²"
            },
            {
              "label": "Supports per unit of mat area",
              "value": 10.71,
              "unit": "chairs/m²"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "rebar-development-length-calculator",
      "title": "Rebar Development Length Calculator (ACI 318)",
      "url": "https://craftquantities.com/calculators/materials-quantities/rebar-development-length-calculator/",
      "sources": [
        "ACI 318 simplified development length equation for Case 1 (clear spacing >= db and clear cover >= db, or clear spacing >= 2db, with minimum code-specified ties/stirrups): ld = [fy x psi_t x psi_e / (K x lambda x sqrt(f'c))] x db, where K = 25 for #6 bars and smaller, K = 20 for #7 bars and larger"
      ],
      "vectors": [
        {
          "name": "a top bar takes 30% more (psi_t = 1.3)",
          "inputs": {
            "barSize": "5",
            "steelYieldStrength": 413685437.59007996,
            "concreteStrength": 27579029.172672,
            "lightweightFactor": 1,
            "castingPosition": "1.3",
            "coatingFactor": "1.0"
          },
          "expected": 30.84,
          "toleranceDecimalPlaces": 0,
          "unit": "in",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in mm",
              "value": 783.1380625406993,
              "unit": "mm"
            },
            {
              "label": "Formula constant (K) used",
              "value": 25
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "psi_t x psi_e is capped at 1.7, not 1.95",
          "inputs": {
            "barSize": "5",
            "steelYieldStrength": 413685437.59007996,
            "concreteStrength": 27579029.172672,
            "lightweightFactor": 1,
            "castingPosition": "1.3",
            "coatingFactor": "1.5"
          },
          "expected": 40.32,
          "toleranceDecimalPlaces": 1,
          "unit": "in",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in mm",
              "value": 1024.1036202455296,
              "unit": "mm"
            },
            {
              "label": "Formula constant (K) used",
              "value": 25
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "the ACI 12 in absolute minimum holds",
          "inputs": {
            "barSize": "3",
            "steelYieldStrength": 413685437.59007996,
            "concreteStrength": 55158058.345344,
            "lightweightFactor": 1,
            "castingPosition": "1.0",
            "coatingFactor": "1.0"
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "in",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in mm",
              "value": 304.79999999999995,
              "unit": "mm"
            },
            {
              "label": "Formula constant (K) used",
              "value": 25
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "#5 bar, Grade 60, f'c=4000 psi, normal weight",
          "inputs": {
            "barSize": "5",
            "steelYieldStrength": 413685437.59007996,
            "concreteStrength": 27579029.172672,
            "lightweightFactor": 1
          },
          "expected": 23.72,
          "toleranceDecimalPlaces": 1,
          "unit": "in",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in mm",
              "value": 602.4138942620763,
              "unit": "mm"
            },
            {
              "label": "Formula constant (K) used",
              "value": 25
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "#8 bar, Grade 60, f'c=3000 psi, normal weight",
          "inputs": {
            "barSize": "8",
            "steelYieldStrength": 413685437.59007996,
            "concreteStrength": 20684271.879504,
            "lightweightFactor": 1
          },
          "expected": 54.77,
          "toleranceDecimalPlaces": 1,
          "unit": "in",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in mm",
              "value": 1391.2152960631217,
              "unit": "mm"
            },
            {
              "label": "Formula constant (K) used",
              "value": 20
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "rebar-lap-splice-length-calculator",
      "title": "Rebar Lap Splice Length Calculator (ACI 318)",
      "url": "https://craftquantities.com/calculators/materials-quantities/rebar-lap-splice-length-calculator/",
      "sources": [
        "ACI 318 Building Code Requirements for Structural Concrete, tension lap splices: Class A is 1.0 x ld and Class B is 1.3 x ld, with 12 in as the floor for either. Class A applies only where the steel provided is at least twice the steel required AND no more than half the bars are spliced within the required lap length; every other case is Class B",
        "ACI 318 modification factors: the top-bar factor psi_t is 1.3 where more than 12 in of fresh concrete is cast below the bar, the epoxy factor psi_e is 1.5 where cover is under 3db or clear spacing under 6db and 1.2 otherwise, and their product is capped at 1.7",
        "ACI 318 compression lap splices: 0.0005 x fy x db for fy up to 60,000 psi and (0.0009 x fy - 24) x db above it, increased by one third where f'c is below 3,000 psi, and never less than 12 in. The splice class does not apply in compression",
        "The stagger reported is the lap length itself, derived from the code's own wording rather than from a published dimension: the percentage limit counts bars spliced WITHIN the required lap length, so offsetting a neighbour by one full lap puts it outside that window"
      ],
      "vectors": [
        {
          "name": "Class B tension lap, uncoated bottom bar",
          "inputs": {
            "developmentLength": 0.6024,
            "barSize": "5",
            "spliceType": "tension",
            "steelRatio": 1.5,
            "percentSpliced": 100,
            "topBar": "no",
            "epoxyCoating": "uncoated",
            "yieldStrength": 413685437.59007996,
            "concreteStrength": 27579029.172672
          },
          "expected": 30.83,
          "toleranceDecimalPlaces": 1,
          "unit": "in",
          "confidence": "medium",
          "steps": [
            {
              "label": "Splice class multiplier applied",
              "value": 1.3,
              "unit": "x ld"
            },
            {
              "label": "Combined top-bar and coating factor",
              "value": 1,
              "unit": "x ld"
            },
            {
              "label": "Minimum offset between adjacent splices",
              "value": 30.831496062992134,
              "unit": "in"
            },
            {
              "label": "Development length used",
              "value": 23.71653543307087,
              "unit": "in"
            },
            {
              "label": "Bar diameter",
              "value": 0.625,
              "unit": "in"
            },
            {
              "label": "Tension lap for this bar",
              "value": 30.831496062992134,
              "unit": "in"
            },
            {
              "label": "Compression lap for this bar",
              "value": 18.75,
              "unit": "in"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Class A tension lap, coated top bar hitting the 1.7 cap",
          "inputs": {
            "developmentLength": 0.6024,
            "barSize": "5",
            "spliceType": "tension",
            "steelRatio": 2.5,
            "percentSpliced": 50,
            "topBar": "yes",
            "epoxyCoating": "coated-close",
            "yieldStrength": 413685437.59007996,
            "concreteStrength": 27579029.172672
          },
          "expected": 40.32,
          "toleranceDecimalPlaces": 1,
          "unit": "in",
          "confidence": "medium",
          "steps": [
            {
              "label": "Splice class multiplier applied",
              "value": 1,
              "unit": "x ld"
            },
            {
              "label": "Combined top-bar and coating factor",
              "value": 1.7,
              "unit": "x ld"
            },
            {
              "label": "Minimum offset between adjacent splices",
              "value": 40.31811023622048,
              "unit": "in"
            },
            {
              "label": "Development length used",
              "value": 23.71653543307087,
              "unit": "in"
            },
            {
              "label": "Bar diameter",
              "value": 0.625,
              "unit": "in"
            },
            {
              "label": "Tension lap for this bar",
              "value": 40.31811023622048,
              "unit": "in"
            },
            {
              "label": "Compression lap for this bar",
              "value": 18.75,
              "unit": "in"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Compression lap, #8 Grade 60 bar in 4,000 psi concrete",
          "inputs": {
            "developmentLength": 0.6024,
            "barSize": "8",
            "spliceType": "compression",
            "steelRatio": 1.5,
            "percentSpliced": 100,
            "topBar": "no",
            "epoxyCoating": "uncoated",
            "yieldStrength": 413685437.59007996,
            "concreteStrength": 27579029.172672
          },
          "expected": 30,
          "toleranceDecimalPlaces": 2,
          "unit": "in",
          "confidence": "medium",
          "steps": [
            {
              "label": "Splice class multiplier applied",
              "value": 1.3,
              "unit": "x ld"
            },
            {
              "label": "Combined top-bar and coating factor",
              "value": 1,
              "unit": "x ld"
            },
            {
              "label": "Minimum offset between adjacent splices",
              "value": 30,
              "unit": "in"
            },
            {
              "label": "Development length used",
              "value": 23.71653543307087,
              "unit": "in"
            },
            {
              "label": "Bar diameter",
              "value": 1,
              "unit": "in"
            },
            {
              "label": "Tension lap for this bar",
              "value": 30.831496062992134,
              "unit": "in"
            },
            {
              "label": "Compression lap for this bar",
              "value": 30,
              "unit": "in"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "rebar-standard-hook-calculator",
      "title": "Rebar Standard Hook Development and Cut-Length Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/rebar-standard-hook-calculator/",
      "sources": [
        "ACI 318-19 development of standard hooks in tension: ldh = [fy x psi_e x psi_r x psi_o x psi_c / (55 x lambda x sqrt(f'c))] x db^1.5, worked in pounds and inches, and never less than the greater of 8db and 6 in. ldh is measured from the critical section to the far OUTSIDE of the bend",
        "Modification factors from the same provision: psi_e is 1.2 for epoxy-coated bar and 1.0 otherwise; psi_r is 1.0 where the hook is enclosed by confining reinforcement as the code requires and 1.6 where it is not; psi_o is 1.0 for a hook terminating inside a column core with at least 2.5 in of side cover or with side cover of at least 6db, and 1.25 otherwise; psi_c is f'c/15,000 + 0.6 below 6,000 psi and 1.0 at or above it",
        "ACI 318 Table 25.3.1 standard hook geometry: minimum inside bend diameter 6db for #3 through #8 and 8db for #9 through #11; tail extension 12db for a 90 degree hook, and the greater of 4db and 2.5 in for a 180 degree hook",
        "ACI 315 Guide to Presenting Reinforcing Steel Design Details — the detailing convention the cut-length allowance follows. The allowance itself is the developed centreline length of the bend arc plus the tail, which is geometry rather than a published table"
      ],
      "vectors": [
        {
          "name": "#5 hook, 4,000 psi, unconfined, ordinary cover",
          "inputs": {
            "barSize": "5",
            "hookAngle": "90",
            "concreteStrength": 27579029.172672,
            "yieldStrength": 413685437.59007996,
            "epoxyCoated": "no",
            "confinement": "unconfined",
            "location": "other",
            "lightweightFactor": 1
          },
          "expected": 14.77,
          "toleranceDecimalPlaces": 1,
          "unit": "in",
          "confidence": "medium",
          "steps": [
            {
              "label": "Minimum inside bend diameter",
              "value": 3.75,
              "unit": "in"
            },
            {
              "label": "Tail extension beyond the bend",
              "value": 7.5,
              "unit": "in"
            },
            {
              "label": "Bar consumed by the bend and tail",
              "value": 10.936116964863835,
              "unit": "in"
            },
            {
              "label": "Code floor for this bar",
              "value": 6,
              "unit": "in"
            },
            {
              "label": "Length the equation alone gives",
              "value": 14.772727272727272,
              "unit": "in"
            },
            {
              "label": "Concrete strength factor applied",
              "value": 0.8666666666666667,
              "unit": "x ldh"
            },
            {
              "label": "Confinement and location factors combined",
              "value": 2,
              "unit": "x ldh"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "#8 hook, 3,000 psi, confined inside a column core",
          "inputs": {
            "barSize": "8",
            "hookAngle": "180",
            "concreteStrength": 20684271.879504,
            "yieldStrength": 413685437.59007996,
            "epoxyCoated": "no",
            "confinement": "confined",
            "location": "column-core",
            "lightweightFactor": 1
          },
          "expected": 15.93,
          "toleranceDecimalPlaces": 1,
          "unit": "in",
          "confidence": "medium",
          "steps": [
            {
              "label": "Minimum inside bend diameter",
              "value": 6,
              "unit": "in"
            },
            {
              "label": "Tail extension beyond the bend",
              "value": 4,
              "unit": "in"
            },
            {
              "label": "Bar consumed by the bend and tail",
              "value": 14.995574287564276,
              "unit": "in"
            },
            {
              "label": "Code floor for this bar",
              "value": 8,
              "unit": "in"
            },
            {
              "label": "Length the equation alone gives",
              "value": 15.933747127423013,
              "unit": "in"
            },
            {
              "label": "Concrete strength factor applied",
              "value": 0.8,
              "unit": "x ldh"
            },
            {
              "label": "Confinement and location factors combined",
              "value": 1,
              "unit": "x ldh"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "rebar-weight-calculator",
      "title": "Rebar Weight Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/rebar-weight-calculator/",
      "sources": [
        "Standard rebar weight per foot (ASTM A615): #3 = 0.376 lb/ft, #4 = 0.668 lb/ft, #5 = 1.043 lb/ft, #6 = 1.502 lb/ft"
      ],
      "vectors": [
        {
          "name": "#4 rebar, 100ft total",
          "inputs": {
            "rebarSize": "4",
            "totalLength": 30.48
          },
          "expected": 66.8,
          "toleranceDecimalPlaces": 0.5,
          "unit": "lb",
          "confidence": "high",
          "steps": [
            {
              "label": "Total length",
              "value": 100,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "#5 rebar, 200ft total",
          "inputs": {
            "rebarSize": "5",
            "totalLength": 60.96
          },
          "expected": 208.6,
          "toleranceDecimalPlaces": 1,
          "unit": "lb",
          "confidence": "high",
          "steps": [
            {
              "label": "Total length",
              "value": 200,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "rebate-adjusted-cost-calculator",
      "title": "Rebate-Adjusted Cost Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/rebate-adjusted-cost-calculator/",
      "sources": [
        "Net cost = gross cost - (gross cost x rebate percent) - flat rebate amount"
      ],
      "vectors": [
        {
          "name": "$10,000 gross, 30% rebate, no flat amount",
          "inputs": {
            "grossCost": 10000,
            "rebatePercent": 30,
            "flatRebateAmount": 0
          },
          "expected": 7000,
          "toleranceDecimalPlaces": 0,
          "unit": "$ (net cost)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total rebates/credits",
              "value": 3000,
              "unit": "$"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "$15,000 gross, 26% rebate, $500 flat rebate",
          "inputs": {
            "grossCost": 15000,
            "rebatePercent": 26,
            "flatRebateAmount": 500
          },
          "expected": 10600,
          "toleranceDecimalPlaces": 0,
          "unit": "$ (net cost)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total rebates/credits",
              "value": 4400,
              "unit": "$"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "rectangle-diagonal-squaring-calculator",
      "title": "Court Diagonal and Squaring Triangle Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/rectangle-diagonal-squaring-calculator/",
      "sources": [
        "The diagonal of a rectangle is the square root of length squared plus width squared. Where one end is displaced by an offset, the two diagonals become the roots of (length + offset)² + width² and (length − offset)² + width², and their difference is what a tape reads as out of square.",
        "ITF Rules of Tennis — court dimensions, which publish the corner-to-corner diagonal alongside the sides as a check dimension for exactly this reason",
        "FIBA Official Basketball Rules, court dimensions (28 m by 15 m for a full-size court); FIVB Official Volleyball Rules (18 m by 9 m); BWF Laws of Badminton (13.4 m by 6.1 m for doubles)",
        "The squaring triangle is a scaled 3-4-5, whose numbers are read in whatever unit the crew is working in — the ratio is what makes the angle, not the unit."
      ],
      "vectors": [
        {
          "name": "Full-size basketball court, 28 m by 15 m",
          "inputs": {
            "courtLength": 28,
            "courtWidth": 15,
            "squaringMultiple": "4",
            "cornerOffset": 0.005
          },
          "expected": 31.76476,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Diagonal difference at the permitted offset",
              "value": 8.814799675931795,
              "unit": "mm"
            },
            {
              "label": "Short leg of the squaring triangle",
              "value": 12,
              "unit": "ft"
            },
            {
              "label": "Long leg of the squaring triangle",
              "value": 16,
              "unit": "ft"
            },
            {
              "label": "Hypotenuse of the squaring triangle",
              "value": 20,
              "unit": "ft"
            },
            {
              "label": "Perimeter of the rectangle",
              "value": 86,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Doubles tennis court, 23.77 m by 10.97 m",
          "inputs": {
            "courtLength": 23.77,
            "courtWidth": 10.97,
            "squaringMultiple": "4",
            "cornerOffset": 0.003
          },
          "expected": 26.179263,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Diagonal difference at the permitted offset",
              "value": 5.447823378499805,
              "unit": "mm"
            },
            {
              "label": "Short leg of the squaring triangle",
              "value": 12,
              "unit": "ft"
            },
            {
              "label": "Long leg of the squaring triangle",
              "value": 16,
              "unit": "ft"
            },
            {
              "label": "Hypotenuse of the squaring triangle",
              "value": 20,
              "unit": "ft"
            },
            {
              "label": "Perimeter of the rectangle",
              "value": 69.48,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Badminton doubles court, 13.4 m by 6.1 m",
          "inputs": {
            "courtLength": 13.4,
            "courtWidth": 6.1,
            "squaringMultiple": "2",
            "cornerOffset": 0.005
          },
          "expected": 14.723111,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Diagonal difference at the permitted offset",
              "value": 9.101337204247884,
              "unit": "mm"
            },
            {
              "label": "Short leg of the squaring triangle",
              "value": 6,
              "unit": "ft"
            },
            {
              "label": "Long leg of the squaring triangle",
              "value": 8,
              "unit": "ft"
            },
            {
              "label": "Hypotenuse of the squaring triangle",
              "value": 10,
              "unit": "ft"
            },
            {
              "label": "Perimeter of the rectangle",
              "value": 39,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Volleyball court, 18 m by 9 m",
          "inputs": {
            "courtLength": 18,
            "courtWidth": 9,
            "squaringMultiple": "3",
            "cornerOffset": 0.005
          },
          "expected": 20.124612,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Diagonal difference at the permitted offset",
              "value": 8.94427185478719,
              "unit": "mm"
            },
            {
              "label": "Short leg of the squaring triangle",
              "value": 9,
              "unit": "ft"
            },
            {
              "label": "Long leg of the squaring triangle",
              "value": 12,
              "unit": "ft"
            },
            {
              "label": "Hypotenuse of the squaring triangle",
              "value": 15,
              "unit": "ft"
            },
            {
              "label": "Perimeter of the rectangle",
              "value": 54,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "rectangular-duct-surface-area-calculator",
      "title": "Rectangular Sheet Metal Duct Surface Area Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/rectangular-duct-surface-area-calculator/",
      "sources": [
        "Surface area = 2 × (Width + Height) × Length (perimeter × length), the standard method for straight rectangular duct fabrication material takeoff — fittings/transitions are taken off separately by piece. A waste/scrap allowance (commonly ~10% for shop-fabricated duct, more for field fabrication) is a standard estimating convention, not a code requirement."
      ],
      "vectors": [
        {
          "name": "0.4m x 0.3m x 10m, 10% waste",
          "inputs": {
            "ductWidth": 0.4,
            "ductHeight": 0.3,
            "ductLength": 10,
            "wastePercent": 10
          },
          "expected": 15.4,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Base surface area (before waste)",
              "value": 14,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "0.6m x 0.4m x 15m, 10% waste",
          "inputs": {
            "ductWidth": 0.6,
            "ductHeight": 0.4,
            "ductLength": 15,
            "wastePercent": 10
          },
          "expected": 33,
          "toleranceDecimalPlaces": 0,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Base surface area (before waste)",
              "value": 30,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "recycled-aggregate-cubic-yards-to-tons-calculator",
      "title": "Recycled Aggregate Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/recycled-aggregate-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 1.3 short tons per cubic yard",
        "Density varies with moisture, grading and composition — the supplier's ticket weight governs"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 13,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.3,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 130,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.3,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "recycled-aggregate-tons-to-cubic-yards-calculator",
      "title": "Recycled Aggregate Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/recycled-aggregate-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 1.3 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 7.692307692307692,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.7692307692307692,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 76.92307692307692,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.7692307692307692,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "refinance-break-even-calculator",
      "title": "Refinance Break-Even Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/refinance-break-even-calculator/",
      "sources": [
        "Break-even months = total switching cost ÷ monthly payment saving. Standard consumer-finance comparison method.",
        "Fees vary widely by lender and market; all are user inputs here"
      ],
      "vectors": [
        {
          "name": "200k, 6.5% to 5%, 22 years, 3000 cost",
          "inputs": {
            "balance": 200000,
            "currentRatePercent": 6.5,
            "newRatePercent": 5,
            "remainingYears": 22,
            "switchingCost": 3000
          },
          "expected": 17.1119,
          "toleranceDecimalPlaces": 4,
          "unit": "months to break even",
          "confidence": "high",
          "steps": [
            {
              "label": "Current payment",
              "value": 1425.8779856619021,
              "unit": "currency"
            },
            {
              "label": "New payment",
              "value": 1250.5615098669075,
              "unit": "currency"
            },
            {
              "label": "Monthly saving",
              "value": 175.31647579499463,
              "unit": "currency"
            },
            {
              "label": "Saving over the remaining term",
              "value": 43283.54960987858,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "No fee breaks even immediately",
          "inputs": {
            "balance": 200000,
            "currentRatePercent": 6.5,
            "newRatePercent": 5,
            "remainingYears": 22,
            "switchingCost": 0
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "months to break even",
          "confidence": "high",
          "steps": [
            {
              "label": "Current payment",
              "value": 1425.8779856619021,
              "unit": "currency"
            },
            {
              "label": "New payment",
              "value": 1250.5615098669075,
              "unit": "currency"
            },
            {
              "label": "Monthly saving",
              "value": 175.31647579499463,
              "unit": "currency"
            },
            {
              "label": "Saving over the remaining term",
              "value": 46283.54960987858,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A worse rate never breaks even — same 0 as the instant case above, distinguished by the unit rather than the number",
          "inputs": {
            "balance": 200000,
            "currentRatePercent": 5,
            "newRatePercent": 6.5,
            "remainingYears": 22,
            "switchingCost": 3000
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "— never breaks even at this rate",
          "confidence": "low",
          "steps": [
            {
              "label": "Current payment",
              "value": 1250.5615098669075,
              "unit": "currency"
            },
            {
              "label": "New payment",
              "value": 1425.8779856619021,
              "unit": "currency"
            },
            {
              "label": "Monthly saving",
              "value": -175.31647579499463,
              "unit": "currency"
            },
            {
              "label": "Saving over the remaining term",
              "value": -49283.54960987858,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Doubling the fee doubles the months",
          "inputs": {
            "balance": 200000,
            "currentRatePercent": 6.5,
            "newRatePercent": 5,
            "remainingYears": 22,
            "switchingCost": 6000
          },
          "expected": 34.2238,
          "toleranceDecimalPlaces": 4,
          "unit": "months to break even",
          "confidence": "high",
          "steps": [
            {
              "label": "Current payment",
              "value": 1425.8779856619021,
              "unit": "currency"
            },
            {
              "label": "New payment",
              "value": 1250.5615098669075,
              "unit": "currency"
            },
            {
              "label": "Monthly saving",
              "value": 175.31647579499463,
              "unit": "currency"
            },
            {
              "label": "Saving over the remaining term",
              "value": 40283.54960987858,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "refrigerant-line-charge-adjustment-calculator",
      "title": "Refrigerant Line Length Charge Adjustment Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/refrigerant-line-charge-adjustment-calculator/",
      "sources": [
        "Manufacturer installation instructions: additional charge = (measured liquid line length − the standard line length the unit ships charged for) × the published charge rate per unit of liquid line. Both the standard length and the rate are model-specific and are entered here from that document",
        "AHRI 210/240, Performance Rating of Unitary Air-Conditioning and Air-Source Heat Pump Equipment — split systems are rated with a standard length of interconnecting tubing, which is why a longer field run needs charge added rather than being an equivalent installation",
        "The default charge rate and standard length are PLACEHOLDERS of the right order, not published values. Replace both with the figures printed for the model being installed"
      ],
      "vectors": [
        {
          "name": "20 m run against a 7.62 m standard at 0.0558 kg/m",
          "inputs": {
            "liquidLineLength": 20,
            "standardLineLength": 7.62,
            "chargeRate": 0.0558,
            "liquidLineInnerDiameter": 0.008
          },
          "expected": 0.690804,
          "toleranceDecimalPlaces": 4,
          "unit": "kg",
          "confidence": "high",
          "steps": [
            {
              "label": "Line length beyond the factory-charge standard",
              "value": 12.379999999999999,
              "unit": "m"
            },
            {
              "label": "Internal volume of the run beyond standard",
              "value": 622.2866728230663,
              "unit": "cm³"
            },
            {
              "label": "Charge rate applied",
              "value": 0.0558,
              "unit": "kg/m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "30 m run against the same standard",
          "inputs": {
            "liquidLineLength": 30,
            "standardLineLength": 7.62,
            "chargeRate": 0.0558,
            "liquidLineInnerDiameter": 0.008
          },
          "expected": 1.248804,
          "toleranceDecimalPlaces": 4,
          "unit": "kg",
          "confidence": "high",
          "steps": [
            {
              "label": "Line length beyond the factory-charge standard",
              "value": 22.38,
              "unit": "m"
            },
            {
              "label": "Internal volume of the run beyond standard",
              "value": 1124.941497397433,
              "unit": "cm³"
            },
            {
              "label": "Charge rate applied",
              "value": 0.0558,
              "unit": "kg/m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Run shorter than standard — charge comes out, not in",
          "inputs": {
            "liquidLineLength": 5,
            "standardLineLength": 7.62,
            "chargeRate": 0.0558,
            "liquidLineInnerDiameter": 0.008
          },
          "expected": -0.146196,
          "toleranceDecimalPlaces": 4,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Line length beyond the factory-charge standard",
              "value": -2.62,
              "unit": "m"
            },
            {
              "label": "Internal volume of the run beyond standard",
              "value": 0,
              "unit": "cm³"
            },
            {
              "label": "Charge rate applied",
              "value": 0.0558,
              "unit": "kg/m"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "refrigerant-line-equivalent-length-calculator",
      "title": "Refrigerant Line Total Equivalent Length Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/refrigerant-line-equivalent-length-calculator/",
      "sources": [
        "ASHRAE Handbook — Refrigeration, System Practices for Halocarbon Refrigerants: a route is assessed as total equivalent length, the measured straight run plus the straight-pipe length each fitting is worth, and that total is what the equipment's published maximum limits",
        "Crane Technical Paper No. 410, Flow of Fluids Through Valves, Fittings and Pipe — equivalent length expressed as a multiple of inside diameter: L/D = 20 for a long-radius 90° bend, L/D = 30 for a short-radius one. A trap is counted as four 90° bends, which is its geometry rather than a coefficient",
        "Service valve and filter-drier allowances are NOT supplied by this calculator. They are entered from the component's own data sheet, because a drier's pressure drop is a property of that drier and no generic figure for it would be honest",
        "Distinct from this site's Pipe Fitting Equivalent Length Calculator, which totals only the fittings in a hydronic run from equivalent lengths the user already holds. This one adds the measured straight length, counts refrigeration-specific components, and reports the result against the equipment's published limit"
      ],
      "vectors": [
        {
          "name": "25 m straight, 4 long-radius, 2 short-radius, 1 trap, 17.5 mm bore",
          "inputs": {
            "straightLength": 25,
            "longRadiusElbows": 4,
            "shortRadiusElbows": 2,
            "traps": 1,
            "innerDiameter": 0.0175,
            "componentAllowance": 2,
            "publishedMaximum": 45
          },
          "expected": 31.55,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Straight run measured",
              "value": 25,
              "unit": "m"
            },
            {
              "label": "Equivalent length added by bends and traps",
              "value": 4.550000000000001,
              "unit": "m"
            },
            {
              "label": "Component allowance entered",
              "value": 2,
              "unit": "m"
            },
            {
              "label": "Remaining allowance against the published maximum",
              "value": 13.45,
              "unit": "m"
            },
            {
              "label": "Share of the published maximum used",
              "value": 70.11111111111111,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "12 m straight, 6 long-radius bends only, 22.2 mm bore",
          "inputs": {
            "straightLength": 12,
            "longRadiusElbows": 6,
            "shortRadiusElbows": 0,
            "traps": 0,
            "innerDiameter": 0.0222,
            "componentAllowance": 1.5,
            "publishedMaximum": 30
          },
          "expected": 16.164,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Straight run measured",
              "value": 12,
              "unit": "m"
            },
            {
              "label": "Equivalent length added by bends and traps",
              "value": 2.664,
              "unit": "m"
            },
            {
              "label": "Component allowance entered",
              "value": 1.5,
              "unit": "m"
            },
            {
              "label": "Remaining allowance against the published maximum",
              "value": 13.835999999999999,
              "unit": "m"
            },
            {
              "label": "Share of the published maximum used",
              "value": 53.88,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Bare 10 m run with no fittings at all",
          "inputs": {
            "straightLength": 10,
            "longRadiusElbows": 0,
            "shortRadiusElbows": 0,
            "traps": 0,
            "innerDiameter": 0.01,
            "componentAllowance": 0,
            "publishedMaximum": 20
          },
          "expected": 10,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Straight run measured",
              "value": 10,
              "unit": "m"
            },
            {
              "label": "Equivalent length added by bends and traps",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Component allowance entered",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Remaining allowance against the published maximum",
              "value": 10,
              "unit": "m"
            },
            {
              "label": "Share of the published maximum used",
              "value": 50,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "refrigerant-line-size-calculator",
      "title": "Refrigerant Line Set Nominal Size Reference Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/refrigerant-line-size-calculator/",
      "sources": [
        "Typical nominal suction and liquid line sizes for residential R-410A split-system air conditioners/heat pumps at standard line lengths (~25-50 ft, minimal elevation change), consistent across common manufacturer engineering/installation data (e.g. Carrier, Trane, Rheem residential split-system manuals). Longer line lengths, larger elevation differences, or different refrigerants require the specific equipment manufacturer's line sizing chart — this is a typical-case reference only, not a substitute for it."
      ],
      "vectors": [
        {
          "name": "3-ton split system",
          "inputs": {
            "coolingCapacity": "3"
          },
          "expected": 0.875,
          "toleranceDecimalPlaces": 3,
          "unit": "in (nominal suction line OD)",
          "confidence": "low",
          "steps": [
            {
              "label": "Liquid line size",
              "value": 0.375,
              "unit": "in (nominal liquid line OD)"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "5-ton split system",
          "inputs": {
            "coolingCapacity": "5"
          },
          "expected": 1.125,
          "toleranceDecimalPlaces": 3,
          "unit": "in (nominal suction line OD)",
          "confidence": "low",
          "steps": [
            {
              "label": "Liquid line size",
              "value": 0.375,
              "unit": "in (nominal liquid line OD)"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "reinforced-wall-internal-sliding-calculator",
      "title": "Reinforced SRW Internal Sliding Check",
      "url": "https://craftquantities.com/calculators/heavy-civil/reinforced-wall-internal-sliding-calculator/",
      "sources": [
        "NCMA Design Manual for Segmental Retaining Walls sets out the internal stability checks for a geogrid-reinforced SRW, of which sliding of the mass above a reinforcement level is one; connection strength and pullout are separate checks it also requires and this page does not perform",
        "Rankine active earth pressure, Ka = tan squared (45 degrees minus phi/2), with thrust on the back of the reinforced mass taken as 0.5 x Ka x gamma x h squared plus Ka x q x h for a uniform surcharge",
        "Sliding resistance at a reinforcement level is the weight of the mass above it times a coefficient of interaction from the geogrid manufacturer's direct-shear data — that is a tested interface property, not a soil friction angle, and it is entered here rather than derived"
      ],
      "vectors": [
        {
          "name": "4.5 m wall, grids at 0.6 m, 3.2 m long, 1950 kg/m³, 12 kPa surcharge, phi 32",
          "inputs": {
            "wallHeight": 4.5,
            "gridSpacing": 0.6,
            "reinforcedLength": 3.2,
            "massUnitWeight": 1950,
            "surcharge": 12000,
            "soilFrictionAngle": 32,
            "gridFrictionCoefficient": 0.6,
            "baseFrictionCoefficient": 0.55
          },
          "expected": 1.99063,
          "toleranceDecimalPlaces": 3,
          "unit": "(factor of safety)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Factor of safety against sliding at the levelling pad",
              "value": 1.990630839376757,
              "unit": "(factor of safety)"
            },
            {
              "label": "Factor of safety at reinforcement level 1",
              "value": 2.4243517769899894,
              "unit": "(factor of safety)"
            },
            {
              "label": "Factor of safety at reinforcement level 2",
              "value": 2.743693112000893,
              "unit": "(factor of safety)"
            },
            {
              "label": "Factor of safety at reinforcement level 3",
              "value": 3.1599260217164504,
              "unit": "(factor of safety)"
            },
            {
              "label": "Factor of safety at reinforcement level 4",
              "value": 3.725033515805278,
              "unit": "(factor of safety)"
            },
            {
              "label": "Factor of safety at reinforcement level 5",
              "value": 4.536282677587011,
              "unit": "(factor of safety)"
            },
            {
              "label": "Reinforcement levels in the wall",
              "value": 7,
              "unit": "levels"
            },
            {
              "label": "Driving thrust at the governing plane",
              "value": 76.08336995694212,
              "unit": "kN/m"
            },
            {
              "label": "Active earth pressure coefficient",
              "value": 0.3072585245224685,
              "unit": "(Ka)"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "6 m wall, no surcharge, weak grid interface — the lowest grid layer governs",
          "inputs": {
            "wallHeight": 6,
            "gridSpacing": 0.6,
            "reinforcedLength": 4.2,
            "massUnitWeight": 1900,
            "surcharge": 0,
            "soilFrictionAngle": 30,
            "gridFrictionCoefficient": 0.35,
            "baseFrictionCoefficient": 0.6
          },
          "expected": 1.63333,
          "toleranceDecimalPlaces": 4,
          "unit": "(factor of safety)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Factor of safety against sliding at the levelling pad",
              "value": 2.520000000000001,
              "unit": "(factor of safety)"
            },
            {
              "label": "Factor of safety at reinforcement level 1",
              "value": 1.6333333333333335,
              "unit": "(factor of safety)"
            },
            {
              "label": "Factor of safety at reinforcement level 2",
              "value": 1.8375000000000001,
              "unit": "(factor of safety)"
            },
            {
              "label": "Factor of safety at reinforcement level 3",
              "value": 2.1000000000000005,
              "unit": "(factor of safety)"
            },
            {
              "label": "Factor of safety at reinforcement level 4",
              "value": 2.45,
              "unit": "(factor of safety)"
            },
            {
              "label": "Factor of safety at reinforcement level 5",
              "value": 2.940000000000001,
              "unit": "(factor of safety)"
            },
            {
              "label": "Reinforcement levels in the wall",
              "value": 9,
              "unit": "levels"
            },
            {
              "label": "Driving thrust at the governing plane",
              "value": 90.55460609999999,
              "unit": "kN/m"
            },
            {
              "label": "Active earth pressure coefficient",
              "value": 0.3333333333333333,
              "unit": "(Ka)"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "relief-valve-discharge-calculator",
      "title": "Backflow Preventer Relief Valve Discharge Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/relief-valve-discharge-calculator/",
      "sources": [
        "Discharge flow = orifice area × discharge coefficient × √(2×g×head), the standard orifice discharge equation applied to a relief valve opening, used to size the air gap fitting or floor drain that must handle the preventer's full relief discharge"
      ],
      "vectors": [
        {
          "name": "500mm² orifice, 3m head (2.30 L/s = 138.10 L/min)",
          "inputs": {
            "orificeArea": 0.0005,
            "dischargeCoefficient": 0.6,
            "head": 3
          },
          "expected": 138.0965,
          "toleranceDecimalPlaces": 1,
          "unit": "L/min",
          "confidence": "medium",
          "steps": [
            {
              "label": "Discharge velocity",
              "value": 4.603216266915991,
              "unit": "m/s"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "700mm² orifice, 4m head (3.72 L/s = 223.24 L/min)",
          "inputs": {
            "orificeArea": 0.0007,
            "dischargeCoefficient": 0.6,
            "head": 4
          },
          "expected": 223.2441,
          "toleranceDecimalPlaces": 1,
          "unit": "L/min",
          "confidence": "medium",
          "steps": [
            {
              "label": "Discharge velocity",
              "value": 5.315336301684025,
              "unit": "m/s"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "render-plaster-mix-calculator",
      "title": "Render and Plaster Mix Calculator, Coat by Coat",
      "url": "https://craftquantities.com/calculators/materials-quantities/render-plaster-mix-calculator/",
      "sources": [
        "The strength ladder — each successive coat no stronger and no thicker than the one beneath — is the governing rule in BS EN 13914-1 for external rendering and in BS 5262's traditional guidance, and the same principle underlies ASTM C926's three-coat sequence for portland cement plaster",
        "Coat thicknesses are the working bands those documents describe: a first coat around 8 to 12 mm, a second coat thinner than the first, and a finish coat of a few millimetres. ASTM C926's nominal three-coat build on metal lath is 3/8 in scratch, 3/8 in brown and 1/8 in finish, which is the same shape in imperial",
        "Ratios are parts by volume of cement to lime to sand and are typical working mixes rather than a specification. A render is specified against its BACKGROUND and its exposure, and any specification you hold governs over a general figure including these",
        "Wet yield is taken as the sand volume, because the binder paste occupies the voids between sand grains rather than adding to them — the convention the mortar mix page states"
      ],
      "vectors": [
        {
          "name": "50 m² in two coats at 15% waste",
          "inputs": {
            "area": 50,
            "system": "two-coat",
            "wastePercent": 15
          },
          "expected": 10.83,
          "toleranceDecimalPlaces": 1,
          "unit": "ft³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Base coat, 0.39 in at 1 : 0.5 : 4.5",
              "value": 20.30593336485594,
              "unit": "ft³"
            },
            {
              "label": "Finish coat, 0.24 in at 1 : 1 : 6",
              "value": 12.183560018913564,
              "unit": "ft³"
            },
            {
              "label": "Cement, all coats",
              "value": 6.543022973120246,
              "unit": "ft³"
            },
            {
              "label": "Hydrated lime, all coats",
              "value": 4.28680815480292,
              "unit": "ft³"
            },
            {
              "label": "Sand, all coats",
              "value": 32.4894933837695,
              "unit": "ft³"
            },
            {
              "label": "94 lb cement sacks",
              "value": 7,
              "unit": "sacks"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "the same wall in three coats",
          "inputs": {
            "area": 50,
            "system": "three-coat",
            "wastePercent": 15
          },
          "expected": 14.21,
          "toleranceDecimalPlaces": 1,
          "unit": "ft³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Scratch coat, 0.39 in at 1 : 0.5 : 4.5",
              "value": 20.30593336485594,
              "unit": "ft³"
            },
            {
              "label": "Float coat, 0.31 in at 1 : 1 : 6",
              "value": 16.24474669188475,
              "unit": "ft³"
            },
            {
              "label": "Finish coat, 0.12 in at 1 : 2 : 9",
              "value": 6.091780009456782,
              "unit": "ft³"
            },
            {
              "label": "Cement, all coats",
              "value": 7.896751864110642,
              "unit": "ft³"
            },
            {
              "label": "Hydrated lime, all coats",
              "value": 6.317401491288513,
              "unit": "ft³"
            },
            {
              "label": "Sand, all coats",
              "value": 42.64246006619747,
              "unit": "ft³"
            },
            {
              "label": "94 lb cement sacks",
              "value": 8,
              "unit": "sacks"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "a small lime render with no waste allowance",
          "inputs": {
            "area": 10,
            "system": "lime-two-coat",
            "wastePercent": 0
          },
          "expected": 2.26,
          "toleranceDecimalPlaces": 1,
          "unit": "ft³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Base coat, 0.47 in at 1 lime : 3 sand",
              "value": 4.237760006578631,
              "unit": "ft³"
            },
            {
              "label": "Finish coat, 0.24 in at 1 lime : 2.5 sand",
              "value": 2.1188800032893154,
              "unit": "ft³"
            },
            {
              "label": "Cement, all coats",
              "value": 0,
              "unit": "ft³"
            },
            {
              "label": "Hydrated lime, all coats",
              "value": 2.2601386701752695,
              "unit": "ft³"
            },
            {
              "label": "Sand, all coats",
              "value": 6.356640009867946,
              "unit": "ft³"
            },
            {
              "label": "94 lb cement sacks",
              "value": 0,
              "unit": "sacks"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "renovation-budget-calculator",
      "title": "Renovation Budget Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/renovation-budget-calculator/",
      "sources": [
        "A 10-20% contingency buffer for unexpected costs is standard, widely-recommended practice for renovation budgeting"
      ],
      "vectors": [
        {
          "name": "Standard project with 15% contingency",
          "inputs": {
            "materialsCost": 5000,
            "laborCost": 4000,
            "permitsCost": 300,
            "contingencyPercent": 15
          },
          "expected": 10695,
          "toleranceDecimalPlaces": 0,
          "unit": "USD",
          "confidence": "high",
          "steps": [
            {
              "label": "Materials",
              "value": 5000,
              "unit": "USD"
            },
            {
              "label": "Labor",
              "value": 4000,
              "unit": "USD"
            },
            {
              "label": "Permits & fees",
              "value": 300,
              "unit": "USD"
            },
            {
              "label": "Subtotal",
              "value": 9300,
              "unit": "USD"
            },
            {
              "label": "Contingency buffer",
              "value": 1395,
              "unit": "USD"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "DIY project, no labor, 10% contingency",
          "inputs": {
            "materialsCost": 2000,
            "laborCost": 0,
            "permitsCost": 100,
            "contingencyPercent": 10
          },
          "expected": 2310,
          "toleranceDecimalPlaces": 0,
          "unit": "USD",
          "confidence": "high",
          "steps": [
            {
              "label": "Materials",
              "value": 2000,
              "unit": "USD"
            },
            {
              "label": "Labor",
              "value": 0,
              "unit": "USD"
            },
            {
              "label": "Permits & fees",
              "value": 100,
              "unit": "USD"
            },
            {
              "label": "Subtotal",
              "value": 2100,
              "unit": "USD"
            },
            {
              "label": "Contingency buffer",
              "value": 210,
              "unit": "USD"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "rent-vs-buy-calculator",
      "title": "Rent vs Buy Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/rent-vs-buy-calculator/",
      "sources": [
        "Maintenance is commonly budgeted at 1% of property value per year — a widely used planning figure, not a measured average",
        "All rates, taxes and charges are user inputs; none are assumed from any market"
      ],
      "vectors": [
        {
          "name": "1500 rent vs 350k at 15% deposit",
          "inputs": {
            "monthlyRent": 1500,
            "propertyPrice": 350000,
            "depositPercent": 15,
            "annualRatePercent": 5,
            "years": 25,
            "annualOwnershipCosts": 4000,
            "maintenancePercent": 1
          },
          "expected": 864.1554,
          "toleranceDecimalPlaces": 2,
          "unit": "currency/month more to own",
          "confidence": "medium",
          "steps": [
            {
              "label": "Mortgage payment",
              "value": 1739.1553734862407,
              "unit": "currency"
            },
            {
              "label": "Tax, insurance and charges",
              "value": 333.3333333333333,
              "unit": "currency"
            },
            {
              "label": "Maintenance provision",
              "value": 291.6666666666667,
              "unit": "currency"
            },
            {
              "label": "Total cost of owning",
              "value": 2364.1553734862405,
              "unit": "currency"
            },
            {
              "label": "Rent",
              "value": 1500,
              "unit": "currency"
            },
            {
              "label": "Deposit required up front",
              "value": 52500,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A bigger deposit narrows the gap",
          "inputs": {
            "monthlyRent": 1500,
            "propertyPrice": 350000,
            "depositPercent": 40,
            "annualRatePercent": 5,
            "years": 25,
            "annualOwnershipCosts": 4000,
            "maintenancePercent": 1
          },
          "expected": 352.6391,
          "toleranceDecimalPlaces": 2,
          "unit": "currency/month more to own",
          "confidence": "medium",
          "steps": [
            {
              "label": "Mortgage payment",
              "value": 1227.6390871667581,
              "unit": "currency"
            },
            {
              "label": "Tax, insurance and charges",
              "value": 333.3333333333333,
              "unit": "currency"
            },
            {
              "label": "Maintenance provision",
              "value": 291.6666666666667,
              "unit": "currency"
            },
            {
              "label": "Total cost of owning",
              "value": 1852.6390871667581,
              "unit": "currency"
            },
            {
              "label": "Rent",
              "value": 1500,
              "unit": "currency"
            },
            {
              "label": "Deposit required up front",
              "value": 140000,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "High rent makes owning cheaper",
          "inputs": {
            "monthlyRent": 2600,
            "propertyPrice": 350000,
            "depositPercent": 15,
            "annualRatePercent": 5,
            "years": 25,
            "annualOwnershipCosts": 4000,
            "maintenancePercent": 1
          },
          "expected": -235.8446,
          "toleranceDecimalPlaces": 2,
          "unit": "currency/month more to own",
          "confidence": "medium",
          "steps": [
            {
              "label": "Mortgage payment",
              "value": 1739.1553734862407,
              "unit": "currency"
            },
            {
              "label": "Tax, insurance and charges",
              "value": 333.3333333333333,
              "unit": "currency"
            },
            {
              "label": "Maintenance provision",
              "value": 291.6666666666667,
              "unit": "currency"
            },
            {
              "label": "Total cost of owning",
              "value": 2364.1553734862405,
              "unit": "currency"
            },
            {
              "label": "Rent",
              "value": 2600,
              "unit": "currency"
            },
            {
              "label": "Deposit required up front",
              "value": 52500,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ignoring upkeep flatters ownership",
          "inputs": {
            "monthlyRent": 1500,
            "propertyPrice": 350000,
            "depositPercent": 15,
            "annualRatePercent": 5,
            "years": 25,
            "annualOwnershipCosts": 0,
            "maintenancePercent": 0
          },
          "expected": 239.1554,
          "toleranceDecimalPlaces": 2,
          "unit": "currency/month more to own",
          "confidence": "medium",
          "steps": [
            {
              "label": "Mortgage payment",
              "value": 1739.1553734862407,
              "unit": "currency"
            },
            {
              "label": "Tax, insurance and charges",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Maintenance provision",
              "value": 0,
              "unit": "currency"
            },
            {
              "label": "Total cost of owning",
              "value": 1739.1553734862407,
              "unit": "currency"
            },
            {
              "label": "Rent",
              "value": 1500,
              "unit": "currency"
            },
            {
              "label": "Deposit required up front",
              "value": 52500,
              "unit": "currency"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "reservoir-drawdown-time-calculator",
      "title": "Permeable Reservoir Drawdown Time Calculator",
      "url": "https://craftquantities.com/calculators/sustainability-compliance/reservoir-drawdown-time-calculator/",
      "sources": [
        "ASTM D3385, Standard Test Method for Infiltration Rate of Soils in Field Using Double-Ring Infiltrometer, is one accepted way of measuring the subgrade rate; the measurement is taken at the elevation of the finished excavation, not at the ground surface",
        "The safety factor applied to the measured rate and the permitted maximum drawdown time are both set by the governing stormwater manual, which is why both are entered here rather than supplied by this page",
        "Drawdown time = depth of stored water divided by the design infiltration rate; the stored water depth is the aggregate depth multiplied by its void ratio, since only the voids hold water"
      ],
      "vectors": [
        {
          "name": "450 mm reservoir, 0.4 voids, 12 mm/hr measured, factor 2, no underdrain",
          "inputs": {
            "reservoirDepth": 0.45,
            "voidRatio": 0.4,
            "measuredInfiltrationRate": 12,
            "safetyFactor": 2,
            "underdrain": "none",
            "underdrainInvertHeight": 0.15,
            "permittedDrawdownHours": 48
          },
          "expected": 30,
          "toleranceDecimalPlaces": 3,
          "unit": "hours",
          "confidence": "medium",
          "steps": [
            {
              "label": "Design infiltration rate after the safety factor",
              "value": 6,
              "unit": "mm/hr"
            },
            {
              "label": "Depth of stored water that must infiltrate",
              "value": 180,
              "unit": "mm"
            },
            {
              "label": "Permitted maximum drawdown",
              "value": 48,
              "unit": "hours"
            },
            {
              "label": "Margin against the permitted maximum",
              "value": 18,
              "unit": "hours"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "600 mm reservoir with an underdrain at 200 mm, 0.35 voids, 25 mm/hr, factor 2.5",
          "inputs": {
            "reservoirDepth": 0.6,
            "voidRatio": 0.35,
            "measuredInfiltrationRate": 25,
            "safetyFactor": 2.5,
            "underdrain": "present",
            "underdrainInvertHeight": 0.2,
            "permittedDrawdownHours": 48
          },
          "expected": 7,
          "toleranceDecimalPlaces": 3,
          "unit": "hours",
          "confidence": "medium",
          "steps": [
            {
              "label": "Design infiltration rate after the safety factor",
              "value": 10,
              "unit": "mm/hr"
            },
            {
              "label": "Depth of stored water that must infiltrate",
              "value": 70,
              "unit": "mm"
            },
            {
              "label": "Permitted maximum drawdown",
              "value": 48,
              "unit": "hours"
            },
            {
              "label": "Margin against the permitted maximum",
              "value": 41,
              "unit": "hours"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "resilient-channel-spacing-calculator",
      "title": "Resilient Channel (RC-1) Spacing & Linear Footage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/resilient-channel-spacing-calculator/",
      "sources": [
        "Resilient channel rows = ceil(run height/length ÷ spacing) + 1, installed perpendicular to studs/joists to acoustically decouple the gypsum board layer; total length = rows × the perpendicular run length"
      ],
      "vectors": [
        {
          "name": "2.7m run, 0.6m spacing, 10m parallel length",
          "inputs": {
            "perpendicularRun": 2.7,
            "channelSpacing": 0.6,
            "parallelRunLength": 10
          },
          "expected": 60,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Number of channel rows",
              "value": 6
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "3.0m run, 0.61m spacing, 12m parallel length",
          "inputs": {
            "perpendicularRun": 3,
            "channelSpacing": 0.61,
            "parallelRunLength": 12
          },
          "expected": 72,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Number of channel rows",
              "value": 6
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "resilient-clip-screw-calculator",
      "title": "Resilient Clip & Furring Channel Screw Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/resilient-clip-screw-calculator/",
      "sources": [
        "Total screws = clip count × screws per clip, the standard fastening-count method for resilient clip/furring channel sound-isolation systems"
      ],
      "vectors": [
        {
          "name": "40 clips, 2 screws each",
          "inputs": {
            "clipCount": 40,
            "screwsPerClip": 2
          },
          "expected": 80,
          "toleranceDecimalPlaces": 0,
          "unit": "screws",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "55 clips, 3 screws each",
          "inputs": {
            "clipCount": 55,
            "screwsPerClip": 3
          },
          "expected": 165,
          "toleranceDecimalPlaces": 0,
          "unit": "screws",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "resilient-flooring-calculator",
      "title": "LVP, Laminate & Engineered Floor Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/resilient-flooring-calculator/",
      "sources": [
        "Manufacturers typically specify 5-10% waste for a straight lay, and 15% or more for a diagonal lay or a room with many angles",
        "Expansion gap of 8-12 mm at every perimeter and fixed obstruction — standard click-system installation instruction"
      ],
      "vectors": [
        {
          "name": "25 m² simple room, 2.2 m² packs",
          "inputs": {
            "area": 25,
            "packCoverage": 2.2,
            "layout": "simple"
          },
          "expected": 13,
          "toleranceDecimalPlaces": 0,
          "unit": "packs",
          "confidence": "high",
          "steps": [
            {
              "label": "Area with waste",
              "value": 26.75,
              "unit": "m²"
            },
            {
              "label": "Coverage ordered",
              "value": 28.6,
              "unit": "m²"
            },
            {
              "label": "Waste applied",
              "value": 7,
              "unit": "%"
            },
            {
              "label": "Spare after the job",
              "value": 3.6000000000000014,
              "unit": "m²"
            },
            {
              "label": "Area in ft²",
              "value": 269.0977604177431,
              "unit": "ft²"
            }
          ],
          "includesAllowance": {
            "label": "Layout waste",
            "percent": 7,
            "base": 11.363636363636363
          },
          "basis": "ambiguous"
        },
        {
          "name": "A complex room needs more",
          "inputs": {
            "area": 100,
            "packCoverage": 2.2,
            "layout": "complex"
          },
          "expected": 51,
          "toleranceDecimalPlaces": 0,
          "unit": "packs",
          "confidence": "high",
          "steps": [
            {
              "label": "Area with waste",
              "value": 112.00000000000001,
              "unit": "m²"
            },
            {
              "label": "Coverage ordered",
              "value": 112.2,
              "unit": "m²"
            },
            {
              "label": "Waste applied",
              "value": 12,
              "unit": "%"
            },
            {
              "label": "Spare after the job",
              "value": 12.200000000000003,
              "unit": "m²"
            },
            {
              "label": "Area in ft²",
              "value": 1076.3910416709723,
              "unit": "ft²"
            }
          ],
          "includesAllowance": {
            "label": "Layout waste",
            "percent": 12,
            "base": 45.45454545454545
          },
          "basis": "ambiguous"
        },
        {
          "name": "A diagonal lay needs more again",
          "inputs": {
            "area": 25,
            "packCoverage": 2.2,
            "layout": "diagonal"
          },
          "expected": 14,
          "toleranceDecimalPlaces": 0,
          "unit": "packs",
          "confidence": "high",
          "steps": [
            {
              "label": "Area with waste",
              "value": 29.5,
              "unit": "m²"
            },
            {
              "label": "Coverage ordered",
              "value": 30.800000000000004,
              "unit": "m²"
            },
            {
              "label": "Waste applied",
              "value": 18,
              "unit": "%"
            },
            {
              "label": "Spare after the job",
              "value": 5.800000000000004,
              "unit": "m²"
            },
            {
              "label": "Area in ft²",
              "value": 269.0977604177431,
              "unit": "ft²"
            }
          ],
          "includesAllowance": {
            "label": "Layout waste",
            "percent": 18,
            "base": 11.363636363636363
          },
          "basis": "ambiguous"
        },
        {
          "name": "Larger packs need fewer",
          "inputs": {
            "area": 25,
            "packCoverage": 3.5,
            "layout": "simple"
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "packs",
          "confidence": "high",
          "steps": [
            {
              "label": "Area with waste",
              "value": 26.75,
              "unit": "m²"
            },
            {
              "label": "Coverage ordered",
              "value": 28,
              "unit": "m²"
            },
            {
              "label": "Waste applied",
              "value": 7,
              "unit": "%"
            },
            {
              "label": "Spare after the job",
              "value": 3,
              "unit": "m²"
            },
            {
              "label": "Area in ft²",
              "value": 269.0977604177431,
              "unit": "ft²"
            }
          ],
          "includesAllowance": {
            "label": "Layout waste",
            "percent": 7,
            "base": 7.142857142857143
          },
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "resin-bound-surfacing-calculator",
      "title": "Resin Bound Surfacing Calculator",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/resin-bound-surfacing-calculator/",
      "sources": [
        "Stone = area × laid depth × the loose bulk density of that specific dried aggregate, a measured property — BS EN 1097-3 (loose bulk density and voids) or ASTM C29 (bulk density and voids in aggregate) — not a figure from a generic coverage chart",
        "Two-part resin bound systems are supplied as matched kits — Part A, Part B and the stone they are proportioned for — and are mixed whole in a forced-action mixer; kits = stone needed ÷ the stone one kit is matched to, rounded up, never split",
        "The trade's working rule is a laid depth of at least three times the largest stone: commonly 1–3 mm stone at around 12–15 mm for footpaths, and 2–5 mm stone at around 18 mm for domestic drives. The binding figure is the system's own data sheet; there is no British Standard for resin bound surfacing"
      ],
      "vectors": [
        {
          "name": "A 40 m² drive at 18 mm in 2–5 mm stone, 1,550 kg/m³, 100 kg kits, 5% allowance",
          "inputs": {
            "area": 40,
            "depth": 0.018,
            "largestStone": 0.005,
            "bulkDensity": 1550,
            "stonePerKit": 100,
            "wastePercent": 5
          },
          "expected": 12,
          "toleranceDecimalPlaces": 2,
          "unit": "kits",
          "confidence": "medium",
          "steps": [
            {
              "label": "Stone at the laid depth",
              "value": 1116,
              "unit": "kg"
            },
            {
              "label": "Stone with the allowance",
              "value": 1171.8,
              "unit": "kg"
            },
            {
              "label": "Stone in whole kits",
              "value": 1200,
              "unit": "kg"
            },
            {
              "label": "Area one kit covers at this depth",
              "value": 3.5842293906810037,
              "unit": "m²"
            },
            {
              "label": "Least depth for this stone — three times its largest size",
              "value": 15,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A 12 m² footpath at 15 mm in 1–3 mm stone",
          "inputs": {
            "area": 12,
            "depth": 0.015,
            "largestStone": 0.003,
            "bulkDensity": 1550,
            "stonePerKit": 100,
            "wastePercent": 5
          },
          "expected": 3,
          "toleranceDecimalPlaces": 2,
          "unit": "kits",
          "confidence": "medium",
          "steps": [
            {
              "label": "Stone at the laid depth",
              "value": 279,
              "unit": "kg"
            },
            {
              "label": "Stone with the allowance",
              "value": 292.95,
              "unit": "kg"
            },
            {
              "label": "Stone in whole kits",
              "value": 300,
              "unit": "kg"
            },
            {
              "label": "Area one kit covers at this depth",
              "value": 4.301075268817204,
              "unit": "m²"
            },
            {
              "label": "Least depth for this stone — three times its largest size",
              "value": 9.000000000000002,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "30 m² with no allowance — 837 kg of stone is still nine whole kits",
          "inputs": {
            "area": 30,
            "depth": 0.018,
            "largestStone": 0.005,
            "bulkDensity": 1550,
            "stonePerKit": 100,
            "wastePercent": 0
          },
          "expected": 9,
          "toleranceDecimalPlaces": 2,
          "unit": "kits",
          "confidence": "medium",
          "steps": [
            {
              "label": "Stone at the laid depth",
              "value": 836.9999999999999,
              "unit": "kg"
            },
            {
              "label": "Stone with the allowance",
              "value": 836.9999999999999,
              "unit": "kg"
            },
            {
              "label": "Stone in whole kits",
              "value": 900,
              "unit": "kg"
            },
            {
              "label": "Area one kit covers at this depth",
              "value": 3.5842293906810037,
              "unit": "m²"
            },
            {
              "label": "Least depth for this stone — three times its largest size",
              "value": 15,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A denser stone at 1,650 kg/m³ over the same 40 m² takes a kit more",
          "inputs": {
            "area": 40,
            "depth": 0.018,
            "largestStone": 0.005,
            "bulkDensity": 1650,
            "stonePerKit": 100,
            "wastePercent": 5
          },
          "expected": 13,
          "toleranceDecimalPlaces": 2,
          "unit": "kits",
          "confidence": "medium",
          "steps": [
            {
              "label": "Stone at the laid depth",
              "value": 1188,
              "unit": "kg"
            },
            {
              "label": "Stone with the allowance",
              "value": 1247.4,
              "unit": "kg"
            },
            {
              "label": "Stone in whole kits",
              "value": 1300,
              "unit": "kg"
            },
            {
              "label": "Area one kit covers at this depth",
              "value": 3.367003367003367,
              "unit": "m²"
            },
            {
              "label": "Least depth for this stone — three times its largest size",
              "value": 15,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "retaining-wall-block-calculator",
      "title": "Retaining Wall Block Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/retaining-wall-block-calculator/",
      "sources": [
        "Block count = wall face area / block face area, with a waste allowance for cuts at ends and corners"
      ],
      "vectors": [
        {
          "name": "6x0.6m wall, 18x6in blocks",
          "inputs": {
            "wallLength": 6,
            "wallHeight": 0.6,
            "blockFaceWidth": 0.4572,
            "blockFaceHeight": 0.1524
          },
          "expected": 57,
          "toleranceDecimalPlaces": 2,
          "unit": "blocks",
          "confidence": "high",
          "steps": [
            {
              "label": "Wall face area",
              "value": 38.750077500154994,
              "unit": "sq ft"
            },
            {
              "label": "Courses (rows)",
              "value": 4,
              "unit": "courses"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "10x0.9m wall, 16x8in blocks",
          "inputs": {
            "wallLength": 10,
            "wallHeight": 0.9,
            "blockFaceWidth": 0.4064,
            "blockFaceHeight": 0.2032
          },
          "expected": 120,
          "toleranceDecimalPlaces": -1,
          "unit": "blocks",
          "confidence": "high",
          "steps": [
            {
              "label": "Wall face area",
              "value": 96.8751937503875,
              "unit": "sq ft"
            },
            {
              "label": "Courses (rows)",
              "value": 5,
              "unit": "courses"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "6x0.6m wall, 18x6in blocks, no cut allowance",
          "inputs": {
            "wallLength": 6,
            "wallHeight": 0.6,
            "blockFaceWidth": 0.4572,
            "blockFaceHeight": 0.1524,
            "wastePercent": 0
          },
          "expected": 52,
          "toleranceDecimalPlaces": 2,
          "unit": "blocks",
          "confidence": "high",
          "steps": [
            {
              "label": "Wall face area",
              "value": 38.750077500154994,
              "unit": "sq ft"
            },
            {
              "label": "Courses (rows)",
              "value": 4,
              "unit": "courses"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "retaining-wall-drainage-gravel-calculator",
      "title": "Retaining Wall Drainage Gravel Calculator",
      "url": "https://craftquantities.com/calculators/auto-utility/retaining-wall-drainage-gravel-calculator/",
      "sources": [
        "Drainage zone volume = wall length x wall height x drainage zone width"
      ],
      "vectors": [
        {
          "name": "15m wall, 1.2m tall, 12in drainage zone",
          "inputs": {
            "wallLength": 15,
            "wallHeight": 1.2,
            "drainageZoneWidth": 0.3
          },
          "expected": 7.769,
          "toleranceDecimalPlaces": 3,
          "unit": "cubic yards",
          "confidence": "medium",
          "steps": [
            {
              "label": "Drainage zone volume (before waste)",
              "value": 7.062933344297717,
              "unit": "yd³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "25m wall, 1.5m tall, 12in drainage zone",
          "inputs": {
            "wallLength": 25,
            "wallHeight": 1.5,
            "drainageZoneWidth": 0.3
          },
          "expected": 16.185,
          "toleranceDecimalPlaces": 2,
          "unit": "cubic yards",
          "confidence": "medium",
          "steps": [
            {
              "label": "Drainage zone volume (before waste)",
              "value": 14.714444467286912,
              "unit": "yd³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15m wall, 1.2m tall, no allowance",
          "inputs": {
            "wallLength": 15,
            "wallHeight": 1.2,
            "drainageZoneWidth": 0.3,
            "wastePercent": 0
          },
          "expected": 7.063,
          "toleranceDecimalPlaces": 3,
          "unit": "cubic yards",
          "confidence": "medium",
          "steps": [
            {
              "label": "Drainage zone volume (before waste)",
              "value": 7.062933344297717,
              "unit": "yd³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "retaining-wall-footing-calculator",
      "title": "Retaining Wall Footing Sizing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/retaining-wall-footing-calculator/",
      "sources": [
        "Rule-of-thumb preliminary footing sizing: base width = 0.4-0.8x the retained wall height (0.6x used as the default here) — a starting point only, not a substitute for the full stability check in the Retaining Wall Preliminary Stability Calculator"
      ],
      "vectors": [
        {
          "name": "1.5m wall, 0.6 ratio, 10m length, 0.3m thick",
          "inputs": {
            "wallHeight": 1.5,
            "baseWidthRatio": 0.6,
            "footingLength": 10,
            "footingThickness": 0.3,
            "wasteFactorPercent": 5
          },
          "expected": 2.835,
          "toleranceDecimalPlaces": 3,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Recommended footing width",
              "value": 0.8999999999999999,
              "unit": "m"
            },
            {
              "label": "Base volume (no waste)",
              "value": 2.6999999999999997,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2.0m wall, 0.65 ratio, 15m length, 0.35m thick",
          "inputs": {
            "wallHeight": 2,
            "baseWidthRatio": 0.65,
            "footingLength": 15,
            "footingThickness": 0.35,
            "wasteFactorPercent": 8
          },
          "expected": 7.371,
          "toleranceDecimalPlaces": 3,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Recommended footing width",
              "value": 1.3,
              "unit": "m"
            },
            {
              "label": "Base volume (no waste)",
              "value": 6.824999999999999,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "retaining-wall-stability-calculator",
      "title": "Retaining Wall Preliminary Stability Check",
      "url": "https://craftquantities.com/calculators/materials-quantities/retaining-wall-stability-calculator/",
      "sources": [
        "Rankine active earth pressure coefficient: Ka = tan²(45° - φ/2), where φ is the soil's angle of internal friction",
        "Active earth pressure resultant: Pa = 0.5 x Ka x soil unit weight x height², acting at height/3 above the base",
        "Standard preliminary safety factor threshold for both sliding and overturning checks is 1.5, per common geotechnical practice"
      ],
      "vectors": [
        {
          "name": "1.2m wall, 30° friction angle, standard assumptions",
          "inputs": {
            "wallHeight": 1.2,
            "soilFrictionAngle": 30,
            "soilUnitWeight": 18,
            "wallWeightPerLength": 15,
            "baseWidth": 0.6,
            "frictionCoefficient": 0.5
          },
          "expected": 1.736,
          "toleranceDecimalPlaces": 1,
          "unit": "(safety factor)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rankine active pressure coefficient (Ka)",
              "value": 0.3333333333333334
            },
            {
              "label": "Active pressure resultant",
              "value": 4.320000000000001,
              "unit": "kN/m"
            },
            {
              "label": "Sliding safety factor",
              "value": 1.7361111111111107
            },
            {
              "label": "Overturning safety factor",
              "value": 2.604166666666666
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "1.8m wall, 25° friction angle, same wall design (undersized for taller wall)",
          "inputs": {
            "wallHeight": 1.8,
            "soilFrictionAngle": 25,
            "soilUnitWeight": 19,
            "wallWeightPerLength": 15,
            "baseWidth": 0.6,
            "frictionCoefficient": 0.5
          },
          "expected": 0.6,
          "toleranceDecimalPlaces": 2,
          "unit": "(safety factor)",
          "confidence": "low",
          "steps": [
            {
              "label": "Rankine active pressure coefficient (Ka)",
              "value": 0.4058585172053274
            },
            {
              "label": "Active pressure resultant",
              "value": 12.492325159579977,
              "unit": "kN/m"
            },
            {
              "label": "Sliding safety factor",
              "value": 0.6003686186673169
            },
            {
              "label": "Overturning safety factor",
              "value": 0.6003686186673169
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "retaining-wall-stem-volume-calculator",
      "title": "Poured Retaining Wall Stem Concrete Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/retaining-wall-stem-volume-calculator/",
      "sources": [
        "Stem volume = length x height x average thickness. A stem with a linear batter has a trapezoidal cross-section, whose area is the height times the mean of the top and bottom thicknesses, so the average thickness is exact rather than an approximation",
        "Formwork contact area = 2 x length x height for a stem formed on both faces — the figure form hire and release agent are priced against, and the area the ACI 347 pour-rate pressure check applies to"
      ],
      "vectors": [
        {
          "name": "10m battered wall, 2m high, 300mm at the base tapering to 200mm",
          "inputs": {
            "stemLength": 10,
            "stemHeight": 2,
            "thicknessBottom": 0.3,
            "thicknessTop": 0.2,
            "wasteFactorPercent": 5
          },
          "expected": 5.25,
          "toleranceDecimalPlaces": 3,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Average stem thickness",
              "value": 25,
              "unit": "cm"
            },
            {
              "label": "Stem volume (no waste)",
              "value": 5,
              "unit": "m³"
            },
            {
              "label": "Formwork contact area (both faces)",
              "value": 40,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "15m parallel-sided wall, 2.5m high, 350mm throughout",
          "inputs": {
            "stemLength": 15,
            "stemHeight": 2.5,
            "thicknessBottom": 0.35,
            "thicknessTop": 0.35,
            "wasteFactorPercent": 8
          },
          "expected": 14.175,
          "toleranceDecimalPlaces": 3,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Average stem thickness",
              "value": 35,
              "unit": "cm"
            },
            {
              "label": "Stem volume (no waste)",
              "value": 13.125,
              "unit": "m³"
            },
            {
              "label": "Formwork contact area (both faces)",
              "value": 75,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "no waste, so the result is the bare trapezoidal prism",
          "inputs": {
            "stemLength": 8,
            "stemHeight": 1.5,
            "thicknessBottom": 0.4,
            "thicknessTop": 0.2,
            "wasteFactorPercent": 0
          },
          "expected": 3.6,
          "toleranceDecimalPlaces": 3,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Average stem thickness",
              "value": 30.000000000000004,
              "unit": "cm"
            },
            {
              "label": "Stem volume (no waste)",
              "value": 3.6000000000000005,
              "unit": "m³"
            },
            {
              "label": "Formwork contact area (both faces)",
              "value": 24,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "retroreflective-bead-calculator",
      "title": "Roadway Striping Retroreflective Drop-On Bead Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/retroreflective-bead-calculator/",
      "sources": [
        "Bead mass = striped line area × the bead application rate (kg per m² of line), a separate material from the paint itself, applied while the paint is still wet to create retroreflectivity"
      ],
      "vectors": [
        {
          "name": "500m line, 0.1m wide, 0.18 kg/m²",
          "inputs": {
            "lineLength": 500,
            "lineWidth": 0.1,
            "beadApplicationRate": 0.18
          },
          "expected": 9,
          "toleranceDecimalPlaces": 0,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total striped line area",
              "value": 50,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "800m line, 0.15m wide, 0.18 kg/m²",
          "inputs": {
            "lineLength": 800,
            "lineWidth": 0.15,
            "beadApplicationRate": 0.18
          },
          "expected": 21.6,
          "toleranceDecimalPlaces": 1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total striped line area",
              "value": 120,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "return-grille-sizing-calculator",
      "title": "Return Air Grille Free Area Sizing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/return-grille-sizing-calculator/",
      "sources": [
        "Gross grille area = Airflow ÷ Target Face Velocity ÷ Free Area Fraction, since a grille's core (blades/louvers) blocks a portion of its face — standard grilles are commonly 60-75% free area, with the exact figure published by the grille manufacturer for each model."
      ],
      "vectors": [
        {
          "name": "400 CFM at 500 fpm, 70% free area",
          "inputs": {
            "airflow": 188.779,
            "targetFaceVelocity": 2.54,
            "freeAreaPercent": 70
          },
          "expected": 1.14,
          "toleranceDecimalPlaces": 1,
          "unit": "ft²",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "600 CFM at 600 fpm, 65% free area",
          "inputs": {
            "airflow": 283.1685,
            "targetFaceVelocity": 3.048,
            "freeAreaPercent": 65
          },
          "expected": 1.54,
          "toleranceDecimalPlaces": 1,
          "unit": "ft²",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "reverberation-time-calculator",
      "title": "Reverberation Time Calculator (Sabine RT60)",
      "url": "https://craftquantities.com/calculators/materials-quantities/reverberation-time-calculator/",
      "sources": [
        "Steven Errede, University of Illinois at Urbana-Champaign, Physics 406 Acoustical Physics of Music, lecture notes 'Auditorium & Room Acoustics' (2017): Sabine's equation T = K V / A with K = 0.049 s/ft (= 0.161 s/m), A the room's absorption in square feet (square metres) of open window; worked example after Backus, 240,000 ft³ with 4,300 absorption units giving 2.7 s, and 7,800 units for 1.5 s",
        "HM Government, Approved Document E: Resistance to the passage of sound (2003 edition incorporating 2004, 2010, 2013 and 2015 amendments), Section 7: absorption area A = surface area x absorption coefficient, summed over the surfaces (7.14–7.16); Table 7.1, absorption coefficients of nine common materials at 250, 500, 1000, 2000 and 4000 Hz; Table 7.2, a worked entrance hall of 3.0 x 4.0 x 2.5 m; Method B's 0.20 m² of absorption per m³ for an entrance hall and 0.25 m² per m³ for a corridor (7.17, 7.18)",
        "Department for Education, Building Bulletin 93: Acoustic design of schools, performance standards (February 2015), section 1.5 and Table 6: mid-frequency reverberation time Tmf, the average of the 500 Hz, 1 kHz and 2 kHz octave bands, for rooms finished and furnished but unoccupied; a secondary classroom built new at 0.8 s or less, a primary classroom at 0.6 s or less",
        "Rockfon, Rockfon Sonar product data: practical sound absorption coefficients αp by octave band, measured to ISO 354 and rated to ISO 11654; 20 mm, A24 edge, 200 mm suspension: 0.55, 0.95, 1.00, 0.90, 1.00, 1.00 at 125 Hz to 4 kHz"
      ],
      "vectors": [
        {
          "name": "An 8 x 7 x 2.7 m classroom: lino floor, plasterboard ceiling, painted block, 8 m² of windows, a 2 m² door",
          "inputs": {
            "roomLength": 8,
            "roomWidth": 7,
            "roomHeight": 2.7,
            "floorAlpha": 0.04,
            "ceilingAlpha": 0.1,
            "wallAlpha": 0.06,
            "windowArea": 8,
            "windowAlpha": 0.05,
            "doorArea": 2,
            "doorAlpha": 0.08,
            "absorberArea": 0,
            "absorberAlpha": 1,
            "absorberOn": "ceiling",
            "targetTime": 0.8
          },
          "expected": 1.922844,
          "toleranceDecimalPlaces": 5,
          "unit": "s",
          "confidence": "medium",
          "steps": [
            {
              "label": "Room volume",
              "value": 5339.577608289075,
              "unit": "ft³"
            },
            {
              "label": "Room surface area",
              "value": 193,
              "unit": "m²"
            },
            {
              "label": "Total sound absorption, A",
              "value": 12.660000000000002,
              "unit": "m²"
            },
            {
              "label": "Average absorption coefficient",
              "value": 0.0655958549222798
            },
            {
              "label": "Absorption to add for the target time",
              "value": 17.769,
              "unit": "m²"
            },
            {
              "label": "Absorber area for that, at its coefficient",
              "value": 19.743333333333332,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "The same room with 20 m² of Rockfon Sonar on the ceiling",
          "inputs": {
            "roomLength": 8,
            "roomWidth": 7,
            "roomHeight": 2.7,
            "floorAlpha": 0.04,
            "ceilingAlpha": 0.1,
            "wallAlpha": 0.06,
            "windowArea": 8,
            "windowAlpha": 0.05,
            "doorArea": 2,
            "doorAlpha": 0.08,
            "absorberArea": 20,
            "absorberAlpha": 1,
            "absorberOn": "ceiling",
            "targetTime": 0.8
          },
          "expected": 0.793973,
          "toleranceDecimalPlaces": 5,
          "unit": "s",
          "confidence": "medium",
          "steps": [
            {
              "label": "Room volume",
              "value": 5339.577608289075,
              "unit": "ft³"
            },
            {
              "label": "Room surface area",
              "value": 193,
              "unit": "m²"
            },
            {
              "label": "Total sound absorption, A",
              "value": 30.66,
              "unit": "m²"
            },
            {
              "label": "Average absorption coefficient",
              "value": 0.158860103626943
            },
            {
              "label": "Absorption to add for the target time",
              "value": 0,
              "unit": "m²"
            },
            {
              "label": "Absorber area for that, at its coefficient",
              "value": 0,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "The same 20 m² fixed to the walls instead, over painted block at 0.06",
          "inputs": {
            "roomLength": 8,
            "roomWidth": 7,
            "roomHeight": 2.7,
            "floorAlpha": 0.04,
            "ceilingAlpha": 0.1,
            "wallAlpha": 0.06,
            "windowArea": 8,
            "windowAlpha": 0.05,
            "doorArea": 2,
            "doorAlpha": 0.08,
            "absorberArea": 20,
            "absorberAlpha": 1,
            "absorberOn": "walls",
            "targetTime": 0.8
          },
          "expected": 0.773783,
          "toleranceDecimalPlaces": 5,
          "unit": "s",
          "confidence": "medium",
          "steps": [
            {
              "label": "Room volume",
              "value": 5339.577608289075,
              "unit": "ft³"
            },
            {
              "label": "Room surface area",
              "value": 193,
              "unit": "m²"
            },
            {
              "label": "Total sound absorption, A",
              "value": 31.46,
              "unit": "m²"
            },
            {
              "label": "Average absorption coefficient",
              "value": 0.16300518134715025
            },
            {
              "label": "Absorption to add for the target time",
              "value": 0,
              "unit": "m²"
            },
            {
              "label": "Absorber area for that, at its coefficient",
              "value": 0,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "Approved Document E's entrance hall at 500 Hz: carpet, painted block, four timber doors, and the ceiling at the 0.25 Table 7.2 works out",
          "inputs": {
            "roomLength": 4,
            "roomWidth": 3,
            "roomHeight": 2.5,
            "floorAlpha": 0.06,
            "ceilingAlpha": 0.25,
            "wallAlpha": 0.06,
            "windowArea": 0,
            "windowAlpha": 0.05,
            "doorArea": 9.6,
            "doorAlpha": 0.08,
            "absorberArea": 0,
            "absorberAlpha": 1,
            "absorberOn": "ceiling",
            "targetTime": 0.8
          },
          "expected": 0.803393,
          "toleranceDecimalPlaces": 5,
          "unit": "s",
          "confidence": "medium",
          "steps": [
            {
              "label": "Room volume",
              "value": 1059.4400016446577,
              "unit": "ft³"
            },
            {
              "label": "Room surface area",
              "value": 59,
              "unit": "m²"
            },
            {
              "label": "Total sound absorption, A",
              "value": 6.012,
              "unit": "m²"
            },
            {
              "label": "Average absorption coefficient",
              "value": 0.10189830508474576
            },
            {
              "label": "Absorption to add for the target time",
              "value": 0.025500000000000078,
              "unit": "m²"
            },
            {
              "label": "Absorber area for that, at its coefficient",
              "value": 0.034000000000000107,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Backus's auditorium (via the Illinois notes): 240,000 ft³ with 4,300 sabins",
          "inputs": {
            "roomLength": 30.48,
            "roomWidth": 30.48,
            "roomHeight": 7.3152,
            "floorAlpha": 0.14527027027027026,
            "ceilingAlpha": 0.14527027027027026,
            "wallAlpha": 0.14527027027027026,
            "windowArea": 0,
            "windowAlpha": 0.05,
            "doorArea": 0,
            "doorAlpha": 0.08,
            "absorberArea": 0,
            "absorberAlpha": 1,
            "absorberOn": "ceiling",
            "targetTime": 1.5
          },
          "expected": 2.738947,
          "toleranceDecimalPlaces": 5,
          "unit": "s",
          "confidence": "medium",
          "steps": [
            {
              "label": "Room volume",
              "value": 239999.99999999997,
              "unit": "ft³"
            },
            {
              "label": "Room surface area",
              "value": 2749.929984,
              "unit": "m²"
            },
            {
              "label": "Total sound absorption, A",
              "value": 399.483072,
              "unit": "m²"
            },
            {
              "label": "Average absorption coefficient",
              "value": 0.14527027027027029
            },
            {
              "label": "Absorption to add for the target time",
              "value": 329.95889620992,
              "unit": "m²"
            },
            {
              "label": "Absorber area for that, at its coefficient",
              "value": 386.03886671200127,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "reverse-concrete-slab-calculator",
      "title": "Reverse Concrete Slab Solver",
      "url": "https://craftquantities.com/calculators/materials-quantities/reverse-concrete-slab-calculator/",
      "sources": [
        "Inverts the standard concrete volume formula: instead of volume → bags needed, this solves bags on hand → maximum pourable area, using the same 0.6 cubic ft yield per 80 lb bag as the Concrete Calculator."
      ],
      "vectors": [
        {
          "name": "60 bags on hand, 0.1m (4in) slab, 10% waste",
          "inputs": {
            "bagsOnHand": 60,
            "slabThickness": 0.1,
            "wasteFactorPercent": 10
          },
          "expected": 99.76,
          "toleranceDecimalPlaces": 0,
          "unit": "sq ft pourable",
          "confidence": "medium",
          "steps": [
            {
              "label": "Usable volume (after waste reserve)",
              "value": 32.72727272727273,
              "unit": "cu ft"
            },
            {
              "label": "Equivalent in square meters",
              "value": 9.267331611927274,
              "unit": "m²"
            },
            {
              "label": "Total raw volume (no waste reserve)",
              "value": 36,
              "unit": "cu ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "40 bags on hand, 0.15m (6in) slab, 5% waste",
          "inputs": {
            "bagsOnHand": 40,
            "slabThickness": 0.15,
            "wasteFactorPercent": 5
          },
          "expected": 46.45,
          "toleranceDecimalPlaces": 1,
          "unit": "sq ft pourable",
          "confidence": "medium",
          "steps": [
            {
              "label": "Usable volume (after waste reserve)",
              "value": 22.857142857142858,
              "unit": "cu ft"
            },
            {
              "label": "Equivalent in square meters",
              "value": 4.3149480521142864,
              "unit": "m²"
            },
            {
              "label": "Total raw volume (no waste reserve)",
              "value": 24,
              "unit": "cu ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "reverse-decking-material-calculator",
      "title": "Reverse Decking Material Solver",
      "url": "https://craftquantities.com/calculators/renovation-construction/reverse-decking-material-calculator/",
      "sources": [
        "Inverts the standard decking coverage formula: instead of area → boards needed, this solves boards on hand → maximum coverable area, using the same 5.625 in effective board-plus-gap width as the Deck Board Calculator."
      ],
      "vectors": [
        {
          "name": "20 boards, 12 ft length",
          "inputs": {
            "boardsOnHand": 20,
            "boardLengthFt": 12
          },
          "expected": 112.5,
          "toleranceDecimalPlaces": 1,
          "unit": "sq ft coverable",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total linear footage on hand",
              "value": 240,
              "unit": "ft"
            },
            {
              "label": "Effective coverage width per board (incl. gap)",
              "value": 5.625,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "50 boards, 16 ft length",
          "inputs": {
            "boardsOnHand": 50,
            "boardLengthFt": 16
          },
          "expected": 375,
          "toleranceDecimalPlaces": 0,
          "unit": "sq ft coverable",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total linear footage on hand",
              "value": 800,
              "unit": "ft"
            },
            {
              "label": "Effective coverage width per board (incl. gap)",
              "value": 5.625,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "reverse-drywall-coverage-calculator",
      "title": "Reverse Drywall Coverage Solver",
      "url": "https://craftquantities.com/calculators/renovation-construction/reverse-drywall-coverage-calculator/",
      "sources": [
        "Inverts the standard drywall coverage formula: instead of area → sheets needed, this solves sheets on hand → maximum coverable area, using the same 4x8 ft (2.973 m²) sheet size and waste allowance."
      ],
      "vectors": [
        {
          "name": "12 sheets on hand, 2.4m walls, 10% waste",
          "inputs": {
            "sheetsOnHand": 12,
            "wallHeight": 2.4,
            "wasteFactorPercent": 10
          },
          "expected": 349.1,
          "toleranceDecimalPlaces": -1,
          "unit": "sq ft coverable",
          "confidence": "medium",
          "steps": [
            {
              "label": "Usable area (after waste reserve)",
              "value": 32.43272727272727,
              "unit": "m²"
            },
            {
              "label": "Max linear wall footage at this height",
              "value": 44.33607730851825,
              "unit": "ft"
            },
            {
              "label": "Total raw sheet area (no waste reserve)",
              "value": 35.676,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "20 sheets on hand, 2.7m walls, 15% waste",
          "inputs": {
            "sheetsOnHand": 20,
            "wallHeight": 2.7,
            "wasteFactorPercent": 15
          },
          "expected": 556.54,
          "toleranceDecimalPlaces": -1,
          "unit": "sq ft coverable",
          "confidence": "medium",
          "steps": [
            {
              "label": "Usable area (after waste reserve)",
              "value": 51.70434782608695,
              "unit": "m²"
            },
            {
              "label": "Max linear wall footage at this height",
              "value": 62.827291516096714,
              "unit": "ft"
            },
            {
              "label": "Total raw sheet area (no waste reserve)",
              "value": 59.459999999999994,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "revolving-door-footprint-calculator",
      "title": "Commercial Revolving Door Vestibule Footprint Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/revolving-door-footprint-calculator/",
      "sources": [
        "Footprint area = π × (Door Diameter ÷ 2 + Clearance)² — the standard method for estimating the circular floor space a revolving door assembly (drum, wings, and enclosure) requires, including a surrounding clearance allowance from the specific door manufacturer's installation drawings."
      ],
      "vectors": [
        {
          "name": "2.2m door, 0.3m clearance",
          "inputs": {
            "doorDiameter": 2.2,
            "clearanceAllowance": 0.3
          },
          "expected": 6.158,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2.5m door, 0.4m clearance",
          "inputs": {
            "doorDiameter": 2.5,
            "clearanceAllowance": 0.4
          },
          "expected": 8.553,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "ridge-beam-tributary-load-calculator",
      "title": "Ridge Beam Tributary Load Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/ridge-beam-tributary-load-calculator/",
      "sources": [
        "For a structural ridge beam supporting simply-supported rafters (no ceiling rafter ties), each rafter transfers half its tributary load to the ridge; summed across both roof sides, ridge load per unit length = roof load × building width ÷ 2"
      ],
      "vectors": [
        {
          "name": "2.0 kPa roof, 8m building width",
          "inputs": {
            "roofLoad": 2000,
            "buildingWidth": 8
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "kN/m",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2.5 kPa roof, 10m building width",
          "inputs": {
            "roofLoad": 2500,
            "buildingWidth": 10
          },
          "expected": 12.5,
          "toleranceDecimalPlaces": 1,
          "unit": "kN/m",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "ridge-vent-linear-footage-calculator",
      "title": "Ridge Vent Linear Footage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/ridge-vent-linear-footage-calculator/",
      "sources": [
        "Total ridge vent = ridge length × (1 + waste allowance), the standard method for estimating continuous ridge vent material"
      ],
      "vectors": [
        {
          "name": "15m ridge, 5% waste",
          "inputs": {
            "ridgeLength": 15,
            "wastePercent": 5
          },
          "expected": 15.75,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "22m ridge, 8% waste",
          "inputs": {
            "ridgeLength": 22,
            "wastePercent": 8
          },
          "expected": 23.76,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "rim-board-linear-footage-calculator",
      "title": "Rim Board Linear Footage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/rim-board-linear-footage-calculator/",
      "sources": [
        "Rim board runs the full perimeter of the floor framing at each level; total length = perimeter × (1 + waste factor)"
      ],
      "vectors": [
        {
          "name": "10x8m building, 5% waste",
          "inputs": {
            "buildingLength": 10,
            "buildingWidth": 8,
            "wastePercent": 5
          },
          "expected": 37.8,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Perimeter (no waste)",
              "value": 36,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "12x9m building, 10% waste",
          "inputs": {
            "buildingLength": 12,
            "buildingWidth": 9,
            "wastePercent": 10
          },
          "expected": 46.2,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Perimeter (no waste)",
              "value": 42,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "rim-joist-insulation-calculator",
      "title": "Rim Joist Insulation Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/rim-joist-insulation-calculator/",
      "sources": [
        "Rim joist band area = house perimeter x joist height; sheet count = area / one board's area — 32 sq ft for a 4x8 ft board in North America, 2.88 m² for a 2400x1200 mm board in metric markets — rounded up with a waste allowance"
      ],
      "vectors": [
        {
          "name": "40m perimeter, 9.25in joists",
          "inputs": {
            "housePerimeter": 40,
            "joistHeight": 0.235
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets (4x8 ft)",
          "confidence": "high",
          "steps": [
            {
              "label": "Rim joist band area",
              "value": 101.18075791707138,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "60m perimeter, 11.25in joists",
          "inputs": {
            "housePerimeter": 60,
            "joistHeight": 0.286
          },
          "expected": 7,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets (4x8 ft)",
          "confidence": "high",
          "steps": [
            {
              "label": "Rim joist band area",
              "value": 184.7087027507388,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "rip-rap-cubic-yards-to-tons-calculator",
      "title": "Rip Rap Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/rip-rap-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 1.4 short tons per cubic yard",
        "Density varies with moisture, grading and how the material was processed"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 14,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.4,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 140,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.4,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "rip-rap-tons-to-cubic-yards-calculator",
      "title": "Rip Rap Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/rip-rap-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 1.4 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 7.142857142857143,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.7142857142857143,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 71.42857142857143,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.7142857142857143,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "riprap-slope-volume-calculator",
      "title": "Riprap Slope Protection Volume Calculator",
      "url": "https://craftquantities.com/calculators/heavy-civil/riprap-slope-volume-calculator/",
      "sources": [
        "Riprap volume = slope surface area × average stone layer depth, the standard method for estimating bulk riprap stone quantity for erosion protection"
      ],
      "vectors": [
        {
          "name": "80m² slope, 0.45m depth",
          "inputs": {
            "slopeArea": 80,
            "stoneDepth": 0.45
          },
          "expected": 36,
          "toleranceDecimalPlaces": 0,
          "unit": "m³",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "120m² slope, 0.6m depth",
          "inputs": {
            "slopeArea": 120,
            "stoneDepth": 0.6
          },
          "expected": 72,
          "toleranceDecimalPlaces": 0,
          "unit": "m³",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "riser-spread-tolerance-checker",
      "title": "Stair Riser Spread Tolerance Checker",
      "url": "https://craftquantities.com/calculators/renovation-construction/riser-spread-tolerance-checker/",
      "sources": [
        "IRC R311.7.5.1 and IBC 1011.5.4: the greatest riser height within a flight shall not exceed the smallest by more than 3/8 in (9.5 mm) — a flight-wide rule, measured between the extremes rather than between neighbours",
        "Other jurisdictions set the figure differently, which is why the permitted variation is entered rather than fixed: Approved Document K and the National Construction Code both express riser uniformity in their own terms",
        "Arithmetic only: spread = tallest measured riser − shortest measured riser, compared against the variation you enter"
      ],
      "vectors": [
        {
          "name": "190 mm tallest against 183 mm shortest — 7 mm spread, passes",
          "inputs": {
            "tallestRiser": 0.19,
            "shortestRiser": 0.183,
            "permittedVariation": 0.009525,
            "riserCount": 16,
            "totalRise": 3
          },
          "expected": 7,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Permitted variation for this flight",
              "value": 9.525,
              "unit": "mm"
            },
            {
              "label": "Margin left before the limit",
              "value": 2.524999999999994,
              "unit": "mm"
            },
            {
              "label": "Uniform riser height for this flight",
              "value": 187.5,
              "unit": "mm"
            },
            {
              "label": "Tallest riser above the uniform height",
              "value": 2.500000000000002,
              "unit": "mm"
            },
            {
              "label": "Shortest riser below the uniform height",
              "value": 4.5000000000000036,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "197 mm tallest against 181 mm shortest — 16 mm spread, fails",
          "inputs": {
            "tallestRiser": 0.197,
            "shortestRiser": 0.181,
            "permittedVariation": 0.009525,
            "riserCount": 14,
            "totalRise": 2.65
          },
          "expected": 16,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "low",
          "steps": [
            {
              "label": "Permitted variation for this flight",
              "value": 9.525,
              "unit": "mm"
            },
            {
              "label": "Margin left before the limit",
              "value": -6.475000000000014,
              "unit": "mm"
            },
            {
              "label": "Uniform riser height for this flight",
              "value": 189.28571428571428,
              "unit": "mm"
            },
            {
              "label": "Tallest riser above the uniform height",
              "value": 7.7142857142857295,
              "unit": "mm"
            },
            {
              "label": "Shortest riser below the uniform height",
              "value": 8.285714285714285,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "river-rock-cubic-yards-to-tons-calculator",
      "title": "River Rock Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/river-rock-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 1.25 short tons per cubic yard",
        "Density varies with moisture, grading and compaction — the supplier's ticket weight governs"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 12.5,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.25,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 125,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.25,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "river-rock-tons-to-cubic-yards-calculator",
      "title": "River Rock Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/river-rock-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 1.25 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 8,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.8,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 80,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.8,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "road-salt-cubic-yards-to-tons-calculator",
      "title": "Road Salt Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/road-salt-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 1.1 short tons per cubic yard",
        "Density varies with moisture, grading and composition — the supplier's ticket weight governs"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 11,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.1,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 110.00000000000001,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.1,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "road-salt-tons-to-cubic-yards-calculator",
      "title": "Road Salt Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/road-salt-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 1.1 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 9.09090909090909,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.9090909090909091,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 90.9090909090909,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.9090909090909091,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "roadway-crown-slope-calculator",
      "title": "Roadway Crown Cross-Slope Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/roadway-crown-slope-calculator/",
      "sources": [
        "Edge elevation drop = half-width × target cross-slope percentage, the standard method for establishing a roadway crown's drainage slope from centerline to edge of pavement"
      ],
      "vectors": [
        {
          "name": "3.5m half-width, 2% slope",
          "inputs": {
            "halfWidth": 3.5,
            "crossSlopePercent": 2
          },
          "expected": 70,
          "toleranceDecimalPlaces": 0,
          "unit": "mm",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "5m half-width, 2.5% slope",
          "inputs": {
            "halfWidth": 5,
            "crossSlopePercent": 2.5
          },
          "expected": 125,
          "toleranceDecimalPlaces": 0,
          "unit": "mm",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "roi-home-improvement-calculator",
      "title": "Home Improvement ROI Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/roi-home-improvement-calculator/",
      "sources": [
        "Commonly cited industry-average national cost-recouped percentages by project type (garage door ~90%, minor kitchen/siding ~75%, windows/bathroom/deck ~65%) — figures vary by year, region, and market conditions"
      ],
      "vectors": [
        {
          "name": "Garage door replacement, $4000",
          "inputs": {
            "projectType": "garage-door-replacement",
            "projectCost": 4000
          },
          "expected": 3600,
          "toleranceDecimalPlaces": 0,
          "unit": "$ (estimated value added)",
          "confidence": "low",
          "steps": [
            {
              "label": "Cost recouped",
              "value": 90,
              "unit": "%"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Bathroom remodel, $20000",
          "inputs": {
            "projectType": "bathroom-remodel",
            "projectCost": 20000
          },
          "expected": 13000,
          "toleranceDecimalPlaces": 0,
          "unit": "$ (estimated value added)",
          "confidence": "low",
          "steps": [
            {
              "label": "Cost recouped",
              "value": 65,
              "unit": "%"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "roof-batten-spacing-calculator",
      "title": "Roof Batten Spacing Calculator (Tile Roofing)",
      "url": "https://craftquantities.com/calculators/materials-quantities/roof-batten-spacing-calculator/",
      "sources": [
        "Batten rows = ceil(roof slope length / batten gauge/spacing) + 1, the standard method for laying out tile roof battens"
      ],
      "vectors": [
        {
          "name": "5m slope, 0.33m gauge",
          "inputs": {
            "roofSlopeLength": 5,
            "battenGauge": 0.33
          },
          "expected": 17,
          "toleranceDecimalPlaces": 0,
          "unit": "rows",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "6.5m slope, 0.343m gauge",
          "inputs": {
            "roofSlopeLength": 6.5,
            "battenGauge": 0.343
          },
          "expected": 20,
          "toleranceDecimalPlaces": 0,
          "unit": "rows",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "roof-covering-fixing-calculator",
      "title": "Roof Covering Fixing Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/roof-covering-fixing-calculator/",
      "sources": [
        "Units per square metre are geometry, not a product table: a covering of width w laid at exposure e occupies w x e of roof, so the count is 1 / (w x e). A 1,000 mm wide covering at 143 mm exposure is 6.99 units per square metre; a 914 mm shingle at 127 mm exposure is 8.61, which is the 80-per-square figure quoted in North American practice",
        "Exposure is the covering length minus the headlap the pitch and site exposure require, so the same covering on a shallower roof produces more courses and more fixings. It is entered rather than assumed",
        "Fixing patterns tighten in perimeter zones because wind uplift concentrates at edges and corners, which is why the perimeter is a separate rate here rather than averaged into the field"
      ],
      "vectors": [
        {
          "name": "100 m² of 1 m covering at 143 mm gauge, 2 in the field and 4 at a 20% perimeter",
          "inputs": {
            "roofArea": 100,
            "coveringWidth": 1,
            "exposure": 0.143,
            "fixingsField": "2",
            "fixingsPerimeter": "4",
            "perimeterPercent": 20,
            "wastePercent": 5
          },
          "expected": 1763,
          "toleranceDecimalPlaces": 0,
          "unit": "fixings",
          "confidence": "medium",
          "steps": [
            {
              "label": "Units per sq ft",
              "value": 0.6496716083916084,
              "unit": "units/sq ft"
            },
            {
              "label": "Units in total",
              "value": 700,
              "unit": "units"
            },
            {
              "label": "Field fixings",
              "value": 1119,
              "unit": "fixings"
            },
            {
              "label": "Perimeter fixings",
              "value": 560,
              "unit": "fixings"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "a square of 3-tab shingles at four nails throughout",
          "inputs": {
            "roofArea": 9.2903,
            "coveringWidth": 0.9144,
            "exposure": 0.127,
            "fixingsField": "4",
            "fixingsPerimeter": "4",
            "perimeterPercent": 0,
            "wastePercent": 5
          },
          "expected": 336,
          "toleranceDecimalPlaces": 0,
          "unit": "fixings",
          "confidence": "medium",
          "steps": [
            {
              "label": "Units per sq ft",
              "value": 0.7999999999999999,
              "unit": "units/sq ft"
            },
            {
              "label": "Units in total",
              "value": 80,
              "unit": "units"
            },
            {
              "label": "Field fixings",
              "value": 320,
              "unit": "fixings"
            },
            {
              "label": "Perimeter fixings",
              "value": 0,
              "unit": "fixings"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "the same square in a high-wind perimeter zone at six nails",
          "inputs": {
            "roofArea": 9.2903,
            "coveringWidth": 0.9144,
            "exposure": 0.127,
            "fixingsField": "6",
            "fixingsPerimeter": "6",
            "perimeterPercent": 0,
            "wastePercent": 5
          },
          "expected": 504,
          "toleranceDecimalPlaces": 0,
          "unit": "fixings",
          "confidence": "medium",
          "steps": [
            {
              "label": "Units per sq ft",
              "value": 0.7999999999999999,
              "unit": "units/sq ft"
            },
            {
              "label": "Units in total",
              "value": 80,
              "unit": "units"
            },
            {
              "label": "Field fixings",
              "value": 480,
              "unit": "fixings"
            },
            {
              "label": "Perimeter fixings",
              "value": 0,
              "unit": "fixings"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "roof-cricket-framing-calculator",
      "title": "Roof Cricket (Saddle) Framing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/roof-cricket-framing-calculator/",
      "sources": [
        "A symmetric roof cricket's ridge height = half the obstruction's up-slope-facing width x the main roof's pitch ratio"
      ],
      "vectors": [
        {
          "name": "1.2m obstruction, 6/12 pitch",
          "inputs": {
            "obstructionWidth": 1.2,
            "roofPitch": 6
          },
          "expected": 0.3,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1.5m obstruction, 8/12 pitch",
          "inputs": {
            "obstructionWidth": 1.5,
            "roofPitch": 8
          },
          "expected": 0.5,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "roof-curb-flashing-calculator",
      "title": "Rooftop Unit Curb Flashing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/roof-curb-flashing-calculator/",
      "sources": [
        "Total curb flashing = curb perimeter × (1 + waste allowance), the standard method for estimating continuous flashing around a roof curb penetration"
      ],
      "vectors": [
        {
          "name": "8m perimeter, 8% waste",
          "inputs": {
            "curbPerimeter": 8,
            "wastePercent": 8
          },
          "expected": 8.64,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "12m perimeter, 10% waste",
          "inputs": {
            "curbPerimeter": 12,
            "wastePercent": 10
          },
          "expected": 13.2,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "roof-deflection-limit-calculator",
      "title": "Roof/Floor Deflection Limit Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/roof-deflection-limit-calculator/",
      "sources": [
        "Standard code deflection limits are expressed as a span fraction (e.g. L/180, L/240, L/360); allowable deflection = span ÷ ratio"
      ],
      "vectors": [
        {
          "name": "6m span, L/360",
          "inputs": {
            "span": 6,
            "deflectionRatio": "360"
          },
          "expected": 16.67,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "4.5m span, L/240",
          "inputs": {
            "span": 4.5,
            "deflectionRatio": "240"
          },
          "expected": 18.75,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "roof-drain-sump-pan-calculator",
      "title": "Roof Drain Sump Pan Sizing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/roof-drain-sump-pan-calculator/",
      "sources": [
        "Sump pan diameter = pipe diameter + 2 × clearance; pan area = π × (pan diameter ÷ 2)², standard circular sump pan sizing to provide adequate clearance around the drain pipe for water collection"
      ],
      "vectors": [
        {
          "name": "100mm pipe, 150mm clearance",
          "inputs": {
            "pipeDiameter": 0.1,
            "clearance": 0.15
          },
          "expected": 0.1257,
          "toleranceDecimalPlaces": 2,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Pan diameter",
              "value": 400,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150mm pipe, 175mm clearance",
          "inputs": {
            "pipeDiameter": 0.15,
            "clearance": 0.175
          },
          "expected": 0.1963,
          "toleranceDecimalPlaces": 2,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Pan diameter",
              "value": 499.99999999999994,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "roof-expansion-joint-cover-calculator",
      "title": "Roof Expansion Joint Cover Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/roof-expansion-joint-cover-calculator/",
      "sources": [
        "Total expansion joint cover = joint length × (1 + waste allowance), the standard method for estimating the pre-formed metal or elastomeric cover installed over a roof expansion joint"
      ],
      "vectors": [
        {
          "name": "40m joint, 5% waste",
          "inputs": {
            "jointLength": 40,
            "wastePercent": 5
          },
          "expected": 42,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "55m joint, 8% waste",
          "inputs": {
            "jointLength": 55,
            "wastePercent": 8
          },
          "expected": 59.4,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "roof-fall-protection-anchor-calculator",
      "title": "Roof Fall Protection Anchor Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/roof-fall-protection-anchor-calculator/",
      "sources": [
        "Anchor count = ceil(path length ÷ anchor spacing) + 1, the standard layout method for spacing fall protection anchor points along a rooftop travel path (commonly 6m/20ft spacing per system manufacturer guidance)"
      ],
      "vectors": [
        {
          "name": "40m path, 6m spacing",
          "inputs": {
            "pathLength": 40,
            "anchorSpacing": 6
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "anchor points",
          "confidence": "medium",
          "steps": [
            {
              "label": "Bays along the path",
              "value": 7
            },
            {
              "label": "Anchor centres along the path",
              "value": 5.714285714285714,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "55m path, 6m spacing",
          "inputs": {
            "pathLength": 55,
            "anchorSpacing": 6
          },
          "expected": 11,
          "toleranceDecimalPlaces": 0,
          "unit": "anchor points",
          "confidence": "medium",
          "steps": [
            {
              "label": "Bays along the path",
              "value": 10
            },
            {
              "label": "Anchor centres along the path",
              "value": 5.5,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "roof-hatch-curb-flashing-calculator",
      "title": "Roof Hatch Curb Flashing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/roof-hatch-curb-flashing-calculator/",
      "sources": [
        "Total hatch curb flashing = curb perimeter × (1 + waste allowance), the standard method for estimating continuous flashing around a roof hatch penetration"
      ],
      "vectors": [
        {
          "name": "6m perimeter, 8% waste",
          "inputs": {
            "hatchPerimeter": 6,
            "wastePercent": 8
          },
          "expected": 6.48,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "9m perimeter, 10% waste",
          "inputs": {
            "hatchPerimeter": 9,
            "wastePercent": 10
          },
          "expected": 9.9,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "roof-ice-dam-membrane-calculator",
      "title": "Roof Eave Ice Dam Protection Membrane Footprint",
      "url": "https://craftquantities.com/calculators/materials-quantities/roof-ice-dam-membrane-calculator/",
      "sources": [
        "IRC R905.1.2: self-adhering ice barrier membrane must extend from the eave edge to at least 24in inside the building's exterior wall line, measured along the roof slope"
      ],
      "vectors": [
        {
          "name": "20m eave, 0.4m overhang, 24in coverage, 6/12 pitch",
          "inputs": {
            "eaveLength": 20,
            "overhang": 0.4,
            "requiredInteriorCoverage": 0.6096,
            "roofPitch": 6
          },
          "expected": 22.58,
          "toleranceDecimalPlaces": 2,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Membrane width (along slope)",
              "value": 1.1287671150418939,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15m eave, 0.5m overhang, 24in coverage, 8/12 pitch",
          "inputs": {
            "eaveLength": 15,
            "overhang": 0.5,
            "requiredInteriorCoverage": 0.6096,
            "roofPitch": 8
          },
          "expected": 20,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Membrane width (along slope)",
              "value": 1.333573231751614,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "roof-insulation-cover-board-calculator",
      "title": "Roof Insulation Cover Board Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/roof-insulation-cover-board-calculator/",
      "sources": [
        "Sheet count = ceil(roof area ÷ sheet area), the standard coverage method for cover board installed as a substrate protection layer over roof insulation"
      ],
      "vectors": [
        {
          "name": "150m² roof, 2.88m² sheets",
          "inputs": {
            "roofArea": 150,
            "sheetArea": 2.88
          },
          "expected": 53,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "200m² roof, 2.88m² sheets",
          "inputs": {
            "roofArea": 200,
            "sheetArea": 2.88
          },
          "expected": 70,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "roof-overhang-tail-length-calculator",
      "title": "Roof Overhang Tail Length Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/roof-overhang-tail-length-calculator/",
      "sources": [
        "The rafter tail's along-slope length equals the horizontal overhang × √(1+(pitch/12)²), the same slope factor used for common rafter length"
      ],
      "vectors": [
        {
          "name": "0.6m overhang, 6/12 pitch",
          "inputs": {
            "horizontalOverhang": 0.6,
            "roofPitch": 6
          },
          "expected": 0.6708,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "0.45m overhang, 9/12 pitch",
          "inputs": {
            "horizontalOverhang": 0.45,
            "roofPitch": 9
          },
          "expected": 0.5625,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "roof-paver-pedestal-calculator",
      "title": "Roof Paver Pedestal Grid Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/roof-paver-pedestal-calculator/",
      "sources": [
        "Pedestal count follows a grid layout: count along each dimension = ceil(dimension ÷ grid spacing) + 1; total pedestals = the product of both dimension counts, matching the paver system's manufacturer-specified support grid spacing"
      ],
      "vectors": [
        {
          "name": "10m x 8m deck, 0.5m grid",
          "inputs": {
            "deckLength": 10,
            "deckWidth": 8,
            "gridSpacing": 0.5
          },
          "expected": 357,
          "toleranceDecimalPlaces": -1,
          "unit": "pedestals",
          "confidence": "high",
          "steps": [
            {
              "label": "Pedestals along length",
              "value": 21
            },
            {
              "label": "Pedestals along width",
              "value": 17
            },
            {
              "label": "Cut paver down the deck",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Cut paver across the deck",
              "value": 0,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "12m x 9m deck, 0.5m grid",
          "inputs": {
            "deckLength": 12,
            "deckWidth": 9,
            "gridSpacing": 0.5
          },
          "expected": 475,
          "toleranceDecimalPlaces": -1,
          "unit": "pedestals",
          "confidence": "high",
          "steps": [
            {
              "label": "Pedestals along length",
              "value": 25
            },
            {
              "label": "Pedestals along width",
              "value": 19
            },
            {
              "label": "Cut paver down the deck",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Cut paver across the deck",
              "value": 0,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "roof-perimeter-termination-bar-calculator",
      "title": "Roof Perimeter Termination Bar Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/roof-perimeter-termination-bar-calculator/",
      "sources": [
        "Total termination bar = roof perimeter × (1 + waste allowance), the standard method for estimating continuous metal termination bar securing the membrane edge at the roof perimeter"
      ],
      "vectors": [
        {
          "name": "70m perimeter, 5% waste",
          "inputs": {
            "perimeter": 70,
            "wastePercent": 5
          },
          "expected": 73.5,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "95m perimeter, 8% waste",
          "inputs": {
            "perimeter": 95,
            "wastePercent": 8
          },
          "expected": 102.6,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "roof-pitch-angle-calculator",
      "title": "Roof Pitch to Angle Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/roof-pitch-angle-calculator/",
      "sources": [
        "Roofing pitch is conventionally expressed as rise per 12 in of run (e.g. '6/12'); angle in degrees = arctangent(rise / 12)"
      ],
      "vectors": [
        {
          "name": "6/12 pitch",
          "inputs": {
            "riseIn": 6
          },
          "expected": 26.565,
          "toleranceDecimalPlaces": 0.1,
          "unit": "degrees",
          "confidence": "high",
          "steps": [
            {
              "label": "Slope percent",
              "value": 50,
              "unit": "%"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "4/12 pitch",
          "inputs": {
            "riseIn": 4
          },
          "expected": 18.435,
          "toleranceDecimalPlaces": 0.1,
          "unit": "degrees",
          "confidence": "high",
          "steps": [
            {
              "label": "Slope percent",
              "value": 33.33333333333333,
              "unit": "%"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "roof-pitch-to-degrees-calculator",
      "title": "Roof Pitch to Degrees Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/roof-pitch-to-degrees-calculator/",
      "sources": [
        "Roof pitch expressed as rise per 12 units of run; angle = arctan(rise / 12)",
        "Common reference points: 4:12 = 18.43°, 6:12 = 26.57°, 12:12 = 45°"
      ],
      "vectors": [
        {
          "name": "6 in converts correctly",
          "inputs": {
            "risePer12": 6
          },
          "expected": 26.56505117707799,
          "toleranceDecimalPlaces": 6,
          "unit": "°",
          "confidence": "high",
          "steps": [],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "risePer12": 60
          },
          "expected": 78.69006752597979,
          "toleranceDecimalPlaces": 6,
          "unit": "°",
          "confidence": "high",
          "steps": [],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "roof-ridge-cap-calculator",
      "title": "Roof Ridge Cap Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/roof-ridge-cap-calculator/",
      "sources": [
        "A standard bundle of ridge cap shingles covers approximately 33 linear ft, per common asphalt shingle manufacturer specs"
      ],
      "vectors": [
        {
          "name": "12m ridge",
          "inputs": {
            "ridgeLength": 12
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "bundles",
          "confidence": "high",
          "steps": [
            {
              "label": "Ridge/hip length (with waste)",
              "value": 43.30708661417323,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "20m ridge",
          "inputs": {
            "ridgeLength": 20
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "bundles",
          "confidence": "high",
          "steps": [
            {
              "label": "Ridge/hip length (with waste)",
              "value": 72.17847769028872,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "20m ridge with no cut-end allowance",
          "inputs": {
            "ridgeLength": 20,
            "wastePercent": 0
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "bundles",
          "confidence": "high",
          "steps": [
            {
              "label": "Ridge/hip length (with waste)",
              "value": 65.61679790026247,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "roof-scupper-sizing-calculator",
      "title": "Roof Scupper/Secondary Emergency Drain Sizing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/roof-scupper-sizing-calculator/",
      "sources": [
        "Required opening area = roof area × a sizing factor derived from the local design rainfall intensity, following the same tributary-area method used by plumbing code roof drainage sizing tables (e.g. IPC Appendix roof drain sizing)"
      ],
      "vectors": [
        {
          "name": "200m² roof, 2.5 sizing factor",
          "inputs": {
            "roofArea": 200,
            "sizingFactor": 2.5
          },
          "expected": 500,
          "toleranceDecimalPlaces": 0,
          "unit": "cm²",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "300m² roof, 3.0 sizing factor",
          "inputs": {
            "roofArea": 300,
            "sizingFactor": 3
          },
          "expected": 900,
          "toleranceDecimalPlaces": 0,
          "unit": "cm²",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "roof-sheathing-nail-count-calculator",
      "title": "Roof Sheathing Nailing Pattern Nail Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/roof-sheathing-nail-count-calculator/",
      "sources": [
        "Total nails = number of sheathing sheets × nails per sheet, where nails-per-sheet comes from the project's specified nailing schedule (edge and field spacing, e.g. 6in edge/12in field)"
      ],
      "vectors": [
        {
          "name": "50 sheets, 40 nails/sheet",
          "inputs": {
            "sheetCount": 50,
            "nailsPerSheet": 40
          },
          "expected": 2000,
          "toleranceDecimalPlaces": 0,
          "unit": "nails",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "80 sheets, 45 nails/sheet",
          "inputs": {
            "sheetCount": 80,
            "nailsPerSheet": 45
          },
          "expected": 3600,
          "toleranceDecimalPlaces": 0,
          "unit": "nails",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "roof-snow-drift-surcharge-calculator",
      "title": "Roof Snow Drift Surcharge Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/roof-snow-drift-surcharge-calculator/",
      "sources": [
        "ASCE/SEI 7 Minimum Design Loads and Associated Criteria for Buildings and Other Structures, Chapter 7 drift provisions — leeward drift height hd = 0.43 x (lu)^(1/3) x (pg + 10)^(1/4) - 1.5, with the upwind fetch lu in feet, the ground snow load pg in psf and hd in feet; the windward case is taken as 0.75 of that value using the lower roof's own length as the fetch",
        "Snow density from the same chapter: gamma = 0.13 x pg + 14, capped at 30 pcf, which converts a snow load into the depth of snow that produces it",
        "Drift geometry from the same chapter: the drift is a triangle of width 4 x hd where it fits below the clear height hc; where hd would exceed hc the drift truncates at hc and widens to 4 x hd² / hc, not more than 8 x hc",
        "ASCE/SEI 7 also states that drift need not be considered where the ratio hc / hb is less than 0.2 — reported here rather than applied silently, because it is a decision the engineer makes"
      ],
      "vectors": [
        {
          "name": "Leeward drift, 30 m fetch, 2.4 m step",
          "inputs": {
            "groundSnowLoad": 1500,
            "flatRoofSnowLoad": 1050,
            "heightDifference": 2.4,
            "upwindFetch": 30,
            "lowerRoofLength": 15,
            "driftCase": "leeward"
          },
          "expected": 63.87,
          "toleranceDecimalPlaces": 1,
          "unit": "psf",
          "confidence": "medium",
          "steps": [
            {
              "label": "Drift height at the wall",
              "value": 3.533831967361798,
              "unit": "ft"
            },
            {
              "label": "Horizontal extent of the drift",
              "value": 14.135327869447192,
              "unit": "ft"
            },
            {
              "label": "Balanced snow depth on the lower roof",
              "value": 1.2134188513813353,
              "unit": "ft"
            },
            {
              "label": "Clear height above the balanced snow",
              "value": 6.66059689665016,
              "unit": "ft"
            },
            {
              "label": "Snow density used",
              "value": 18.072659675464276,
              "unit": "pcf"
            },
            {
              "label": "Drift height before truncation",
              "value": 3.533831967361798,
              "unit": "ft"
            },
            {
              "label": "Clear height over balanced depth",
              "value": 5.489116053428583,
              "unit": "ratio"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Windward drift truncated on a 1.2 m step",
          "inputs": {
            "groundSnowLoad": 3000,
            "flatRoofSnowLoad": 2100,
            "heightDifference": 1.2,
            "upwindFetch": 30,
            "lowerRoofLength": 12,
            "driftCase": "windward"
          },
          "expected": 43.33,
          "toleranceDecimalPlaces": 1,
          "unit": "psf",
          "confidence": "medium",
          "steps": [
            {
              "label": "Drift height at the wall",
              "value": 1.9564804679941115,
              "unit": "ft"
            },
            {
              "label": "Horizontal extent of the drift",
              "value": 8.82909618359995,
              "unit": "ft"
            },
            {
              "label": "Balanced snow depth on the lower roof",
              "value": 1.9805274060216362,
              "unit": "ft"
            },
            {
              "label": "Clear height above the balanced snow",
              "value": 1.9564804679941115,
              "unit": "ft"
            },
            {
              "label": "Snow density used",
              "value": 22.145319350928553,
              "unit": "pcf"
            },
            {
              "label": "Drift height before truncation",
              "value": 2.078097340913958,
              "unit": "ft"
            },
            {
              "label": "Clear height over balanced depth",
              "value": 0.9878583159443227,
              "unit": "ratio"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "roof-snow-load-calculator",
      "title": "Ground-to-Roof Snow Load Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/roof-snow-load-calculator/",
      "sources": [
        "ASCE 7 flat-roof snow load: pf = 0.7 × Ce × Ct × Is × pg, where Ce is exposure factor, Ct is thermal factor, Is is importance factor, and pg is ground snow load"
      ],
      "vectors": [
        {
          "name": "pg=1.5, Ce=Ct=Is=1.0",
          "inputs": {
            "groundSnowLoad": 1500,
            "exposureFactor": 1,
            "thermalFactor": 1,
            "importanceFactor": 1
          },
          "expected": 1.05,
          "toleranceDecimalPlaces": 1,
          "unit": "kN/m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "pg=2.0, Ce=0.9, Ct=1.1, Is=1.0",
          "inputs": {
            "groundSnowLoad": 2000,
            "exposureFactor": 0.9,
            "thermalFactor": 1.1,
            "importanceFactor": 1
          },
          "expected": 1.386,
          "toleranceDecimalPlaces": 1,
          "unit": "kN/m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "roof-squares-calculator",
      "title": "Roof Squares Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/roof-squares-calculator/",
      "sources": [
        "1 roofing square = 100 ft² (9.2903 m²) of roof surface — universal North American roofing trade unit",
        "Slope factor = √(1 + (rise/run)²); the multiplier from plan area to true sloped area"
      ],
      "vectors": [
        {
          "name": "120 m² plan at 6:12 with 10% waste",
          "inputs": {
            "planArea": 120,
            "pitchRise": 6,
            "wastePercent": 10
          },
          "expected": 15.8854,
          "toleranceDecimalPlaces": 2,
          "unit": "squares",
          "confidence": "high",
          "steps": [
            {
              "label": "Slope factor",
              "value": 1.118033988749895,
              "unit": "×"
            },
            {
              "label": "True sloped area",
              "value": 134.1640786499874,
              "unit": "m²"
            },
            {
              "label": "With waste",
              "value": 147.58048651498615,
              "unit": "m²"
            },
            {
              "label": "Sloped area in ft²",
              "value": 1588.5431361017481,
              "unit": "ft²"
            },
            {
              "label": "Pitch angle",
              "value": 26.56505117707799,
              "unit": "°"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A flat roof has a slope factor of 1",
          "inputs": {
            "planArea": 92.90304,
            "pitchRise": 0,
            "wastePercent": 0
          },
          "expected": 10,
          "toleranceDecimalPlaces": 1,
          "unit": "squares",
          "confidence": "high",
          "steps": [
            {
              "label": "Slope factor",
              "value": 1,
              "unit": "×"
            },
            {
              "label": "True sloped area",
              "value": 92.90304,
              "unit": "m²"
            },
            {
              "label": "With waste",
              "value": 92.90304,
              "unit": "m²"
            },
            {
              "label": "Sloped area in ft²",
              "value": 1000,
              "unit": "ft²"
            },
            {
              "label": "Pitch angle",
              "value": 0,
              "unit": "°"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A steeper 12:12 pitch adds 41%",
          "inputs": {
            "planArea": 120,
            "pitchRise": 12,
            "wastePercent": 0
          },
          "expected": 18.26,
          "toleranceDecimalPlaces": 0,
          "unit": "squares",
          "confidence": "high",
          "steps": [
            {
              "label": "Slope factor",
              "value": 1.4142135623730951,
              "unit": "×"
            },
            {
              "label": "True sloped area",
              "value": 169.7056274847714,
              "unit": "m²"
            },
            {
              "label": "With waste",
              "value": 169.7056274847714,
              "unit": "m²"
            },
            {
              "label": "Sloped area in ft²",
              "value": 1826.6961714575907,
              "unit": "ft²"
            },
            {
              "label": "Pitch angle",
              "value": 45,
              "unit": "°"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Zero plan area is zero squares",
          "inputs": {
            "planArea": 0,
            "pitchRise": 6,
            "wastePercent": 10
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "squares",
          "confidence": "high",
          "steps": [
            {
              "label": "Slope factor",
              "value": 1.118033988749895,
              "unit": "×"
            },
            {
              "label": "True sloped area",
              "value": 0,
              "unit": "m²"
            },
            {
              "label": "With waste",
              "value": 0,
              "unit": "m²"
            },
            {
              "label": "Sloped area in ft²",
              "value": 0,
              "unit": "ft²"
            },
            {
              "label": "Pitch angle",
              "value": 26.56505117707799,
              "unit": "°"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "roof-tile-calculator",
      "title": "Roof Tile and Slate Calculator (Gauge, Battens and Ridge Tiles)",
      "url": "https://craftquantities.com/calculators/materials-quantities/roof-tile-calculator/",
      "sources": [
        "Marley, Modern interlocking tile technical specification: 420 × 330 mm; minimum headlap 75 mm (22.5° and above); maximum gauge 345 mm; cover width 292 mm (nominal); covering capacity 9.9 tiles/m² at 75 mm headlap and 10.7 at 100 mm; battens required 2.9 lin.m/m² at 75 mm headlap and 3.1 at 100 mm; 38 × 25 mm battens to 450 mm rafter centres, 50 × 25 mm to 600 mm",
        "Marley technical specifications for Ludlow Major (420 × 330 mm, maximum gauge 345 mm, cover width 295 mm, 9.8 tiles/m² at 75 mm headlap), Edgemere (420 × 330 mm, 345 mm, 298 mm, 9.7 slates/m²) and Ludlow Plus (387 × 230 mm, maximum gauge 312 mm, cover width 204 mm, 15.7 tiles/m², 3.2 lin.m of batten/m²)",
        "Marley plain tile technical specifications: concrete plain tile 267 × 168 mm and Hawkins clay plain tile 265 × 165 mm; minimum headlap 65 mm on a roof; maximum gauge 100 mm on a roof; 60 tiles/m² and 10.0 lin.m of batten/m² at 100 mm gauge",
        "Marley (Kevin Taylor, Training and Technical Support Manager), setting out tiling battens: the maximum gauge is the full length of the tile less the minimum headlap (420 − 75 = 345 mm), never to be exceeded and usually eased so the gauge is even; marked up from the eaves course datum to the top batten under the ridge; plain tiles need an under-eaves batten, and room at the ridge for the top course, an additional batten and an eaves/tops tile; battens to BS 5534 are supplied in lengths of at least 3 m, typically 3.6 m or more, at least 1.2 m long and over three rafters when fixed",
        "Marley (Kevin Taylor), roof tile sizes, how many roof tiles per square metre: for a rough estimate multiply the size of the roof in square metres by the roof covering capacity, for example 100 m² of Marley Acme plain tiles at 60 a square metre, 100 × 60 = 6,000 tiles, with nothing added; a different gauge or headlap changes the figure",
        "Marley concrete plain eaves/top tile and tile-and-a-half: eaves have a double course throughout their length using purpose-made eaves tiles for the undercourse; the tile-and-a-half is required to achieve the broken bond laying pattern",
        "Marley ridge and hip tiles: angled hip and ridge tiles typically 245 or 260 mm across, in lengths of 450 mm for clay and 457 mm for concrete",
        "Bristile Roofing, Concrete Roof Tiles Technical Manual, Classic product specification: 440 × 335 × 35 mm; set-out 360 mm maximum; 9.26 tiles per m²; 2.5 ridges per lineal metre; 2.9 m of batten per m²; ridge capping is a tile used for both the ridge and hips; overlapping ridge tiles laid away from the prevailing wind; installation to AS 2050",
        "BS 5534:2014+A2:2018, Slating and tiling for pitched roofs and vertical cladding — Code of practice: the UK standard behind the headlaps, gauges and battens the makers' specifications set; its tables are not reproduced here"
      ],
      "vectors": [
        {
          "name": "100 m² of Marley Modern at its maximum gauge, nothing added: 993 tiles at 9.93 a square metre",
          "inputs": {
            "roofArea": 100,
            "tile": "marley-modern",
            "customLength": 0.42,
            "customCover": 0.292,
            "customHeadlap": 0.075,
            "customLap": "single",
            "ridgeTileLength": 0.457,
            "ridgeLength": 10,
            "hipLength": 0,
            "eavesLength": 20,
            "vergeLength": 16,
            "rafterLength": 5,
            "slopes": 2,
            "battenStockLength": 3.6,
            "wastePercent": 0
          },
          "expected": 993,
          "toleranceDecimalPlaces": 0,
          "unit": "tiles",
          "confidence": "high",
          "steps": [
            {
              "label": "Batten gauge",
              "value": 345,
              "unit": "mm"
            },
            {
              "label": "Covering capacity",
              "value": 9.926543577526306,
              "unit": "tiles/m²"
            },
            {
              "label": "Tiles for the roof area, before cutting",
              "value": 993,
              "unit": "tiles"
            },
            {
              "label": "Cutting allowance",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Battens at the maker's coverage, area over gauge",
              "value": 289.8550724637682,
              "unit": "m"
            },
            {
              "label": "Batten courses on each slope",
              "value": 16,
              "unit": "courses"
            },
            {
              "label": "Battens, total run",
              "value": 320,
              "unit": "m"
            },
            {
              "label": "Battens in stock lengths, cut course by course",
              "value": 96,
              "unit": "lengths"
            },
            {
              "label": "Ridge tiles",
              "value": 22,
              "unit": "tiles"
            },
            {
              "label": "Hip tiles",
              "value": 0,
              "unit": "tiles"
            },
            {
              "label": "Eaves and top-course tiles or slates",
              "value": 0,
              "unit": "tiles"
            },
            {
              "label": "Tile-and-a-half or slate-and-a-half at verges",
              "value": 0,
              "unit": "tiles"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The opening: 80 m² of Marley Modern with 5% for cutting",
          "inputs": {
            "roofArea": 80,
            "tile": "marley-modern",
            "customLength": 0.42,
            "customCover": 0.292,
            "customHeadlap": 0.075,
            "customLap": "single",
            "ridgeTileLength": 0.457,
            "ridgeLength": 10,
            "hipLength": 0,
            "eavesLength": 20,
            "vergeLength": 16,
            "rafterLength": 4,
            "slopes": 2,
            "battenStockLength": 3.6,
            "wastePercent": 5
          },
          "expected": 834,
          "toleranceDecimalPlaces": 0,
          "unit": "tiles",
          "confidence": "high",
          "steps": [
            {
              "label": "Batten gauge",
              "value": 345,
              "unit": "mm"
            },
            {
              "label": "Covering capacity",
              "value": 9.926543577526306,
              "unit": "tiles/m²"
            },
            {
              "label": "Tiles for the roof area, before cutting",
              "value": 795,
              "unit": "tiles"
            },
            {
              "label": "Cutting allowance",
              "value": 5,
              "unit": "%"
            },
            {
              "label": "Battens at the maker's coverage, area over gauge",
              "value": 231.88405797101453,
              "unit": "m"
            },
            {
              "label": "Batten courses on each slope",
              "value": 13,
              "unit": "courses"
            },
            {
              "label": "Battens, total run",
              "value": 260,
              "unit": "m"
            },
            {
              "label": "Battens in stock lengths, cut course by course",
              "value": 78,
              "unit": "lengths"
            },
            {
              "label": "Ridge tiles",
              "value": 22,
              "unit": "tiles"
            },
            {
              "label": "Hip tiles",
              "value": 0,
              "unit": "tiles"
            },
            {
              "label": "Eaves and top-course tiles or slates",
              "value": 0,
              "unit": "tiles"
            },
            {
              "label": "Tile-and-a-half or slate-and-a-half at verges",
              "value": 0,
              "unit": "tiles"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "100 m² of Marley's clay plain tile, nothing added: 6,061 tiles, Marley's '60 a square metre'",
          "inputs": {
            "roofArea": 100,
            "tile": "marley-hawkins-clay",
            "customLength": 0.42,
            "customCover": 0.292,
            "customHeadlap": 0.075,
            "customLap": "single",
            "ridgeTileLength": 0.457,
            "ridgeLength": 10,
            "hipLength": 0,
            "eavesLength": 20,
            "vergeLength": 16,
            "rafterLength": 5,
            "slopes": 2,
            "battenStockLength": 3.6,
            "wastePercent": 0
          },
          "expected": 6061,
          "toleranceDecimalPlaces": 0,
          "unit": "tiles",
          "confidence": "high",
          "steps": [
            {
              "label": "Batten gauge",
              "value": 100,
              "unit": "mm"
            },
            {
              "label": "Covering capacity",
              "value": 60.6060606060606,
              "unit": "tiles/m²"
            },
            {
              "label": "Tiles for the roof area, before cutting",
              "value": 6061,
              "unit": "tiles"
            },
            {
              "label": "Cutting allowance",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Battens at the maker's coverage, area over gauge",
              "value": 1000,
              "unit": "m"
            },
            {
              "label": "Batten courses on each slope",
              "value": 53,
              "unit": "courses"
            },
            {
              "label": "Battens, total run",
              "value": 1060,
              "unit": "m"
            },
            {
              "label": "Battens in stock lengths, cut course by course",
              "value": 318,
              "unit": "lengths"
            },
            {
              "label": "Ridge tiles",
              "value": 23,
              "unit": "tiles"
            },
            {
              "label": "Hip tiles",
              "value": 0,
              "unit": "tiles"
            },
            {
              "label": "Eaves and top-course tiles or slates",
              "value": 244,
              "unit": "tiles"
            },
            {
              "label": "Tile-and-a-half or slate-and-a-half at verges",
              "value": 80,
              "unit": "tiles"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "100 m² of Bristile Classic, nothing added: 926 tiles at its published 9.26 a square metre",
          "inputs": {
            "roofArea": 100,
            "tile": "bristile-classic",
            "customLength": 0.42,
            "customCover": 0.292,
            "customHeadlap": 0.075,
            "customLap": "single",
            "ridgeTileLength": 0.457,
            "ridgeLength": 10,
            "hipLength": 0,
            "eavesLength": 20,
            "vergeLength": 16,
            "rafterLength": 5,
            "slopes": 2,
            "battenStockLength": 3.6,
            "wastePercent": 0
          },
          "expected": 926,
          "toleranceDecimalPlaces": 0,
          "unit": "tiles",
          "confidence": "high",
          "steps": [
            {
              "label": "Batten gauge",
              "value": 344.82758620689657,
              "unit": "mm"
            },
            {
              "label": "Covering capacity",
              "value": 9.26,
              "unit": "tiles/m²"
            },
            {
              "label": "Tiles for the roof area, before cutting",
              "value": 926,
              "unit": "tiles"
            },
            {
              "label": "Cutting allowance",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Battens at the maker's coverage, area over gauge",
              "value": 290,
              "unit": "m"
            },
            {
              "label": "Batten courses on each slope",
              "value": 16,
              "unit": "courses"
            },
            {
              "label": "Battens, total run",
              "value": 320,
              "unit": "m"
            },
            {
              "label": "Battens in stock lengths, cut course by course",
              "value": 96,
              "unit": "lengths"
            },
            {
              "label": "Ridge tiles",
              "value": 25,
              "unit": "tiles"
            },
            {
              "label": "Hip tiles",
              "value": 0,
              "unit": "tiles"
            },
            {
              "label": "Eaves and top-course tiles or slates",
              "value": 0,
              "unit": "tiles"
            },
            {
              "label": "Tile-and-a-half or slate-and-a-half at verges",
              "value": 0,
              "unit": "tiles"
            }
          ],
          "basis": "cited",
          "sourceIndex": 7
        },
        {
          "name": "100 m² of Marley Ludlow Major, nothing added: 983 tiles at 9.83 a square metre",
          "inputs": {
            "roofArea": 100,
            "tile": "marley-ludlow-major",
            "customLength": 0.42,
            "customCover": 0.292,
            "customHeadlap": 0.075,
            "customLap": "single",
            "ridgeTileLength": 0.457,
            "ridgeLength": 10,
            "hipLength": 0,
            "eavesLength": 20,
            "vergeLength": 16,
            "rafterLength": 5,
            "slopes": 2,
            "battenStockLength": 3.6,
            "wastePercent": 0
          },
          "expected": 983,
          "toleranceDecimalPlaces": 0,
          "unit": "tiles",
          "confidence": "high",
          "steps": [
            {
              "label": "Batten gauge",
              "value": 345,
              "unit": "mm"
            },
            {
              "label": "Covering capacity",
              "value": 9.825595676737903,
              "unit": "tiles/m²"
            },
            {
              "label": "Tiles for the roof area, before cutting",
              "value": 983,
              "unit": "tiles"
            },
            {
              "label": "Cutting allowance",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Battens at the maker's coverage, area over gauge",
              "value": 289.8550724637682,
              "unit": "m"
            },
            {
              "label": "Batten courses on each slope",
              "value": 16,
              "unit": "courses"
            },
            {
              "label": "Battens, total run",
              "value": 320,
              "unit": "m"
            },
            {
              "label": "Battens in stock lengths, cut course by course",
              "value": 96,
              "unit": "lengths"
            },
            {
              "label": "Ridge tiles",
              "value": 22,
              "unit": "tiles"
            },
            {
              "label": "Hip tiles",
              "value": 0,
              "unit": "tiles"
            },
            {
              "label": "Eaves and top-course tiles or slates",
              "value": 0,
              "unit": "tiles"
            },
            {
              "label": "Tile-and-a-half or slate-and-a-half at verges",
              "value": 0,
              "unit": "tiles"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "100 m² of Marley Edgemere, nothing added: 973 slates at 9.73 a square metre",
          "inputs": {
            "roofArea": 100,
            "tile": "marley-edgemere",
            "customLength": 0.42,
            "customCover": 0.292,
            "customHeadlap": 0.075,
            "customLap": "single",
            "ridgeTileLength": 0.457,
            "ridgeLength": 10,
            "hipLength": 0,
            "eavesLength": 20,
            "vergeLength": 16,
            "rafterLength": 5,
            "slopes": 2,
            "battenStockLength": 3.6,
            "wastePercent": 0
          },
          "expected": 973,
          "toleranceDecimalPlaces": 0,
          "unit": "tiles",
          "confidence": "high",
          "steps": [
            {
              "label": "Batten gauge",
              "value": 345,
              "unit": "mm"
            },
            {
              "label": "Covering capacity",
              "value": 9.726680284019066,
              "unit": "tiles/m²"
            },
            {
              "label": "Tiles for the roof area, before cutting",
              "value": 973,
              "unit": "tiles"
            },
            {
              "label": "Cutting allowance",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Battens at the maker's coverage, area over gauge",
              "value": 289.8550724637682,
              "unit": "m"
            },
            {
              "label": "Batten courses on each slope",
              "value": 16,
              "unit": "courses"
            },
            {
              "label": "Battens, total run",
              "value": 320,
              "unit": "m"
            },
            {
              "label": "Battens in stock lengths, cut course by course",
              "value": 96,
              "unit": "lengths"
            },
            {
              "label": "Ridge tiles",
              "value": 22,
              "unit": "tiles"
            },
            {
              "label": "Hip tiles",
              "value": 0,
              "unit": "tiles"
            },
            {
              "label": "Eaves and top-course tiles or slates",
              "value": 0,
              "unit": "tiles"
            },
            {
              "label": "Tile-and-a-half or slate-and-a-half at verges",
              "value": 0,
              "unit": "tiles"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "100 m² of Marley Ludlow Plus, nothing added: 1,572 tiles at 15.71 a square metre",
          "inputs": {
            "roofArea": 100,
            "tile": "marley-ludlow-plus",
            "customLength": 0.42,
            "customCover": 0.292,
            "customHeadlap": 0.075,
            "customLap": "single",
            "ridgeTileLength": 0.457,
            "ridgeLength": 10,
            "hipLength": 0,
            "eavesLength": 20,
            "vergeLength": 16,
            "rafterLength": 5,
            "slopes": 2,
            "battenStockLength": 3.6,
            "wastePercent": 0
          },
          "expected": 1572,
          "toleranceDecimalPlaces": 0,
          "unit": "tiles",
          "confidence": "high",
          "steps": [
            {
              "label": "Batten gauge",
              "value": 312,
              "unit": "mm"
            },
            {
              "label": "Covering capacity",
              "value": 15.7114127702363,
              "unit": "tiles/m²"
            },
            {
              "label": "Tiles for the roof area, before cutting",
              "value": 1572,
              "unit": "tiles"
            },
            {
              "label": "Cutting allowance",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Battens at the maker's coverage, area over gauge",
              "value": 320.51282051282055,
              "unit": "m"
            },
            {
              "label": "Batten courses on each slope",
              "value": 18,
              "unit": "courses"
            },
            {
              "label": "Battens, total run",
              "value": 360,
              "unit": "m"
            },
            {
              "label": "Battens in stock lengths, cut course by course",
              "value": 108,
              "unit": "lengths"
            },
            {
              "label": "Ridge tiles",
              "value": 22,
              "unit": "tiles"
            },
            {
              "label": "Hip tiles",
              "value": 0,
              "unit": "tiles"
            },
            {
              "label": "Eaves and top-course tiles or slates",
              "value": 0,
              "unit": "tiles"
            },
            {
              "label": "Tile-and-a-half or slate-and-a-half at verges",
              "value": 0,
              "unit": "tiles"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "100 m² of Marley's concrete plain tile, nothing added: 5,953 tiles at its 100 mm gauge",
          "inputs": {
            "roofArea": 100,
            "tile": "marley-plain-concrete",
            "customLength": 0.42,
            "customCover": 0.292,
            "customHeadlap": 0.075,
            "customLap": "single",
            "ridgeTileLength": 0.457,
            "ridgeLength": 10,
            "hipLength": 0,
            "eavesLength": 20,
            "vergeLength": 16,
            "rafterLength": 5,
            "slopes": 2,
            "battenStockLength": 3.6,
            "wastePercent": 0
          },
          "expected": 5953,
          "toleranceDecimalPlaces": 0,
          "unit": "tiles",
          "confidence": "high",
          "steps": [
            {
              "label": "Batten gauge",
              "value": 100,
              "unit": "mm"
            },
            {
              "label": "Covering capacity",
              "value": 59.52380952380952,
              "unit": "tiles/m²"
            },
            {
              "label": "Tiles for the roof area, before cutting",
              "value": 5953,
              "unit": "tiles"
            },
            {
              "label": "Cutting allowance",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Battens at the maker's coverage, area over gauge",
              "value": 1000,
              "unit": "m"
            },
            {
              "label": "Batten courses on each slope",
              "value": 53,
              "unit": "courses"
            },
            {
              "label": "Battens, total run",
              "value": 1060,
              "unit": "m"
            },
            {
              "label": "Battens in stock lengths, cut course by course",
              "value": 318,
              "unit": "lengths"
            },
            {
              "label": "Ridge tiles",
              "value": 22,
              "unit": "tiles"
            },
            {
              "label": "Hip tiles",
              "value": 0,
              "unit": "tiles"
            },
            {
              "label": "Eaves and top-course tiles or slates",
              "value": 240,
              "unit": "tiles"
            },
            {
              "label": "Tile-and-a-half or slate-and-a-half at verges",
              "value": 80,
              "unit": "tiles"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "60 m² of a 500 x 250 mm natural slate at the reader's 100 mm headlap, double lap, 5% added",
          "inputs": {
            "roofArea": 60,
            "tile": "custom",
            "customLength": 0.5,
            "customCover": 0.25,
            "customHeadlap": 0.1,
            "customLap": "double",
            "ridgeTileLength": 0.457,
            "ridgeLength": 10,
            "hipLength": 0,
            "eavesLength": 20,
            "vergeLength": 16,
            "rafterLength": 3,
            "slopes": 2,
            "battenStockLength": 3.6,
            "wastePercent": 5
          },
          "expected": 1260,
          "toleranceDecimalPlaces": 0,
          "unit": "tiles",
          "confidence": "high",
          "steps": [
            {
              "label": "Batten gauge",
              "value": 200,
              "unit": "mm"
            },
            {
              "label": "Covering capacity",
              "value": 20,
              "unit": "tiles/m²"
            },
            {
              "label": "Tiles for the roof area, before cutting",
              "value": 1200,
              "unit": "tiles"
            },
            {
              "label": "Cutting allowance",
              "value": 5,
              "unit": "%"
            },
            {
              "label": "Battens at the maker's coverage, area over gauge",
              "value": 300,
              "unit": "m"
            },
            {
              "label": "Batten courses on each slope",
              "value": 18,
              "unit": "courses"
            },
            {
              "label": "Battens, total run",
              "value": 360,
              "unit": "m"
            },
            {
              "label": "Battens in stock lengths, cut course by course",
              "value": 108,
              "unit": "lengths"
            },
            {
              "label": "Ridge tiles",
              "value": 22,
              "unit": "tiles"
            },
            {
              "label": "Hip tiles",
              "value": 0,
              "unit": "tiles"
            },
            {
              "label": "Eaves and top-course tiles or slates",
              "value": 160,
              "unit": "tiles"
            },
            {
              "label": "Tile-and-a-half or slate-and-a-half at verges",
              "value": 40,
              "unit": "tiles"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        }
      ]
    },
    {
      "slug": "roof-truss-spacing-calculator",
      "title": "Roof Truss Spacing & Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/roof-truss-spacing-calculator/",
      "sources": [
        "Truss count = ceil(building length ÷ spacing) + 1, the standard method for spacing repetitive framing members along a run"
      ],
      "vectors": [
        {
          "name": "12m building, 24in o.c.",
          "inputs": {
            "buildingLength": 12,
            "trussSpacing": 0.6096
          },
          "expected": 21,
          "toleranceDecimalPlaces": 0,
          "unit": "trusses",
          "confidence": "high",
          "steps": [
            {
              "label": "Whole truss bays along the run",
              "value": 19
            },
            {
              "label": "Short bay left at one end",
              "value": 16.44094488188972,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15m building, 16in o.c.",
          "inputs": {
            "buildingLength": 15,
            "trussSpacing": 0.4064
          },
          "expected": 38,
          "toleranceDecimalPlaces": 0,
          "unit": "trusses",
          "confidence": "high",
          "steps": [
            {
              "label": "Whole truss bays along the run",
              "value": 36
            },
            {
              "label": "Short bay left at one end",
              "value": 14.551181102362193,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "roof-uplift-zone-pressure-calculator",
      "title": "Roof Uplift Zone Pressure and Zone Width Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/roof-uplift-zone-pressure-calculator/",
      "sources": [
        "ASCE 7, Minimum Design Loads and Associated Criteria for Buildings and Other Structures, components and cladding provisions as adopted locally — velocity pressure q = 0.00256 × Kz × Kzt × Kd × V² in psf with V in mph, and net pressure p = q × (GCp − GCpi)",
        "ASCE 7 terrain exposure constants used for Kz = 2.01 × (z / zg)^(2/α), held constant below zmin: Exposure B α = 7.0, zg = 1200 ft, zmin = 30 ft; Exposure C α = 9.5, zg = 900 ft, zmin = 15 ft; Exposure D α = 11.5, zg = 700 ft, zmin = 7 ft",
        "ASCE 7 directionality factor Kd = 0.85 for components and cladding of a building, and internal pressure coefficient GCpi = ±0.18 for an enclosed building. Topographic factor Kzt and ground elevation factor Ke are both taken as 1.0 here — Ke = 1.0 is always permitted, Kzt = 1.0 is only correct away from a hill, ridge or escarpment",
        "Zone width a = the smaller of 0.1 × the least horizontal dimension and 0.4 × the mean roof height, but never less than 0.04 × the least horizontal dimension nor less than 3 ft",
        "THE EXTERNAL PRESSURE COEFFICIENT IS NOT SUPPLIED HERE. GCp depends on roof form, slope, zone and effective wind area, and it is read from the components-and-cladding figure in the code edition your jurisdiction has adopted. The default in that field is a starting point to be replaced with the value your own figure gives, and is not itself a published coefficient"
      ],
      "vectors": [
        {
          "name": "115 mph, Exposure C, 6 m mean roof height, |GCp| = 1.0",
          "inputs": {
            "basicWindSpeed": 115,
            "exposureCategory": "C",
            "meanRoofHeight": 6,
            "leastHorizontalDimension": 12,
            "roofSlope": 5,
            "pressureCoefficient": 1
          },
          "expected": 30.5237,
          "toleranceDecimalPlaces": 2,
          "unit": "psf",
          "confidence": "medium",
          "steps": [
            {
              "label": "Velocity pressure at mean roof height",
              "value": 25.867507428361495,
              "unit": "psf"
            },
            {
              "label": "Velocity pressure exposure coefficient",
              "value": 0.898876467403866,
              "unit": "(Kz)"
            },
            {
              "label": "Internal pressure component included",
              "value": 4.656151337105069,
              "unit": "psf"
            },
            {
              "label": "Corner and edge zone width, measured in from each roof edge",
              "value": 1.2000000000000002,
              "unit": "m"
            },
            {
              "label": "Corner zone plan area at each corner",
              "value": 1.4400000000000004,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "130 mph, Exposure B, 9 m mean roof height, corner coefficient 2.6",
          "inputs": {
            "basicWindSpeed": 130,
            "exposureCategory": "B",
            "meanRoofHeight": 9,
            "leastHorizontalDimension": 20,
            "roofSlope": 15,
            "pressureCoefficient": 2.6
          },
          "expected": 71.6234,
          "toleranceDecimalPlaces": 2,
          "unit": "psf",
          "confidence": "medium",
          "steps": [
            {
              "label": "Velocity pressure at mean roof height",
              "value": 25.76381826114788,
              "unit": "psf"
            },
            {
              "label": "Velocity pressure exposure coefficient",
              "value": 0.7005911248354256,
              "unit": "(Kz)"
            },
            {
              "label": "Internal pressure component included",
              "value": 4.637487287006618,
              "unit": "psf"
            },
            {
              "label": "Corner and edge zone width, measured in from each roof edge",
              "value": 2,
              "unit": "m"
            },
            {
              "label": "Corner zone plan area at each corner",
              "value": 4,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Exposure D below the 15 ft Kz floor, low building",
          "inputs": {
            "basicWindSpeed": 100,
            "exposureCategory": "D",
            "meanRoofHeight": 3,
            "leastHorizontalDimension": 8,
            "roofSlope": 0,
            "pressureCoefficient": 1.5
          },
          "expected": 37.6619,
          "toleranceDecimalPlaces": 2,
          "unit": "psf",
          "confidence": "medium",
          "steps": [
            {
              "label": "Velocity pressure at mean roof height",
              "value": 22.41779531758746,
              "unit": "psf"
            },
            {
              "label": "Velocity pressure exposure coefficient",
              "value": 1.0302295642273647,
              "unit": "(Kz)"
            },
            {
              "label": "Internal pressure component included",
              "value": 4.035203157165743,
              "unit": "psf"
            },
            {
              "label": "Corner and edge zone width, measured in from each roof edge",
              "value": 0.9144000000000001,
              "unit": "m"
            },
            {
              "label": "Corner zone plan area at each corner",
              "value": 0.8361273600000002,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "roof-vent-boot-calculator",
      "title": "Roof Vent Pipe Boot Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/roof-vent-boot-calculator/",
      "sources": [
        "Boot count = ceil(vent pipe count × (1 + spare allowance)), the standard method for estimating one flashing boot per roof penetration plus a small spare allowance for damaged units"
      ],
      "vectors": [
        {
          "name": "8 vent pipes, 10% spare",
          "inputs": {
            "ventPipeCount": 8,
            "wastePercent": 10
          },
          "expected": 9,
          "toleranceDecimalPlaces": 0,
          "unit": "boots",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "12 vent pipes, 15% spare",
          "inputs": {
            "ventPipeCount": 12,
            "wastePercent": 15
          },
          "expected": 14,
          "toleranceDecimalPlaces": 0,
          "unit": "boots",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "roof-walk-pad-calculator",
      "title": "Roof Walk Pad Protection Panel Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/roof-walk-pad-calculator/",
      "sources": [
        "Panel count = ceil(walk path area ÷ single panel area), the standard coverage method for laying out protective walk pad panels"
      ],
      "vectors": [
        {
          "name": "20m² path, 0.84m² panel",
          "inputs": {
            "pathArea": 20,
            "panelArea": 0.84
          },
          "expected": 24,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30m² path, 0.84m² panel",
          "inputs": {
            "pathArea": 30,
            "panelArea": 0.84
          },
          "expected": 36,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "roofing-shingle-calculator",
      "title": "Roofing Shingle Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/roofing-shingle-calculator/",
      "sources": [
        "1 roofing square = 100 sq ft; standard 3-tab and architectural shingles use 3 bundles per square",
        "Roof surface area = footprint area x slope multiplier, where slope multiplier = sqrt(1 + (rise/12)²) for a given X/12 pitch"
      ],
      "vectors": [
        {
          "name": "10x10m flat roof, no waste",
          "inputs": {
            "footprintLength": 10,
            "footprintWidth": 10,
            "pitch": "0",
            "wasteFactorPercent": 0
          },
          "expected": 10.76,
          "toleranceDecimalPlaces": 1,
          "unit": "squares",
          "confidence": "high",
          "steps": [
            {
              "label": "Roof footprint area",
              "value": 100,
              "unit": "m²"
            },
            {
              "label": "Actual roof surface area",
              "value": 100,
              "unit": "m²"
            },
            {
              "label": "Roof surface area",
              "value": 1076.391041670972,
              "unit": "sq ft"
            },
            {
              "label": "Bundles needed",
              "value": 33,
              "unit": "bundles"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "10x10m footprint, 12/12 pitch, 10% waste",
          "inputs": {
            "footprintLength": 10,
            "footprintWidth": 10,
            "pitch": "12",
            "wasteFactorPercent": 10
          },
          "expected": 16.74,
          "toleranceDecimalPlaces": 1,
          "unit": "squares",
          "confidence": "high",
          "steps": [
            {
              "label": "Roof footprint area",
              "value": 100,
              "unit": "m²"
            },
            {
              "label": "Actual roof surface area",
              "value": 141.4213562373095,
              "unit": "m²"
            },
            {
              "label": "Roof surface area",
              "value": 1522.2468095479921,
              "unit": "sq ft"
            },
            {
              "label": "Bundles needed",
              "value": 51,
              "unit": "bundles"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "roofing-squares-to-square-feet-calculator",
      "title": "Roofing Squares to Square Feet Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/roofing-squares-to-square-feet-calculator/",
      "sources": [
        "A roofing square is defined as 100 square feet of roof surface area",
        "Shingle bundles are commonly packaged three to the square for standard three-tab and architectural products"
      ],
      "vectors": [
        {
          "name": "20 squares converts correctly",
          "inputs": {
            "squares": 20
          },
          "expected": 2000,
          "toleranceDecimalPlaces": 6,
          "unit": "sq ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 100,
              "unit": "sq ft per squares"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "squares": 200
          },
          "expected": 20000,
          "toleranceDecimalPlaces": 6,
          "unit": "sq ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 100,
              "unit": "sq ft per squares"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "roofing-underlayment-calculator",
      "title": "Roofing Underlayment Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/roofing-underlayment-calculator/",
      "sources": [
        "A standard synthetic roofing underlayment roll covers approximately 1,000 sq ft (10 roofing squares)"
      ],
      "vectors": [
        {
          "name": "200m² roof area",
          "inputs": {
            "roofArea": 200
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Area to cover (with overlap allowance)",
              "value": 2368.0602916761386,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "350m² roof area",
          "inputs": {
            "roofArea": 350
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Area to cover (with overlap allowance)",
              "value": 4144.105510433244,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "350m² roof with no overlap allowance",
          "inputs": {
            "roofArea": 350,
            "overlapPercent": 0
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Area to cover (with overlap allowance)",
              "value": 3767.3686458484026,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "room-heat-loss-calculator",
      "title": "Room Heat Loss and Radiator Size Calculator (Watts and BTU)",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/room-heat-loss-calculator/",
      "sources": [
        "BS EN 12831-1:2017, Energy performance of buildings — Method for calculation of the design heat load: each heated space's transmission loss (U × A × temperature difference over every element facing a colder space) plus its ventilation loss, at the internal and external design temperatures",
        "MCS MIS 3005-D, The Heat Pump Standard (Design), Issue 2.0 (2 December 2024), clause 5.5.1: (a) the heat load to BS EN 12831-1:2017 at internal temperatures not less than Table 1 and external temperatures from Table 2 column A (99%) or B (99.6%), with no uplift for intermittent heating where column B is used; (c) through a solid floor on the ground, the internal design temperature less the local annual average external air temperature; (d) through a suspended floor, the internal less the design external temperature. Table 1: living, dining and bedsitting rooms 21 °C; bedroom, hall and landing, kitchen and toilet 18 °C; bathroom 22 °C. Table 2, from CIBSE Guide A Table 2.5 (altitude, 99% and 99.6%): Belfast 68 m −1.5 and −3.2 °C, Birmingham 96 m −3.2 and −5.1, Cardiff 67 m −1.5 and −3.1, Edinburgh 35 m −3.2 and −5.4, Glasgow 5 m −3.5 and −5.9, London 25 m −1.7 and −3.0, Manchester 75 m −2.7 and −4.5, Plymouth 27 m −0.2 and −1.5",
        "MCS Heat Load Calculator documentation, Design Conditions: design room temperatures from the CIBSE Domestic Heating Design Guide (2026) Table 2-2 (age bands A to J and K onwards); design external air temperatures from CIBSE Guide A (2015) Table 2.5, lowered 0.6 °C for every whole 100 m the property stands above the reference location (its Glasgow figure is −5.6 °C, against MIS 3005-D Table 2's −5.9 °C); annual mean external temperatures from Met Office records 1981 to 2010, MGD 007 Table B1 (Thames Valley, Heathrow, 11.3 °C)",
        "MCS Heat Load Calculator documentation, Ventilation Rates: minimum room air change rates from the CIBSE Domestic Heating Design Guide (2026) Table 2-18 — 0.5 an hour for habitable rooms, 0 for an internal room or corridor, and zero for any room with no external envelope area; default air permeability 12 m³/h·m² at 50 Pa from BS EN 12831-1 Table B.6",
        "MCS Heat Load Calculator documentation, Thermal Bridging: RdSAP 10 Table 21's factor added to all external building elements — 0.15 W/m²K for age bands A to I, 0.11 for J, 0.08 from K",
        "BRE for the UK government, RdSAP10 Specification, version 4.0 (7 June 2026): Table 1 age bands; Table 3 wall thicknesses; Tables 6 and 13 wall U-values (England); Table 16 roof U-values by loft insulation depth and Table 18 when it is unknown; Table 20 exposed floors; Table 21 thermal bridging; Table 24 windows; Table 26 doors; §3.7, a door taken as 1.85 m²; §5.12, ground floors by BS EN ISO 13370, the U-value rounded to two decimal places, with clay soil (λ 1.5 W/m·K), Rsi 0.17, Rse 0.04 m²K/W, insulation at 0.035 W/m·K, and for a suspended floor a deck of 0.2 m²K/W, a 0.3 m void, 5 m/s wind, shielding 0.05, openings 0.003 m²/m and walls below the deck at 1.5 W/m²K",
        "BRE for the UK government, SAP 10.2 (14-03-2025): worksheet line (38), ventilation heat loss = 0.33 × air change rate × dwelling volume; Table 2.1 ventilation rates — open chimney 80 m³/h, chimney or open flue to a closed stove 10, to a solid-fuel boiler 20, to another heater 35, chimney permanently blocked 20, open flue under 200 mm 20, intermittent extract fan 10, passive vent 10, flueless gas fire 40; an air permeability at 50 Pa divided by 20 as the infiltration rate",
        "BS EN 442-2, Radiators and convectors — Test methods and rating: output = K × ΔT^n, rated at 75 °C flow, 65 °C return and 20 °C air (ΔT50); the logarithmic mean excess where (return − room) ÷ (flow − room) is below 0.7",
        "Purmo, product range GB catalogue (July 2024), Compact panel radiators: outputs at ΔT50 and ΔT30 tested to EN 442, and the n-coefficients from 1.2981 (Type 11, 300 mm high) to 1.3600 (Type 33, 900 mm) — a Type 22 750 × 1100 mm panel, n 1.3460, gives 2,261 W at ΔT50 and 1,137 W at ΔT30",
        "Approved Document L, Volume 1: Dwellings, 2021 edition incorporating 2023 amendments (England), paragraphs 5.8 and 5.10: heating sized on an appropriate heat loss calculation, and a new or fully replaced wet heating system sized to run at a maximum flow temperature of 55 °C or lower",
        "Approved Document L, Volume 1: Dwellings, 2026 edition (England), taking effect on 24 March 2027 for building work that is not higher-risk building work and on 24 September 2027 for higher-risk work: paragraph 4.9, heating designed on the BS EN 12831-1 heat loss calculation, and its note, a room-by-room calculation when a new heating system including the heating appliance and/or emitters is installed and a whole-dwelling one when only the appliance is replaced; paragraph 4.10, the 55 °C maximum flow temperature",
        "ACCA Manual J (8th edition), Residential Load Calculation — the US room-by-room procedure, named here and not reproduced, which designs every room at one indoor temperature, commonly 70 °F",
        "NIST Special Publication 811, Guide for the Use of the SI, Appendix B.8: one International Table Btu per hour is 0.2930711 W, the International Table Btu being exactly 1.055 055 852 62 kJ",
        "MCS 021, Heat Emitter Guide for Domestic Heat Pumps, Issue 2.1 (May 2015): the room heat loss in watts times an oversize factor is the emitter output needed at a mean water-to-air temperature difference of 50 °C; heat pump designs graded by flow temperature band, from up to 35 °C to 61–65 °C, with more stars for lower emitter temperatures",
        "National Building Code of Canada 2020 (National Research Council), Division B: Article 9.33.3.1, heating able to hold at least 22 °C in all living spaces, 18 °C in unfinished basements and 15 °C in heated crawl spaces at the outside winter design temperature; Articles 9.33.3.2 and 1.1.3.1, the outdoor design conditions from the authority having jurisdiction or else Appendix C's January 2.5% values; Article 9.33.5.1, the capacity of a dwelling's heating appliances determined to CSA F280 with those design temperatures",
        "Washington State Energy Code, Residential (WAC chapter 51-11R): WAC 51-11R-30200, Section R302.1, heating load calculations at an interior design temperature of at most 72 °F (22 °C); WAC 51-11R-60100, Table RC-1, Seattle (SeaTac airport) outdoor heating design temperature 24 °F; WAC 51-11R-30100, King County in climate zone 4C (marine); WAC 51-11R-40211, Table R402.1.2 for Climate Zone 5 and Marine 4, fenestration U-factor 0.30, ceiling U-factor 0.024, above-grade wall U-factor 0.056 and floor U-factor 0.029"
      ],
      "vectors": [
        {
          "name": "The bedroom a metric page opens on: 4 × 3.5 × 2.4 m under a 100 mm loft, one external wall, 18 °C against −3 °C",
          "inputs": {
            "roomTemp": 18,
            "outsideTemp": -3,
            "roomLength": 4,
            "roomWidth": 3.5,
            "ceilingHeight": 2.4,
            "externalLongWalls": 1,
            "externalShortWalls": 0,
            "wallU": 1.5,
            "windowArea": 2.5,
            "windowU": 2,
            "doorArea": 0,
            "doorU": 3,
            "ceilingAbove": "roof",
            "roofU": 0.4,
            "floorBelow": "heated",
            "groundFloorType": "solid",
            "groundFloorArea": 45,
            "groundFloorPerimeter": 21,
            "groundWallThickness": 0.25,
            "groundFloorInsulation": 0,
            "annualMeanTemp": 11.3,
            "exposedFloorU": 1.2,
            "bridgingAllowance": 0.15,
            "airChanges": 0.5,
            "ventDevice": "none",
            "flowTemp": 55,
            "returnTemp": 45,
            "radiatorExponent": 1.3
          },
          "expected": 2173.582,
          "toleranceDecimalPlaces": 2,
          "unit": "BTU/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Lost through the external walls",
              "value": 839.4380238739769,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the windows",
              "value": 385.1454868393194,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the external door",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the ceiling or roof",
              "value": 551.7433020767925,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the floor",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Lost warming the air that comes in",
              "value": 397.2551774952906,
              "unit": "BTU/h"
            },
            {
              "label": "Room heat loss in watts (W)",
              "value": 637.014,
              "unit": "W"
            },
            {
              "label": "Room heat loss in BTU per hour (BTU/h)",
              "value": 2173.5819902853796,
              "unit": "BTU/h"
            },
            {
              "label": "Floor U-value used, before the bridging allowance",
              "value": 0,
              "unit": "W/m²K"
            },
            {
              "label": "Room design temperature",
              "value": 18,
              "unit": "°C"
            },
            {
              "label": "Indoor-to-outdoor design difference",
              "value": 21,
              "unit": "Δ°C"
            },
            {
              "label": "Water temperature above the room (EN 442 excess)",
              "value": 32,
              "unit": "Δ°C"
            },
            {
              "label": "Radiator output here, as a share of its ΔT50 rating",
              "value": 55.98013818589583,
              "unit": "%"
            },
            {
              "label": "Radiator rating needed, as a multiple of the room's heat loss",
              "value": 1.7863478590911186,
              "unit": "×"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in watts (W)",
              "value": 1137.9285951110699,
              "unit": "W"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in BTU per hour (BTU/h)",
              "value": 3882.7735349053,
              "unit": "BTU/h"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A corner living room on a solid ground floor with an outside door: the floor's U from RdSAP's BS EN ISO 13370, against the annual mean",
          "inputs": {
            "roomTemp": 21,
            "outsideTemp": -3,
            "roomLength": 5,
            "roomWidth": 4,
            "ceilingHeight": 2.4,
            "externalLongWalls": 1,
            "externalShortWalls": 1,
            "wallU": 0.7,
            "windowArea": 3,
            "windowU": 2,
            "doorArea": 1.85,
            "doorU": 3,
            "ceilingAbove": "heated",
            "roofU": 0.4,
            "floorBelow": "ground",
            "groundFloorType": "solid",
            "groundFloorArea": 45,
            "groundFloorPerimeter": 21,
            "groundWallThickness": 0.25,
            "groundFloorInsulation": 0,
            "annualMeanTemp": 11.3,
            "exposedFloorU": 1.2,
            "bridgingAllowance": 0.15,
            "airChanges": 0.5,
            "ventDevice": "none",
            "flowTemp": 55,
            "returnTemp": 45,
            "radiatorExponent": 1.3
          },
          "expected": 3375.973,
          "toleranceDecimalPlaces": 2,
          "unit": "BTU/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Lost through the external walls",
              "value": 1165.9287960398265,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the windows",
              "value": 528.1995248082094,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the external door",
              "value": 477.22212880927754,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the ceiling or roof",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the floor",
              "value": 556.0426005345337,
              "unit": "BTU/h"
            },
            {
              "label": "Lost warming the air that comes in",
              "value": 648.5798816249641,
              "unit": "BTU/h"
            },
            {
              "label": "Room heat loss in watts (W)",
              "value": 989.3999999999999,
              "unit": "W"
            },
            {
              "label": "Room heat loss in BTU per hour (BTU/h)",
              "value": 3375.972931816811,
              "unit": "BTU/h"
            },
            {
              "label": "Floor U-value used, before the bridging allowance",
              "value": 0.69,
              "unit": "W/m²K"
            },
            {
              "label": "Room design temperature",
              "value": 21,
              "unit": "°C"
            },
            {
              "label": "Indoor-to-outdoor design difference",
              "value": 24,
              "unit": "Δ°C"
            },
            {
              "label": "Water temperature above the room (EN 442 excess)",
              "value": 29,
              "unit": "Δ°C"
            },
            {
              "label": "Radiator output here, as a share of its ΔT50 rating",
              "value": 49.25568822553023,
              "unit": "%"
            },
            {
              "label": "Radiator rating needed, as a multiple of the room's heat loss",
              "value": 2.030222368269904,
              "unit": "×"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in watts (W)",
              "value": 2008.7020111662428,
              "unit": "W"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in BTU per hour (BTU/h)",
              "value": 6853.975760848217,
              "unit": "BTU/h"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "The same room on a suspended timber floor: the void's U, against the design temperature",
          "inputs": {
            "roomTemp": 21,
            "outsideTemp": -3,
            "roomLength": 5,
            "roomWidth": 4,
            "ceilingHeight": 2.4,
            "externalLongWalls": 1,
            "externalShortWalls": 1,
            "wallU": 0.7,
            "windowArea": 3,
            "windowU": 2,
            "doorArea": 1.85,
            "doorU": 3,
            "ceilingAbove": "heated",
            "roofU": 0.4,
            "floorBelow": "ground",
            "groundFloorType": "suspended",
            "groundFloorArea": 45,
            "groundFloorPerimeter": 21,
            "groundWallThickness": 0.25,
            "groundFloorInsulation": 0,
            "annualMeanTemp": 11.3,
            "exposedFloorU": 1.2,
            "bridgingAllowance": 0.15,
            "airChanges": 0.5,
            "ventDevice": "none",
            "flowTemp": 55,
            "returnTemp": 45,
            "radiatorExponent": 1.3
          },
          "expected": 4228.462,
          "toleranceDecimalPlaces": 2,
          "unit": "BTU/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Lost through the external walls",
              "value": 1165.9287960398265,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the windows",
              "value": 528.1995248082094,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the external door",
              "value": 477.22212880927754,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the ceiling or roof",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the floor",
              "value": 1408.532066155225,
              "unit": "BTU/h"
            },
            {
              "label": "Lost warming the air that comes in",
              "value": 648.5798816249641,
              "unit": "BTU/h"
            },
            {
              "label": "Room heat loss in watts (W)",
              "value": 1239.2399999999998,
              "unit": "W"
            },
            {
              "label": "Room heat loss in BTU per hour (BTU/h)",
              "value": 4228.462397437503,
              "unit": "BTU/h"
            },
            {
              "label": "Floor U-value used, before the bridging allowance",
              "value": 0.71,
              "unit": "W/m²K"
            },
            {
              "label": "Room design temperature",
              "value": 21,
              "unit": "°C"
            },
            {
              "label": "Indoor-to-outdoor design difference",
              "value": 24,
              "unit": "Δ°C"
            },
            {
              "label": "Water temperature above the room (EN 442 excess)",
              "value": 29,
              "unit": "Δ°C"
            },
            {
              "label": "Radiator output here, as a share of its ΔT50 rating",
              "value": 49.25568822553023,
              "unit": "%"
            },
            {
              "label": "Radiator rating needed, as a multiple of the room's heat loss",
              "value": 2.030222368269904,
              "unit": "×"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in watts (W)",
              "value": 2515.9327676547955,
              "unit": "W"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in BTU per hour (BTU/h)",
              "value": 8584.718942665802,
              "unit": "BTU/h"
            }
          ],
          "basis": "cited",
          "sourceIndex": 5
        },
        {
          "name": "The metric opening with a heated room above and a garage below: RdSAP's 1.20 exposed floor",
          "inputs": {
            "roomTemp": 18,
            "outsideTemp": -3,
            "roomLength": 4,
            "roomWidth": 3.5,
            "ceilingHeight": 2.4,
            "externalLongWalls": 1,
            "externalShortWalls": 0,
            "wallU": 1.5,
            "windowArea": 2.5,
            "windowU": 2,
            "doorArea": 0,
            "doorU": 3,
            "ceilingAbove": "heated",
            "roofU": 0.4,
            "floorBelow": "exposed",
            "groundFloorType": "solid",
            "groundFloorArea": 45,
            "groundFloorPerimeter": 21,
            "groundWallThickness": 0.25,
            "groundFloorInsulation": 0,
            "annualMeanTemp": 11.3,
            "exposedFloorU": 1.2,
            "bridgingAllowance": 0.15,
            "airChanges": 0.5,
            "ventDevice": "none",
            "flowTemp": 55,
            "returnTemp": 45,
            "radiatorExponent": 1.3
          },
          "expected": 2976.118,
          "toleranceDecimalPlaces": 2,
          "unit": "BTU/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Lost through the external walls",
              "value": 839.4380238739769,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the windows",
              "value": 385.1454868393194,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the external door",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the ceiling or roof",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the floor",
              "value": 1354.2790141884905,
              "unit": "BTU/h"
            },
            {
              "label": "Lost warming the air that comes in",
              "value": 397.2551774952906,
              "unit": "BTU/h"
            },
            {
              "label": "Room heat loss in watts (W)",
              "value": 872.2139999999999,
              "unit": "W"
            },
            {
              "label": "Room heat loss in BTU per hour (BTU/h)",
              "value": 2976.117702397077,
              "unit": "BTU/h"
            },
            {
              "label": "Floor U-value used, before the bridging allowance",
              "value": 1.2,
              "unit": "W/m²K"
            },
            {
              "label": "Room design temperature",
              "value": 18,
              "unit": "°C"
            },
            {
              "label": "Indoor-to-outdoor design difference",
              "value": 21,
              "unit": "Δ°C"
            },
            {
              "label": "Water temperature above the room (EN 442 excess)",
              "value": 32,
              "unit": "Δ°C"
            },
            {
              "label": "Radiator output here, as a share of its ΔT50 rating",
              "value": 55.98013818589583,
              "unit": "%"
            },
            {
              "label": "Radiator rating needed, as a multiple of the room's heat loss",
              "value": 1.7863478590911186,
              "unit": "×"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in watts (W)",
              "value": 1558.0776115693009,
              "unit": "W"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in BTU per hour (BTU/h)",
              "value": 5316.381486080198,
              "unit": "BTU/h"
            }
          ],
          "basis": "cited",
          "sourceIndex": 5
        },
        {
          "name": "The metric opening as a study at 21 °C with an open chimney: SAP 10.2's 80 m³/h",
          "inputs": {
            "roomTemp": 21,
            "outsideTemp": -3,
            "roomLength": 4,
            "roomWidth": 3.5,
            "ceilingHeight": 2.4,
            "externalLongWalls": 1,
            "externalShortWalls": 0,
            "wallU": 1.5,
            "windowArea": 2.5,
            "windowU": 2,
            "doorArea": 0,
            "doorU": 3,
            "ceilingAbove": "roof",
            "roofU": 0.4,
            "floorBelow": "heated",
            "groundFloorType": "solid",
            "groundFloorArea": 45,
            "groundFloorPerimeter": 21,
            "groundWallThickness": 0.25,
            "groundFloorInsulation": 0,
            "annualMeanTemp": 11.3,
            "exposedFloorU": 1.2,
            "bridgingAllowance": 0.15,
            "airChanges": 0.5,
            "ventDevice": "open-chimney",
            "flowTemp": 55,
            "returnTemp": 45,
            "radiatorExponent": 1.3
          },
          "expected": 4646.027,
          "toleranceDecimalPlaces": 2,
          "unit": "BTU/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Lost through the external walls",
              "value": 959.3577415702593,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the windows",
              "value": 440.1662706735079,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the external door",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the ceiling or roof",
              "value": 630.5637738020486,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the floor",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Lost warming the air that comes in",
              "value": 2615.938855887355,
              "unit": "BTU/h"
            },
            {
              "label": "Room heat loss in watts (W)",
              "value": 1361.616,
              "unit": "W"
            },
            {
              "label": "Room heat loss in BTU per hour (BTU/h)",
              "value": 4646.026641933171,
              "unit": "BTU/h"
            },
            {
              "label": "Floor U-value used, before the bridging allowance",
              "value": 0,
              "unit": "W/m²K"
            },
            {
              "label": "Room design temperature",
              "value": 21,
              "unit": "°C"
            },
            {
              "label": "Indoor-to-outdoor design difference",
              "value": 24,
              "unit": "Δ°C"
            },
            {
              "label": "Water temperature above the room (EN 442 excess)",
              "value": 29,
              "unit": "Δ°C"
            },
            {
              "label": "Radiator output here, as a share of its ΔT50 rating",
              "value": 49.25568822553023,
              "unit": "%"
            },
            {
              "label": "Radiator rating needed, as a multiple of the room's heat loss",
              "value": 2.030222368269904,
              "unit": "×"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in watts (W)",
              "value": 2764.3832601941936,
              "unit": "W"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in BTU per hour (BTU/h)",
              "value": 9432.467212030631,
              "unit": "BTU/h"
            }
          ],
          "basis": "cited",
          "sourceIndex": 6
        },
        {
          "name": "A 2007-built en-suite bedroom at 21 °C, 270 mm loft, two outside walls, a blocked chimney, heat pump at 45/40",
          "inputs": {
            "roomTemp": 21,
            "outsideTemp": -3,
            "roomLength": 3.6,
            "roomWidth": 3.2,
            "ceilingHeight": 2.4,
            "externalLongWalls": 1,
            "externalShortWalls": 1,
            "wallU": 0.3,
            "windowArea": 2,
            "windowU": 1.4,
            "doorArea": 0,
            "doorU": 3,
            "ceilingAbove": "roof",
            "roofU": 0.16,
            "floorBelow": "heated",
            "groundFloorType": "solid",
            "groundFloorArea": 45,
            "groundFloorPerimeter": 21,
            "groundWallThickness": 0.25,
            "groundFloorInsulation": 0,
            "annualMeanTemp": 11.3,
            "exposedFloorU": 1.2,
            "bridgingAllowance": 0.08,
            "airChanges": 0.5,
            "ventDevice": "blocked-chimney",
            "flowTemp": 45,
            "returnTemp": 40,
            "radiatorExponent": 1.3
          },
          "expected": 1828.497,
          "toleranceDecimalPlaces": 2,
          "unit": "BTU/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Lost through the external walls",
              "value": 445.6202378598996,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the windows",
              "value": 242.3985416174108,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the external door",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the ceiling or roof",
              "value": 226.41334049453292,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the floor",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Lost warming the air that comes in",
              "value": 914.0652465034494,
              "unit": "BTU/h"
            },
            {
              "label": "Room heat loss in watts (W)",
              "value": 535.87968,
              "unit": "W"
            },
            {
              "label": "Room heat loss in BTU per hour (BTU/h)",
              "value": 1828.497366475293,
              "unit": "BTU/h"
            },
            {
              "label": "Floor U-value used, before the bridging allowance",
              "value": 0,
              "unit": "W/m²K"
            },
            {
              "label": "Room design temperature",
              "value": 21,
              "unit": "°C"
            },
            {
              "label": "Indoor-to-outdoor design difference",
              "value": 24,
              "unit": "Δ°C"
            },
            {
              "label": "Water temperature above the room (EN 442 excess)",
              "value": 21.5,
              "unit": "Δ°C"
            },
            {
              "label": "Radiator output here, as a share of its ΔT50 rating",
              "value": 33.38174169271837,
              "unit": "%"
            },
            {
              "label": "Radiator rating needed, as a multiple of the room's heat loss",
              "value": 2.9956495655771374,
              "unit": "×"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in watts (W)",
              "value": 1605.3077305936154,
              "unit": "W"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in BTU per hour (BTU/h)",
              "value": 5477.53734154065,
              "unit": "BTU/h"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "A small bathroom at 22 °C with a passive stack vent, where 55/45 water falls under EN 442's 0.7 ratio",
          "inputs": {
            "roomTemp": 22,
            "outsideTemp": -3,
            "roomLength": 2.5,
            "roomWidth": 2,
            "ceilingHeight": 2.4,
            "externalLongWalls": 1,
            "externalShortWalls": 0,
            "wallU": 1.5,
            "windowArea": 0.6,
            "windowU": 2.8,
            "doorArea": 0,
            "doorU": 3,
            "ceilingAbove": "roof",
            "roofU": 0.4,
            "floorBelow": "heated",
            "groundFloorType": "solid",
            "groundFloorArea": 45,
            "groundFloorPerimeter": 21,
            "groundWallThickness": 0.25,
            "groundFloorInsulation": 0,
            "annualMeanTemp": 11.3,
            "exposedFloorU": 1.2,
            "bridgingAllowance": 0.15,
            "airChanges": 0.5,
            "ventDevice": "passive-vent",
            "flowTemp": 55,
            "returnTemp": 45,
            "radiatorExponent": 1.3
          },
          "expected": 1596.029,
          "toleranceDecimalPlaces": 2,
          "unit": "BTU/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Lost through the external walls",
              "value": 760.0545487792549,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the windows",
              "value": 150.98726726591255,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the external door",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the ceiling or roof",
              "value": 234.5847372775478,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the floor",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Lost warming the air that comes in",
              "value": 450.4026955728918,
              "unit": "BTU/h"
            },
            {
              "label": "Room heat loss in watts (W)",
              "value": 467.75,
              "unit": "W"
            },
            {
              "label": "Room heat loss in BTU per hour (BTU/h)",
              "value": 1596.029248895607,
              "unit": "BTU/h"
            },
            {
              "label": "Floor U-value used, before the bridging allowance",
              "value": 0,
              "unit": "W/m²K"
            },
            {
              "label": "Room design temperature",
              "value": 22,
              "unit": "°C"
            },
            {
              "label": "Indoor-to-outdoor design difference",
              "value": 25,
              "unit": "Δ°C"
            },
            {
              "label": "Water temperature above the room (EN 442 excess)",
              "value": 27.699807011610744,
              "unit": "Δ°C"
            },
            {
              "label": "Radiator output here, as a share of its ΔT50 rating",
              "value": 46.40435714610588,
              "unit": "%"
            },
            {
              "label": "Radiator rating needed, as a multiple of the room's heat loss",
              "value": 2.1549700534617084,
              "unit": "×"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in watts (W)",
              "value": 1007.9872425067141,
              "unit": "W"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in BTU per hour (BTU/h)",
              "value": 3439.3952358190163,
              "unit": "BTU/h"
            }
          ],
          "basis": "cited",
          "sourceIndex": 7
        },
        {
          "name": "A Birmingham hall at 18 °C with a front door and an old open flue on an insulated solid floor, against the Midlands' annual mean",
          "inputs": {
            "roomTemp": 18,
            "outsideTemp": -5.1,
            "roomLength": 4.5,
            "roomWidth": 1.8,
            "ceilingHeight": 2.4,
            "externalLongWalls": 0,
            "externalShortWalls": 1,
            "wallU": 1.5,
            "windowArea": 0.4,
            "windowU": 2,
            "doorArea": 1.85,
            "doorU": 3,
            "ceilingAbove": "heated",
            "roofU": 0.4,
            "floorBelow": "ground",
            "groundFloorType": "solid",
            "groundFloorArea": 60,
            "groundFloorPerimeter": 32,
            "groundWallThickness": 0.3,
            "groundFloorInsulation": 0.025,
            "annualMeanTemp": 9.8,
            "exposedFloorU": 1.2,
            "bridgingAllowance": 0.15,
            "airChanges": 0.5,
            "ventDevice": "small-open-flue",
            "flowTemp": 70,
            "returnTemp": 50,
            "radiatorExponent": 1.3
          },
          "expected": 1707.61,
          "toleranceDecimalPlaces": 2,
          "unit": "BTU/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Lost through the external walls",
              "value": 269.2113211776121,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the windows",
              "value": 67.7856056837202,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the external door",
              "value": 459.3262989789297,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the ceiling or roof",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the floor",
              "value": 138.24701283613936,
              "unit": "BTU/h"
            },
            {
              "label": "Lost warming the air that comes in",
              "value": 773.0396584926215,
              "unit": "BTU/h"
            },
            {
              "label": "Room heat loss in watts (W)",
              "value": 500.45106,
              "unit": "W"
            },
            {
              "label": "Room heat loss in BTU per hour (BTU/h)",
              "value": 1707.6098971690226,
              "unit": "BTU/h"
            },
            {
              "label": "Floor U-value used, before the bridging allowance",
              "value": 0.46,
              "unit": "W/m²K"
            },
            {
              "label": "Room design temperature",
              "value": 18,
              "unit": "°C"
            },
            {
              "label": "Indoor-to-outdoor design difference",
              "value": 23.1,
              "unit": "Δ°C"
            },
            {
              "label": "Water temperature above the room (EN 442 excess)",
              "value": 41.19398153827582,
              "unit": "Δ°C"
            },
            {
              "label": "Radiator output here, as a share of its ΔT50 rating",
              "value": 77.73612631070357,
              "unit": "%"
            },
            {
              "label": "Radiator rating needed, as a multiple of the room's heat loss",
              "value": 1.2864031788812056,
              "unit": "×"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in watts (W)",
              "value": 643.781834458469,
              "unit": "W"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in BTU per hour (BTU/h)",
              "value": 2196.6748000072394,
              "unit": "BTU/h"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A ground-floor WC at 18 °C with an extract fan, heated rooms above and below",
          "inputs": {
            "roomTemp": 18,
            "outsideTemp": -3,
            "roomLength": 1.6,
            "roomWidth": 0.9,
            "ceilingHeight": 2.4,
            "externalLongWalls": 1,
            "externalShortWalls": 0,
            "wallU": 1.5,
            "windowArea": 0.3,
            "windowU": 2,
            "doorArea": 0,
            "doorU": 3,
            "ceilingAbove": "heated",
            "roofU": 0.4,
            "floorBelow": "heated",
            "groundFloorType": "solid",
            "groundFloorArea": 45,
            "groundFloorPerimeter": 21,
            "groundWallThickness": 0.25,
            "groundFloorInsulation": 0,
            "annualMeanTemp": 11.3,
            "exposedFloorU": 1.2,
            "bridgingAllowance": 0.15,
            "airChanges": 0.5,
            "ventDevice": "extract-fan",
            "flowTemp": 55,
            "returnTemp": 45,
            "radiatorExponent": 1.3
          },
          "expected": 742.076,
          "toleranceDecimalPlaces": 2,
          "unit": "BTU/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Lost through the external walls",
              "value": 418.5367048611096,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the windows",
              "value": 46.217458420718316,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the external door",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the ceiling or roof",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the floor",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Lost warming the air that comes in",
              "value": 277.3219477181409,
              "unit": "BTU/h"
            },
            {
              "label": "Room heat loss in watts (W)",
              "value": 217.48104,
              "unit": "W"
            },
            {
              "label": "Room heat loss in BTU per hour (BTU/h)",
              "value": 742.0761109999689,
              "unit": "BTU/h"
            },
            {
              "label": "Floor U-value used, before the bridging allowance",
              "value": 0,
              "unit": "W/m²K"
            },
            {
              "label": "Room design temperature",
              "value": 18,
              "unit": "°C"
            },
            {
              "label": "Indoor-to-outdoor design difference",
              "value": 21,
              "unit": "Δ°C"
            },
            {
              "label": "Water temperature above the room (EN 442 excess)",
              "value": 32,
              "unit": "Δ°C"
            },
            {
              "label": "Radiator output here, as a share of its ΔT50 rating",
              "value": 55.98013818589583,
              "unit": "%"
            },
            {
              "label": "Radiator rating needed, as a multiple of the room's heat loss",
              "value": 1.7863478590911186,
              "unit": "×"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in watts (W)",
              "value": 388.49679019690996,
              "unit": "W"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in BTU per hour (BTU/h)",
              "value": 1325.6060721674578,
              "unit": "BTU/h"
            }
          ],
          "basis": "cited",
          "sourceIndex": 6
        },
        {
          "name": "A solid-brick utility room at 18 °C with single glazing, a back door and a solid-fuel boiler's flue",
          "inputs": {
            "roomTemp": 18,
            "outsideTemp": -3,
            "roomLength": 2.8,
            "roomWidth": 2.2,
            "ceilingHeight": 2.4,
            "externalLongWalls": 1,
            "externalShortWalls": 1,
            "wallU": 1.7,
            "windowArea": 0.8,
            "windowU": 4.8,
            "doorArea": 1.85,
            "doorU": 3,
            "ceilingAbove": "heated",
            "roofU": 0.4,
            "floorBelow": "ground",
            "groundFloorType": "solid",
            "groundFloorArea": 45,
            "groundFloorPerimeter": 21,
            "groundWallThickness": 0.25,
            "groundFloorInsulation": 0,
            "annualMeanTemp": 11.3,
            "exposedFloorU": 1.2,
            "bridgingAllowance": 0.15,
            "airChanges": 0.5,
            "ventDevice": "solid-fuel-boiler-flue",
            "flowTemp": 55,
            "returnTemp": 45,
            "radiatorExponent": 1.3
          },
          "expected": 2706.784,
          "toleranceDecimalPlaces": 2,
          "unit": "BTU/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Lost through the external walls",
              "value": 1239.4519178796515,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the windows",
              "value": 283.75369821092187,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the external door",
              "value": 417.56936270811786,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the ceiling or roof",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the floor",
              "value": 118.29376396526428,
              "unit": "BTU/h"
            },
            {
              "label": "Lost warming the air that comes in",
              "value": 647.7151084494642,
              "unit": "BTU/h"
            },
            {
              "label": "Room heat loss in watts (W)",
              "value": 793.2800400000001,
              "unit": "W"
            },
            {
              "label": "Room heat loss in BTU per hour (BTU/h)",
              "value": 2706.78385121342,
              "unit": "BTU/h"
            },
            {
              "label": "Floor U-value used, before the bridging allowance",
              "value": 0.69,
              "unit": "W/m²K"
            },
            {
              "label": "Room design temperature",
              "value": 18,
              "unit": "°C"
            },
            {
              "label": "Indoor-to-outdoor design difference",
              "value": 21,
              "unit": "Δ°C"
            },
            {
              "label": "Water temperature above the room (EN 442 excess)",
              "value": 32,
              "unit": "Δ°C"
            },
            {
              "label": "Radiator output here, as a share of its ΔT50 rating",
              "value": 55.98013818589583,
              "unit": "%"
            },
            {
              "label": "Radiator rating needed, as a multiple of the room's heat loss",
              "value": 1.7863478590911186,
              "unit": "×"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in watts (W)",
              "value": 1417.0741011137172,
              "unit": "W"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in BTU per hour (BTU/h)",
              "value": 4835.257537637506,
              "unit": "BTU/h"
            }
          ],
          "basis": "cited",
          "sourceIndex": 5
        },
        {
          "name": "A US room to Manual J's 70 °F against 10 °F outside, 16 × 12 × 8 ft, a gas heater's flue, water at 180/160 °F",
          "inputs": {
            "roomTemp": 21.11111111111111,
            "outsideTemp": -12.222222222222221,
            "roomLength": 4.8768,
            "roomWidth": 3.6576,
            "ceilingHeight": 2.4384,
            "externalLongWalls": 1,
            "externalShortWalls": 1,
            "wallU": 0.45,
            "windowArea": 2.787,
            "windowU": 1.7,
            "doorArea": 0,
            "doorU": 3,
            "ceilingAbove": "roof",
            "roofU": 0.17,
            "floorBelow": "heated",
            "groundFloorType": "solid",
            "groundFloorArea": 45,
            "groundFloorPerimeter": 21,
            "groundWallThickness": 0.25,
            "groundFloorInsulation": 0,
            "annualMeanTemp": 11.3,
            "exposedFloorU": 1.2,
            "bridgingAllowance": 0,
            "airChanges": 0.35,
            "ventDevice": "heater-flue",
            "flowTemp": 82.22222222222223,
            "returnTemp": 71.11111111111111,
            "radiatorExponent": 1.3
          },
          "expected": 3691.297,
          "toleranceDecimalPlaces": 2,
          "unit": "BTU/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Lost through the external walls",
              "value": 922.4698099376791,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the windows",
              "value": 538.8795281198999,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the external door",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the ceiling or roof",
              "value": 344.8941837234304,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the floor",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Lost warming the air that comes in",
              "value": 1885.0530135294734,
              "unit": "BTU/h"
            },
            {
              "label": "Room heat loss in watts (W)",
              "value": 1081.812225926451,
              "unit": "W"
            },
            {
              "label": "Room heat loss in BTU per hour (BTU/h)",
              "value": 3691.296535310483,
              "unit": "BTU/h"
            },
            {
              "label": "Floor U-value used, before the bridging allowance",
              "value": 0,
              "unit": "W/m²K"
            },
            {
              "label": "Room design temperature",
              "value": 21.11111111111111,
              "unit": "°C"
            },
            {
              "label": "Indoor-to-outdoor design difference",
              "value": 33.33333333333333,
              "unit": "Δ°C"
            },
            {
              "label": "Water temperature above the room (EN 442 excess)",
              "value": 55.55555555555556,
              "unit": "Δ°C"
            },
            {
              "label": "Radiator output here, as a share of its ΔT50 rating",
              "value": 114.67922193646555,
              "unit": "%"
            },
            {
              "label": "Radiator rating needed, as a multiple of the room's heat loss",
              "value": 0.871997545077537,
              "unit": "×"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in watts (W)",
              "value": 943.3376052427311,
              "unit": "W"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in BTU per hour (BTU/h)",
              "value": 3218.801516943959,
              "unit": "BTU/h"
            }
          ],
          "basis": "cited",
          "sourceIndex": 11
        },
        {
          "name": "The corner living room with a closed wood stove's flue, over a heated room",
          "inputs": {
            "roomTemp": 21,
            "outsideTemp": -3,
            "roomLength": 5,
            "roomWidth": 4,
            "ceilingHeight": 2.4,
            "externalLongWalls": 1,
            "externalShortWalls": 1,
            "wallU": 0.7,
            "windowArea": 3,
            "windowU": 2,
            "doorArea": 1.85,
            "doorU": 3,
            "ceilingAbove": "heated",
            "roofU": 0.4,
            "floorBelow": "heated",
            "groundFloorType": "solid",
            "groundFloorArea": 45,
            "groundFloorPerimeter": 21,
            "groundWallThickness": 0.25,
            "groundFloorInsulation": 0,
            "annualMeanTemp": 11.3,
            "exposedFloorU": 1.2,
            "bridgingAllowance": 0.15,
            "airChanges": 0.5,
            "ventDevice": "stove-flue",
            "flowTemp": 55,
            "returnTemp": 45,
            "radiatorExponent": 1.3
          },
          "expected": 3090.172,
          "toleranceDecimalPlaces": 2,
          "unit": "BTU/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Lost through the external walls",
              "value": 1165.9287960398265,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the windows",
              "value": 528.1995248082094,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the external door",
              "value": 477.22212880927754,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the ceiling or roof",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the floor",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Lost warming the air that comes in",
              "value": 918.8214989686993,
              "unit": "BTU/h"
            },
            {
              "label": "Room heat loss in watts (W)",
              "value": 905.6399999999999,
              "unit": "W"
            },
            {
              "label": "Room heat loss in BTU per hour (BTU/h)",
              "value": 3090.1719486260126,
              "unit": "BTU/h"
            },
            {
              "label": "Floor U-value used, before the bridging allowance",
              "value": 0,
              "unit": "W/m²K"
            },
            {
              "label": "Room design temperature",
              "value": 21,
              "unit": "°C"
            },
            {
              "label": "Indoor-to-outdoor design difference",
              "value": 24,
              "unit": "Δ°C"
            },
            {
              "label": "Water temperature above the room (EN 442 excess)",
              "value": 29,
              "unit": "Δ°C"
            },
            {
              "label": "Radiator output here, as a share of its ΔT50 rating",
              "value": 49.25568822553023,
              "unit": "%"
            },
            {
              "label": "Radiator rating needed, as a multiple of the room's heat loss",
              "value": 2.030222368269904,
              "unit": "×"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in watts (W)",
              "value": 1838.6505855999555,
              "unit": "W"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in BTU per hour (BTU/h)",
              "value": 6273.736211900727,
              "unit": "BTU/h"
            }
          ],
          "basis": "cited",
          "sourceIndex": 6
        },
        {
          "name": "The corner room as a dining room with a flueless gas fire, on water at 50/30",
          "inputs": {
            "roomTemp": 21,
            "outsideTemp": -3,
            "roomLength": 5,
            "roomWidth": 4,
            "ceilingHeight": 2.4,
            "externalLongWalls": 1,
            "externalShortWalls": 1,
            "wallU": 0.7,
            "windowArea": 3,
            "windowU": 2,
            "doorArea": 1.85,
            "doorU": 3,
            "ceilingAbove": "heated",
            "roofU": 0.4,
            "floorBelow": "heated",
            "groundFloorType": "solid",
            "groundFloorArea": 45,
            "groundFloorPerimeter": 21,
            "groundWallThickness": 0.25,
            "groundFloorInsulation": 0,
            "annualMeanTemp": 11.3,
            "exposedFloorU": 1.2,
            "bridgingAllowance": 0.15,
            "airChanges": 0.5,
            "ventDevice": "flueless-gas-fire",
            "flowTemp": 50,
            "returnTemp": 30,
            "radiatorExponent": 1.3
          },
          "expected": 3900.897,
          "toleranceDecimalPlaces": 2,
          "unit": "BTU/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Lost through the external walls",
              "value": 1165.9287960398265,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the windows",
              "value": 528.1995248082094,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the external door",
              "value": 477.22212880927754,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the ceiling or roof",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the floor",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Lost warming the air that comes in",
              "value": 1729.5463509999045,
              "unit": "BTU/h"
            },
            {
              "label": "Room heat loss in watts (W)",
              "value": 1143.2399999999998,
              "unit": "W"
            },
            {
              "label": "Room heat loss in BTU per hour (BTU/h)",
              "value": 3900.896800657217,
              "unit": "BTU/h"
            },
            {
              "label": "Floor U-value used, before the bridging allowance",
              "value": 0,
              "unit": "W/m²K"
            },
            {
              "label": "Room design temperature",
              "value": 21,
              "unit": "°C"
            },
            {
              "label": "Indoor-to-outdoor design difference",
              "value": 24,
              "unit": "Δ°C"
            },
            {
              "label": "Water temperature above the room (EN 442 excess)",
              "value": 17.092976136879923,
              "unit": "Δ°C"
            },
            {
              "label": "Radiator output here, as a share of its ΔT50 rating",
              "value": 24.77433390043313,
              "unit": "%"
            },
            {
              "label": "Radiator rating needed, as a multiple of the room's heat loss",
              "value": 4.036435465909809,
              "unit": "×"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in watts (W)",
              "value": 4614.61448204673,
              "unit": "W"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in BTU per hour (BTU/h)",
              "value": 15745.7181950269,
              "unit": "BTU/h"
            }
          ],
          "basis": "cited",
          "sourceIndex": 6
        },
        {
          "name": "The room an imperial page opens on: 13 × 11.5 × 8 ft in Seattle at 70 °F against 24 °F, built to Washington's energy code",
          "inputs": {
            "roomTemp": 21.11111111111111,
            "outsideTemp": -4.444444444444445,
            "roomLength": 3.9624,
            "roomWidth": 3.5052,
            "ceilingHeight": 2.4384,
            "externalLongWalls": 1,
            "externalShortWalls": 0,
            "wallU": 0.31798274710235536,
            "windowArea": 2.50838208,
            "windowU": 1.7034790023340463,
            "doorArea": 0,
            "doorU": 3,
            "ceilingAbove": "roof",
            "roofU": 0.1362783201867237,
            "floorBelow": "heated",
            "groundFloorType": "solid",
            "groundFloorArea": 45,
            "groundFloorPerimeter": 21,
            "groundWallThickness": 0.25,
            "groundFloorInsulation": 0,
            "annualMeanTemp": 11.3,
            "exposedFloorU": 1.2,
            "bridgingAllowance": 0,
            "airChanges": 0.5,
            "ventDevice": "none",
            "flowTemp": 55,
            "returnTemp": 45,
            "radiatorExponent": 1.3
          },
          "expected": 1223.273,
          "toleranceDecimalPlaces": 2,
          "unit": "BTU/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Lost through the external walls",
              "value": 198.35200000000154,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the windows",
              "value": 372.6000000000028,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the external door",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the ceiling or roof",
              "value": 165.04800000000125,
              "unit": "BTU/h"
            },
            {
              "label": "Lost through the floor",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Lost warming the air that comes in",
              "value": 487.2730456100067,
              "unit": "BTU/h"
            },
            {
              "label": "Room heat loss in watts (W)",
              "value": 358.5059405897572,
              "unit": "W"
            },
            {
              "label": "Room heat loss in BTU per hour (BTU/h)",
              "value": 1223.2730456100123,
              "unit": "BTU/h"
            },
            {
              "label": "Floor U-value used, before the bridging allowance",
              "value": 0,
              "unit": "W/m²K"
            },
            {
              "label": "Room design temperature",
              "value": 21.11111111111111,
              "unit": "°C"
            },
            {
              "label": "Indoor-to-outdoor design difference",
              "value": 25.555555555555557,
              "unit": "Δ°C"
            },
            {
              "label": "Water temperature above the room (EN 442 excess)",
              "value": 28.88888888888889,
              "unit": "Δ°C"
            },
            {
              "label": "Radiator output here, as a share of its ΔT50 rating",
              "value": 49.010494503256815,
              "unit": "%"
            },
            {
              "label": "Radiator rating needed, as a multiple of the room's heat loss",
              "value": 2.040379331274751,
              "unit": "×"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in watts (W)",
              "value": 731.4881113185544,
              "unit": "W"
            },
            {
              "label": "Radiator rating to look for at ΔT50, in BTU per hour (BTU/h)",
              "value": 2495.941038768185,
              "unit": "BTU/h"
            }
          ],
          "basis": "cited",
          "sourceIndex": 15
        }
      ]
    },
    {
      "slug": "round-steel-pipe-weight-calculator",
      "title": "Round Steel Pipe Weight Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/round-steel-pipe-weight-calculator/",
      "sources": [
        "Pipe cross-sectional area = π×(OD² − ID²)/4, where ID = OD − 2×wall thickness; weight per unit length = area × steel density (7850 kg/m³)"
      ],
      "vectors": [
        {
          "name": "114.3mm OD, 6mm wall (approx. 4in Sch 40)",
          "inputs": {
            "outerDiameter": 0.1143,
            "wallThickness": 0.006
          },
          "expected": 16.03,
          "toleranceDecimalPlaces": 2,
          "unit": "kg/m",
          "confidence": "high",
          "steps": [
            {
              "label": "Cross-sectional area",
              "value": 2041.4069063026482,
              "unit": "mm²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "168.3mm OD, 7.11mm wall (approx. 6in Sch 40)",
          "inputs": {
            "outerDiameter": 0.1683,
            "wallThickness": 0.00711
          },
          "expected": 28.26,
          "toleranceDecimalPlaces": 2,
          "unit": "kg/m",
          "confidence": "high",
          "steps": [
            {
              "label": "Cross-sectional area",
              "value": 3600.456504006505,
              "unit": "mm²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "rsi-to-r-value-calculator",
      "title": "RSI to R-Value Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/rsi-to-r-value-calculator/",
      "sources": [
        "NIST SP 811, Appendix B — thermal insulance: 1 m²·K/W = 5.678263 h·ft²·°F/BTU",
        "ASTM C168, Standard Terminology Relating to Thermal Insulation"
      ],
      "vectors": [
        {
          "name": "RSI 3.5 is very nearly R-20",
          "inputs": {
            "rsi": 3.5
          },
          "expected": 19.873922,
          "toleranceDecimalPlaces": 4,
          "unit": "h·ft²·°F/BTU",
          "confidence": "high",
          "steps": [
            {
              "label": "RSI entered",
              "value": 3.5,
              "unit": "m²·K/W"
            },
            {
              "label": "Nearest whole R-value",
              "value": 20,
              "unit": "h·ft²·°F/BTU"
            },
            {
              "label": "IP U-factor (the reciprocal)",
              "value": 0.05031719533780204,
              "unit": "BTU/h·ft²·°F"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "RSI 1 is the factor itself",
          "inputs": {
            "rsi": 1
          },
          "expected": 5.6782633,
          "toleranceDecimalPlaces": 5,
          "unit": "h·ft²·°F/BTU",
          "confidence": "high",
          "steps": [
            {
              "label": "RSI entered",
              "value": 1,
              "unit": "m²·K/W"
            },
            {
              "label": "Nearest whole R-value",
              "value": 6,
              "unit": "h·ft²·°F/BTU"
            },
            {
              "label": "IP U-factor (the reciprocal)",
              "value": 0.17611018368230716,
              "unit": "BTU/h·ft²·°F"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "RSI 8.8 is about R-50",
          "inputs": {
            "rsi": 8.8
          },
          "expected": 49.968717,
          "toleranceDecimalPlaces": 4,
          "unit": "h·ft²·°F/BTU",
          "confidence": "high",
          "steps": [
            {
              "label": "RSI entered",
              "value": 8.8,
              "unit": "m²·K/W"
            },
            {
              "label": "Nearest whole R-value",
              "value": 50,
              "unit": "h·ft²·°F/BTU"
            },
            {
              "label": "IP U-factor (the reciprocal)",
              "value": 0.020012520872989447,
              "unit": "BTU/h·ft²·°F"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "RSI 0.5 is R-2.84",
          "inputs": {
            "rsi": 0.5
          },
          "expected": 2.8391317,
          "toleranceDecimalPlaces": 5,
          "unit": "h·ft²·°F/BTU",
          "confidence": "high",
          "steps": [
            {
              "label": "RSI entered",
              "value": 0.5,
              "unit": "m²·K/W"
            },
            {
              "label": "Nearest whole R-value",
              "value": 3,
              "unit": "h·ft²·°F/BTU"
            },
            {
              "label": "IP U-factor (the reciprocal)",
              "value": 0.3522203673646143,
              "unit": "BTU/h·ft²·°F"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "running-cost-to-kwh-calculator",
      "title": "Running Cost to kWh Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/running-cost-to-kwh-calculator/",
      "sources": [
        "Arithmetic only: energy = amount spent ÷ your unit rate. No tariff data is published here."
      ],
      "vectors": [
        {
          "name": "100 at 0.25 per kWh is 400 kWh",
          "inputs": {
            "cost": 100,
            "ratePerKwh": 0.25
          },
          "expected": 400,
          "toleranceDecimalPlaces": 2,
          "unit": "kWh",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "25 at 0.25 per kWh is 100 kWh",
          "inputs": {
            "cost": 25,
            "ratePerKwh": 0.25
          },
          "expected": 100,
          "toleranceDecimalPlaces": 2,
          "unit": "kWh",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "A 1,200 annual bill at 0.30 per kWh",
          "inputs": {
            "cost": 1200,
            "ratePerKwh": 0.3
          },
          "expected": 4000,
          "toleranceDecimalPlaces": 2,
          "unit": "kWh",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Nothing spent is nothing used",
          "inputs": {
            "cost": 0,
            "ratePerKwh": 0.2
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "kWh",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "safety-net-barrier-area-calculator",
      "title": "Perimeter Safety Debris Net Barrier Area Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/safety-net-barrier-area-calculator/",
      "sources": [
        "Net area = Perimeter Length × Net Height, a straightforward material-quantity takeoff for perimeter debris/catch netting or safety netting systems used on scaffolds and building exteriors during construction. This is a quantity takeoff only — it does not address the specific mesh size, drop-test/impact-energy rating, or attachment requirements for netting used as actual fall-arrest protection under OSHA 29 CFR 1926.502(c), which requires certified test data specific to the netting product."
      ],
      "vectors": [
        {
          "name": "80m perimeter, 6m net height",
          "inputs": {
            "perimeterLength": 80,
            "netHeight": 6
          },
          "expected": 480,
          "toleranceDecimalPlaces": 0,
          "unit": "m²",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "120m perimeter, 8m net height",
          "inputs": {
            "perimeterLength": 120,
            "netHeight": 8
          },
          "expected": 960,
          "toleranceDecimalPlaces": 0,
          "unit": "m²",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "sand-cubic-yards-to-tons-calculator",
      "title": "Sand Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/sand-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 1.35 short tons per cubic yard",
        "Bulk density varies with moisture, compaction and grading — the supplier's weighbridge ticket governs"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 13.5,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.35,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 135,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.35,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "sand-fill-cubic-yards-to-tons-calculator",
      "title": "Fill Sand Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/sand-fill-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 1.3 short tons per cubic yard",
        "Density varies with moisture, grading and compaction — the supplier's ticket weight governs"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 13,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.3,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 130,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.3,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "sand-fill-tons-to-cubic-yards-calculator",
      "title": "Fill Sand Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/sand-fill-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 1.3 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 7.692307692307692,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.7692307692307692,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 76.92307692307692,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.7692307692307692,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "sand-tons-to-cubic-yards-calculator",
      "title": "Sand Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/sand-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 1.35 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 7.4074074074074066,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.7407407407407407,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 74.07407407407408,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.7407407407407407,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "sandbag-calculator",
      "title": "Sandbag Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/sandbag-calculator/",
      "sources": [
        "A standard filled sandbag covers approximately 1 linear ft of wall per stacked course; total bags = barrier length x number of courses"
      ],
      "vectors": [
        {
          "name": "15m barrier, 2 courses",
          "inputs": {
            "barrierLength": 15,
            "courses": 2
          },
          "expected": 99,
          "toleranceDecimalPlaces": 0,
          "unit": "sandbags",
          "confidence": "medium",
          "steps": [
            {
              "label": "Barrier length",
              "value": 49.212598425196845,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30m barrier, 3 courses",
          "inputs": {
            "barrierLength": 30,
            "courses": 3
          },
          "expected": 296,
          "toleranceDecimalPlaces": 0,
          "unit": "sandbags",
          "confidence": "medium",
          "steps": [
            {
              "label": "Barrier length",
              "value": 98.42519685039369,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "scaffold-baseplate-bearing-calculator",
      "title": "Scaffold Base Plate Bearing Pressure Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/scaffold-baseplate-bearing-calculator/",
      "sources": [
        "Applied bearing pressure = Leg Load × 9.81 ÷ Contact Area, the standard geotechnical bearing-pressure check (identical in principle to any shallow footing check) applied to a scaffold base plate or sole board. Per OSHA 29 CFR 1926.451(c)(2), scaffold footings must be 'level, sound, rigid, and capable of supporting the loaded scaffold without settling or displacement' — OSHA does not publish a universal allowable bearing value or leg load (per OSHA Standard Interpretation 2000-08-01, mudsill/footing sizing must be based on actual site soil conditions judged by a competent person)."
      ],
      "vectors": [
        {
          "name": "600kg leg load, bare 0.0225m² base plate, 150kPa allowable (fails)",
          "inputs": {
            "legLoad": 600,
            "contactArea": 0.0225,
            "allowableBearing": 150000
          },
          "expected": 261.6,
          "toleranceDecimalPlaces": -1,
          "unit": "kN/m²",
          "confidence": "low",
          "steps": [
            {
              "label": "Allowable bearing capacity (user-supplied)",
              "value": 150,
              "unit": "kN/m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "900kg leg load, 0.12m² with sole board, 150kPa allowable (passes)",
          "inputs": {
            "legLoad": 900,
            "contactArea": 0.12,
            "allowableBearing": 150000
          },
          "expected": 73.575,
          "toleranceDecimalPlaces": 2,
          "unit": "kN/m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Allowable bearing capacity (user-supplied)",
              "value": 150,
              "unit": "kN/m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "scaffold-face-area-calculator",
      "title": "Scaffold Face Area and Hire Quantity Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/scaffold-face-area-calculator/",
      "sources": [
        "Scaffolding is quoted and hired by the square metre of elevation face (length x height to the highest working platform), with a separate weekly hire charge for the duration it stands",
        "NASC TG20:21, the industry guidance for tube-and-fitting scaffold: a lift is commonly 2 m, and bay length reduces as duty class rises — 2.4 m at light duty down to about 1.8 m at heavy duty, because the boards and the standards carry more",
        "An independent tied scaffold carries two rows of standards, inner and outer; each row has one more standard than the number of bays"
      ],
      "vectors": [
        {
          "name": "12 m terrace elevation to 6 m eaves, general duty, 8 weeks",
          "inputs": {
            "elevationLength": 12,
            "workingHeight": 6,
            "liftHeight": 2,
            "bayLength": 2.1,
            "hireWeeks": 8
          },
          "expected": 72,
          "toleranceDecimalPlaces": 0,
          "unit": "m² of face",
          "confidence": "medium",
          "steps": [
            {
              "label": "Lifts",
              "value": 3,
              "unit": "levels"
            },
            {
              "label": "Bays",
              "value": 6,
              "unit": "bays"
            },
            {
              "label": "Standards (both rows)",
              "value": 14,
              "unit": "uprights"
            },
            {
              "label": "Boarded deck length, all lifts",
              "value": 37.800000000000004,
              "unit": "m"
            },
            {
              "label": "Weeks on hire",
              "value": 8,
              "unit": "weeks"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A part bay still costs a whole bay",
          "inputs": {
            "elevationLength": 12.5,
            "workingHeight": 6,
            "liftHeight": 2,
            "bayLength": 2.1,
            "hireWeeks": 8
          },
          "expected": 75,
          "toleranceDecimalPlaces": 0,
          "unit": "m² of face",
          "confidence": "medium",
          "steps": [
            {
              "label": "Lifts",
              "value": 3,
              "unit": "levels"
            },
            {
              "label": "Bays",
              "value": 6,
              "unit": "bays"
            },
            {
              "label": "Standards (both rows)",
              "value": 14,
              "unit": "uprights"
            },
            {
              "label": "Boarded deck length, all lifts",
              "value": 37.800000000000004,
              "unit": "m"
            },
            {
              "label": "Weeks on hire",
              "value": 8,
              "unit": "weeks"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A tall narrow elevation",
          "inputs": {
            "elevationLength": 4,
            "workingHeight": 15,
            "liftHeight": 2,
            "bayLength": 2.1,
            "hireWeeks": 20
          },
          "expected": 60,
          "toleranceDecimalPlaces": 0,
          "unit": "m² of face",
          "confidence": "medium",
          "steps": [
            {
              "label": "Lifts",
              "value": 8,
              "unit": "levels"
            },
            {
              "label": "Bays",
              "value": 2,
              "unit": "bays"
            },
            {
              "label": "Standards (both rows)",
              "value": 6,
              "unit": "uprights"
            },
            {
              "label": "Boarded deck length, all lifts",
              "value": 33.6,
              "unit": "m"
            },
            {
              "label": "Weeks on hire",
              "value": 20,
              "unit": "weeks"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Lift height does not change the area",
          "inputs": {
            "elevationLength": 12,
            "workingHeight": 6,
            "liftHeight": 1.5,
            "bayLength": 2.1,
            "hireWeeks": 8
          },
          "expected": 72,
          "toleranceDecimalPlaces": 0,
          "unit": "m² of face",
          "confidence": "medium",
          "steps": [
            {
              "label": "Lifts",
              "value": 4,
              "unit": "levels"
            },
            {
              "label": "Bays",
              "value": 6,
              "unit": "bays"
            },
            {
              "label": "Standards (both rows)",
              "value": 14,
              "unit": "uprights"
            },
            {
              "label": "Boarded deck length, all lifts",
              "value": 50.400000000000006,
              "unit": "m"
            },
            {
              "label": "Weeks on hire",
              "value": 8,
              "unit": "weeks"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "scaffold-plank-span-calculator",
      "title": "Scaffold Plank Span Calculator (OSHA Appendix A)",
      "url": "https://craftquantities.com/calculators/materials-quantities/scaffold-plank-span-calculator/",
      "sources": [
        "Appendix A to Subpart L of 29 CFR Part 1926 (non-mandatory): maximum permissible span for 2 × 10 inch (nominal) or 2 × 9 inch (rough) solid sawn wood planks — full thickness undressed lumber 10, 8 and 6 feet at 25, 50 and 75 lb/ft²; nominal thickness lumber 8 and 6 feet at 25 and 50 lb/ft², none listed at 75; and 4 feet for 1¼ × 9 inch or wider full-thickness planks at 50 lb/ft²",
        "Appendix A to Subpart L: solid sawn wood used as scaffold planks shall be selected following the grading rules of a recognized lumber grading association or independent inspection agency, and identified by its grade stamp; allowable spans otherwise follow the National Design Specification for Wood Construction",
        "29 CFR 1926.451(b): gaps between platform units no more than 1 inch (2.5 cm), (b)(1); each end at least 6 inches (15 cm) over the centerline of its support unless cleated or restrained, (b)(4); no more than 12 inches (30 cm) past its support for platforms 10 feet or less long and 18 inches (46 cm) for longer ones, unless designed or guarded for the cantilever, (b)(5); overlaps only over supports and at least 12 inches (30 cm) unless fastened, (b)(7); and (f)(16), platforms shall not deflect more than 1/60 of the span when loaded"
      ],
      "vectors": [
        {
          "name": "The defaults: a full-thickness plank at medium duty over 2.1 m",
          "inputs": {
            "plank": "full",
            "dutyFull": "medium",
            "dutyNominal": "medium",
            "span": 2.1,
            "platformWidth": 1.2,
            "plankWidth": 0.235
          },
          "expected": 86.122047,
          "toleranceDecimalPlaces": 3,
          "unit": "%",
          "confidence": "medium",
          "steps": [
            {
              "label": "Longest span Appendix A gives this plank at this duty",
              "value": 2.4384,
              "unit": "m"
            },
            {
              "label": "Your distance between supports",
              "value": 2.1,
              "unit": "m"
            },
            {
              "label": "Left under the table's span",
              "value": 0.33840000000000003,
              "unit": "m"
            },
            {
              "label": "Planks across the platform, no gap over 1 in (2.5 cm)",
              "value": 5,
              "unit": "planks"
            },
            {
              "label": "Shortest plank, 6 in (15 cm) past the centre of each support",
              "value": 2.4048,
              "unit": "m"
            },
            {
              "label": "Most a platform may deflect under load, 1/60 of the span",
              "value": 35,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Light duty gives the same plank 10 ft",
          "inputs": {
            "plank": "full",
            "dutyFull": "light",
            "dutyNominal": "medium",
            "span": 2.1,
            "platformWidth": 1.2,
            "plankWidth": 0.235
          },
          "expected": 68.897638,
          "toleranceDecimalPlaces": 3,
          "unit": "%",
          "confidence": "medium",
          "steps": [
            {
              "label": "Longest span Appendix A gives this plank at this duty",
              "value": 3.048,
              "unit": "m"
            },
            {
              "label": "Your distance between supports",
              "value": 2.1,
              "unit": "m"
            },
            {
              "label": "Left under the table's span",
              "value": 0.948,
              "unit": "m"
            },
            {
              "label": "Planks across the platform, no gap over 1 in (2.5 cm)",
              "value": 5,
              "unit": "planks"
            },
            {
              "label": "Shortest plank, 6 in (15 cm) past the centre of each support",
              "value": 2.4048,
              "unit": "m"
            },
            {
              "label": "Most a platform may deflect under load, 1/60 of the span",
              "value": 35,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Heavy duty: the same span is longer than the table's 6 ft",
          "inputs": {
            "plank": "full",
            "dutyFull": "heavy",
            "dutyNominal": "medium",
            "span": 2.1,
            "platformWidth": 1.2,
            "plankWidth": 0.235
          },
          "expected": 114.829396,
          "toleranceDecimalPlaces": 3,
          "unit": "%",
          "confidence": "medium",
          "steps": [
            {
              "label": "Longest span Appendix A gives this plank at this duty",
              "value": 1.8288000000000002,
              "unit": "m"
            },
            {
              "label": "Your distance between supports",
              "value": 2.1,
              "unit": "m"
            },
            {
              "label": "By which your span is longer than the table's",
              "value": 0.2711999999999999,
              "unit": "m"
            },
            {
              "label": "Planks across the platform, no gap over 1 in (2.5 cm)",
              "value": 5,
              "unit": "planks"
            },
            {
              "label": "Shortest plank, 6 in (15 cm) past the centre of each support",
              "value": 2.4048,
              "unit": "m"
            },
            {
              "label": "Most a platform may deflect under load, 1/60 of the span",
              "value": 35,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A dressed plank at light duty",
          "inputs": {
            "plank": "nominal",
            "dutyFull": "medium",
            "dutyNominal": "light",
            "span": 2.1,
            "platformWidth": 1.2,
            "plankWidth": 0.235
          },
          "expected": 86.122047,
          "toleranceDecimalPlaces": 3,
          "unit": "%",
          "confidence": "medium",
          "steps": [
            {
              "label": "Longest span Appendix A gives this plank at this duty",
              "value": 2.4384,
              "unit": "m"
            },
            {
              "label": "Your distance between supports",
              "value": 2.1,
              "unit": "m"
            },
            {
              "label": "Left under the table's span",
              "value": 0.33840000000000003,
              "unit": "m"
            },
            {
              "label": "Planks across the platform, no gap over 1 in (2.5 cm)",
              "value": 5,
              "unit": "planks"
            },
            {
              "label": "Shortest plank, 6 in (15 cm) past the centre of each support",
              "value": 2.4048,
              "unit": "m"
            },
            {
              "label": "Most a platform may deflect under load, 1/60 of the span",
              "value": 35,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A dressed plank at medium duty over 1.5 m",
          "inputs": {
            "plank": "nominal",
            "dutyFull": "medium",
            "dutyNominal": "medium",
            "span": 1.5,
            "platformWidth": 1.2,
            "plankWidth": 0.235
          },
          "expected": 82.020997,
          "toleranceDecimalPlaces": 3,
          "unit": "%",
          "confidence": "medium",
          "steps": [
            {
              "label": "Longest span Appendix A gives this plank at this duty",
              "value": 1.8288000000000002,
              "unit": "m"
            },
            {
              "label": "Your distance between supports",
              "value": 1.5,
              "unit": "m"
            },
            {
              "label": "Left under the table's span",
              "value": 0.3288000000000002,
              "unit": "m"
            },
            {
              "label": "Planks across the platform, no gap over 1 in (2.5 cm)",
              "value": 5,
              "unit": "planks"
            },
            {
              "label": "Shortest plank, 6 in (15 cm) past the centre of each support",
              "value": 1.8048,
              "unit": "m"
            },
            {
              "label": "Most a platform may deflect under load, 1/60 of the span",
              "value": 25,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The 1¼ in plank at its only listed duty",
          "inputs": {
            "plank": "inch-and-a-quarter",
            "dutyFull": "medium",
            "dutyNominal": "medium",
            "span": 1.2,
            "platformWidth": 1.2,
            "plankWidth": 0.235
          },
          "expected": 98.425197,
          "toleranceDecimalPlaces": 3,
          "unit": "%",
          "confidence": "medium",
          "steps": [
            {
              "label": "Longest span Appendix A gives this plank at this duty",
              "value": 1.2192,
              "unit": "m"
            },
            {
              "label": "Your distance between supports",
              "value": 1.2,
              "unit": "m"
            },
            {
              "label": "Left under the table's span",
              "value": 0.019200000000000106,
              "unit": "m"
            },
            {
              "label": "Planks across the platform, no gap over 1 in (2.5 cm)",
              "value": 5,
              "unit": "planks"
            },
            {
              "label": "Shortest plank, 6 in (15 cm) past the centre of each support",
              "value": 1.5048,
              "unit": "m"
            },
            {
              "label": "Most a platform may deflect under load, 1/60 of the span",
              "value": 20,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "scaffold-platform-load-calculator",
      "title": "Scaffold Platform Load and Duty Rating Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/scaffold-platform-load-calculator/",
      "sources": [
        "Appendix A to Subpart L of 29 CFR Part 1926 (non-mandatory): light-duty scaffolds are rated at 25, medium-duty at 50 and heavy-duty at 75 pounds per square foot (1.2, 2.4 and 3.6 kN/m²) applied uniformly over the entire span area",
        "BS EN 12811-1:2003, Temporary works equipment — Scaffolds: six service load classes with uniformly distributed loads of 0.75, 1.5, 2.0, 3.0, 4.5 and 6.0 kN/m² (about 16, 31, 42, 63, 94 and 125 psf), each with concentrated and partial-area loads as well",
        "29 CFR 1926.451(a)(1): each scaffold and scaffold component shall be capable of supporting, without failure, its own weight and at least 4 times the maximum intended load applied or transmitted to it"
      ],
      "vectors": [
        {
          "name": "The defaults: two people and a small stack on a 2.1 m bay",
          "inputs": {
            "bayLength": 2.1,
            "platformWidth": 1.2,
            "people": 2,
            "personMass": 100,
            "materialsMass": 200
          },
          "expected": 1.556611,
          "toleranceDecimalPlaces": 4,
          "unit": "kN/m² averaged over the bay",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total weight on the bay",
              "value": 400,
              "unit": "kg"
            },
            {
              "label": "Platform area of the bay",
              "value": 2.52,
              "unit": "m²"
            },
            {
              "label": "OSHA light-duty rating",
              "value": 1.197006474508396,
              "unit": "kN/m²"
            },
            {
              "label": "OSHA medium-duty rating",
              "value": 2.394012949016792,
              "unit": "kN/m²"
            },
            {
              "label": "OSHA heavy-duty rating",
              "value": 3.591019423525188,
              "unit": "kN/m²"
            },
            {
              "label": "BS EN 12811-1 class 3, the lowest at or above this load",
              "value": 2,
              "unit": "kN/m²"
            },
            {
              "label": "Four times the load on the bay, which each component must support",
              "value": 1600,
              "unit": "kg"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "One person on a narrow bay",
          "inputs": {
            "bayLength": 2.4,
            "platformWidth": 0.6,
            "people": 1,
            "personMass": 100,
            "materialsMass": 0
          },
          "expected": 0.681017,
          "toleranceDecimalPlaces": 4,
          "unit": "kN/m² averaged over the bay",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total weight on the bay",
              "value": 100,
              "unit": "kg"
            },
            {
              "label": "Platform area of the bay",
              "value": 1.44,
              "unit": "m²"
            },
            {
              "label": "OSHA light-duty rating",
              "value": 1.197006474508396,
              "unit": "kN/m²"
            },
            {
              "label": "OSHA medium-duty rating",
              "value": 2.394012949016792,
              "unit": "kN/m²"
            },
            {
              "label": "OSHA heavy-duty rating",
              "value": 3.591019423525188,
              "unit": "kN/m²"
            },
            {
              "label": "BS EN 12811-1 class 1, the lowest at or above this load",
              "value": 0.75,
              "unit": "kN/m²"
            },
            {
              "label": "Four times the load on the bay, which each component must support",
              "value": 400,
              "unit": "kg"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Materials stacked on a short bay, just past heavy duty",
          "inputs": {
            "bayLength": 1.8,
            "platformWidth": 1.2,
            "people": 2,
            "personMass": 100,
            "materialsMass": 600
          },
          "expected": 3.632093,
          "toleranceDecimalPlaces": 4,
          "unit": "kN/m² averaged over the bay",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total weight on the bay",
              "value": 800,
              "unit": "kg"
            },
            {
              "label": "Platform area of the bay",
              "value": 2.16,
              "unit": "m²"
            },
            {
              "label": "OSHA light-duty rating",
              "value": 1.197006474508396,
              "unit": "kN/m²"
            },
            {
              "label": "OSHA medium-duty rating",
              "value": 2.394012949016792,
              "unit": "kN/m²"
            },
            {
              "label": "OSHA heavy-duty rating",
              "value": 3.591019423525188,
              "unit": "kN/m²"
            },
            {
              "label": "BS EN 12811-1 class 5, the lowest at or above this load",
              "value": 4.5,
              "unit": "kN/m²"
            },
            {
              "label": "Four times the load on the bay, which each component must support",
              "value": 3200,
              "unit": "kg"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Materials only",
          "inputs": {
            "bayLength": 2,
            "platformWidth": 1,
            "people": 0,
            "personMass": 100,
            "materialsMass": 300
          },
          "expected": 1.470997,
          "toleranceDecimalPlaces": 4,
          "unit": "kN/m² averaged over the bay",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total weight on the bay",
              "value": 300,
              "unit": "kg"
            },
            {
              "label": "Platform area of the bay",
              "value": 2,
              "unit": "m²"
            },
            {
              "label": "OSHA light-duty rating",
              "value": 1.197006474508396,
              "unit": "kN/m²"
            },
            {
              "label": "OSHA medium-duty rating",
              "value": 2.394012949016792,
              "unit": "kN/m²"
            },
            {
              "label": "OSHA heavy-duty rating",
              "value": 3.591019423525188,
              "unit": "kN/m²"
            },
            {
              "label": "BS EN 12811-1 class 2, the lowest at or above this load",
              "value": 1.5,
              "unit": "kN/m²"
            },
            {
              "label": "Four times the load on the bay, which each component must support",
              "value": 1200,
              "unit": "kg"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "scaffold-tie-count-calculator",
      "title": "Scaffold Tie Count Calculator (OSHA 1926.451)",
      "url": "https://craftquantities.com/calculators/materials-quantities/scaffold-tie-count-calculator/",
      "sources": [
        "29 CFR 1926.451(c)(1): supported scaffolds with a height to base width (including outrigger supports, if used) ratio of more than four to one (4:1) shall be restrained from tipping by guying, tying, bracing, or equivalent means",
        "29 CFR 1926.451(c)(1)(ii): guys, ties and braces go according to the scaffold manufacturer's recommendations or at the closest horizontal member to the 4:1 height, repeated vertically at horizontal members every 20 feet (6.1 m) or less for scaffolds 3 feet (0.91 m) wide or less and every 26 feet (7.9 m) or less for wider ones; the top one no further than the 4:1 height from the top; at each end and at horizontal intervals not exceeding 30 feet (9.1 m), measured from one end"
      ],
      "vectors": [
        {
          "name": "The defaults: two levels at four positions",
          "inputs": {
            "scaffoldHeight": 15,
            "baseWidth": 1.5,
            "scaffoldLength": 24,
            "liftHeight": 2
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "ties",
          "confidence": "high",
          "steps": [
            {
              "label": "Height at which the rule starts (4 × the base width)",
              "value": 6,
              "unit": "m"
            },
            {
              "label": "Height to base width ratio",
              "value": 10,
              "unit": ":1"
            },
            {
              "label": "First tie level, at the horizontal member closest to that height",
              "value": 6,
              "unit": "m"
            },
            {
              "label": "Tie levels up the face",
              "value": 2,
              "unit": "levels"
            },
            {
              "label": "Vertical interval between tie levels",
              "value": 6,
              "unit": "m"
            },
            {
              "label": "Largest vertical interval the rule allows at this width",
              "value": 7.9248,
              "unit": "m"
            },
            {
              "label": "Highest tie level",
              "value": 12,
              "unit": "m"
            },
            {
              "label": "Scaffold standing above the highest tie",
              "value": 3,
              "unit": "m"
            },
            {
              "label": "Tie positions along the face",
              "value": 4,
              "unit": "positions"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "One level is enough when it is within four base widths of the top",
          "inputs": {
            "scaffoldHeight": 12,
            "baseWidth": 1.5,
            "scaffoldLength": 24,
            "liftHeight": 2
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "ties",
          "confidence": "high",
          "steps": [
            {
              "label": "Height at which the rule starts (4 × the base width)",
              "value": 6,
              "unit": "m"
            },
            {
              "label": "Height to base width ratio",
              "value": 8,
              "unit": ":1"
            },
            {
              "label": "First tie level, at the horizontal member closest to that height",
              "value": 6,
              "unit": "m"
            },
            {
              "label": "Tie levels up the face",
              "value": 1,
              "unit": "levels"
            },
            {
              "label": "Largest vertical interval the rule allows at this width",
              "value": 7.9248,
              "unit": "m"
            },
            {
              "label": "Highest tie level",
              "value": 6,
              "unit": "m"
            },
            {
              "label": "Scaffold standing above the highest tie",
              "value": 6,
              "unit": "m"
            },
            {
              "label": "Tie positions along the face",
              "value": 4,
              "unit": "positions"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Three levels on a taller scaffold",
          "inputs": {
            "scaffoldHeight": 20,
            "baseWidth": 1.5,
            "scaffoldLength": 24,
            "liftHeight": 2
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "ties",
          "confidence": "high",
          "steps": [
            {
              "label": "Height at which the rule starts (4 × the base width)",
              "value": 6,
              "unit": "m"
            },
            {
              "label": "Height to base width ratio",
              "value": 13.333333333333334,
              "unit": ":1"
            },
            {
              "label": "First tie level, at the horizontal member closest to that height",
              "value": 6,
              "unit": "m"
            },
            {
              "label": "Tie levels up the face",
              "value": 3,
              "unit": "levels"
            },
            {
              "label": "Vertical interval between tie levels",
              "value": 6,
              "unit": "m"
            },
            {
              "label": "Largest vertical interval the rule allows at this width",
              "value": 7.9248,
              "unit": "m"
            },
            {
              "label": "Highest tie level",
              "value": 18,
              "unit": "m"
            },
            {
              "label": "Scaffold standing above the highest tie",
              "value": 2,
              "unit": "m"
            },
            {
              "label": "Tie positions along the face",
              "value": 4,
              "unit": "positions"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A narrow scaffold takes the 20 ft interval",
          "inputs": {
            "scaffoldHeight": 10,
            "baseWidth": 0.9,
            "scaffoldLength": 9,
            "liftHeight": 2
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "ties",
          "confidence": "high",
          "steps": [
            {
              "label": "Height at which the rule starts (4 × the base width)",
              "value": 3.6,
              "unit": "m"
            },
            {
              "label": "Height to base width ratio",
              "value": 11.11111111111111,
              "unit": ":1"
            },
            {
              "label": "First tie level, at the horizontal member closest to that height",
              "value": 4,
              "unit": "m"
            },
            {
              "label": "Tie levels up the face",
              "value": 2,
              "unit": "levels"
            },
            {
              "label": "Vertical interval between tie levels",
              "value": 6,
              "unit": "m"
            },
            {
              "label": "Largest vertical interval the rule allows at this width",
              "value": 6.096,
              "unit": "m"
            },
            {
              "label": "Highest tie level",
              "value": 10,
              "unit": "m"
            },
            {
              "label": "Scaffold standing above the highest tie",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Tie positions along the face",
              "value": 2,
              "unit": "positions"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Within 4:1 the paragraph asks for no ties",
          "inputs": {
            "scaffoldHeight": 5,
            "baseWidth": 1.5,
            "scaffoldLength": 24,
            "liftHeight": 2
          },
          "expected": 0,
          "toleranceDecimalPlaces": 0,
          "unit": "ties",
          "confidence": "high",
          "steps": [
            {
              "label": "Height at which the rule starts (4 × the base width)",
              "value": 6,
              "unit": "m"
            },
            {
              "label": "Height to base width ratio",
              "value": 3.3333333333333335,
              "unit": ":1"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A tall, long scaffold",
          "inputs": {
            "scaffoldHeight": 30,
            "baseWidth": 1.2,
            "scaffoldLength": 40,
            "liftHeight": 2
          },
          "expected": 30,
          "toleranceDecimalPlaces": 0,
          "unit": "ties",
          "confidence": "high",
          "steps": [
            {
              "label": "Height at which the rule starts (4 × the base width)",
              "value": 4.8,
              "unit": "m"
            },
            {
              "label": "Height to base width ratio",
              "value": 25,
              "unit": ":1"
            },
            {
              "label": "First tie level, at the horizontal member closest to that height",
              "value": 4,
              "unit": "m"
            },
            {
              "label": "Tie levels up the face",
              "value": 5,
              "unit": "levels"
            },
            {
              "label": "Vertical interval between tie levels",
              "value": 6,
              "unit": "m"
            },
            {
              "label": "Largest vertical interval the rule allows at this width",
              "value": 7.9248,
              "unit": "m"
            },
            {
              "label": "Highest tie level",
              "value": 28,
              "unit": "m"
            },
            {
              "label": "Scaffold standing above the highest tie",
              "value": 2,
              "unit": "m"
            },
            {
              "label": "Tie positions along the face",
              "value": 6,
              "unit": "positions"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Two members equally close take the lower",
          "inputs": {
            "scaffoldHeight": 10,
            "baseWidth": 0.9,
            "scaffoldLength": 12,
            "liftHeight": 2.4
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "ties",
          "confidence": "high",
          "steps": [
            {
              "label": "Height at which the rule starts (4 × the base width)",
              "value": 3.6,
              "unit": "m"
            },
            {
              "label": "Height to base width ratio",
              "value": 11.11111111111111,
              "unit": ":1"
            },
            {
              "label": "First tie level, at the horizontal member closest to that height",
              "value": 2.4,
              "unit": "m"
            },
            {
              "label": "Tie levels up the face",
              "value": 2,
              "unit": "levels"
            },
            {
              "label": "Vertical interval between tie levels",
              "value": 4.8,
              "unit": "m"
            },
            {
              "label": "Largest vertical interval the rule allows at this width",
              "value": 6.096,
              "unit": "m"
            },
            {
              "label": "Highest tie level",
              "value": 7.199999999999999,
              "unit": "m"
            },
            {
              "label": "Scaffold standing above the highest tie",
              "value": 2.8000000000000007,
              "unit": "m"
            },
            {
              "label": "Tie positions along the face",
              "value": 3,
              "unit": "positions"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "scc-formwork-pressure-calculator",
      "title": "SCC Formwork Lateral Pressure Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/scc-formwork-pressure-calculator/",
      "sources": [
        "ACI PRC-237.2 / ACI 347R guidance: because SCC's high flowability behaves like a true liquid during placement, formwork should be designed for the full hydrostatic pressure of the fresh concrete (unit weight x full pour height) unless a lower value is justified by site-specific measurement or documented experience — unlike conventional slump concrete, which allows reduced pressure formulas based on placement rate and temperature."
      ],
      "vectors": [
        {
          "name": "3m pour, 23.6 kN/m³",
          "inputs": {
            "pourHeight": 3,
            "concreteUnitWeight": 23.6
          },
          "expected": 70.8,
          "toleranceDecimalPlaces": 1,
          "unit": "kN/m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in psf",
              "value": 1478.6580000000004,
              "unit": "psf"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2.4m pour, 24.5 kN/m³",
          "inputs": {
            "pourHeight": 2.4,
            "concreteUnitWeight": 24.5
          },
          "expected": 58.8,
          "toleranceDecimalPlaces": 1,
          "unit": "kN/m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in psf",
              "value": 1228.038,
              "unit": "psf"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "scissor-truss-chord-geometry-calculator",
      "title": "Scissor Truss Chord Geometry Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/scissor-truss-chord-geometry-calculator/",
      "sources": [
        "Standard rafter-length trigonometry applied independently to each chord's own pitch: chord length = half-span × √(1+(pitch/12)²); vaulted ceiling height gain = the bottom chord's own rise, half-span × (bottom pitch/12); truss depth at the peak = top chord rise minus bottom chord rise"
      ],
      "vectors": [
        {
          "name": "8m span, 8/12 top, 4/12 bottom",
          "inputs": {
            "span": 8,
            "topChordPitch": 8,
            "bottomChordPitch": 4
          },
          "expected": 1.333,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Top chord length",
              "value": 4.8074017006186525,
              "unit": "m"
            },
            {
              "label": "Bottom chord length",
              "value": 4.216370213557839,
              "unit": "m"
            },
            {
              "label": "Truss depth between chords at the peak",
              "value": 1.3333333333333333,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "10m span, 10/12 top, 3/12 bottom",
          "inputs": {
            "span": 10,
            "topChordPitch": 10,
            "bottomChordPitch": 3
          },
          "expected": 1.25,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Top chord length",
              "value": 6.508541396588879,
              "unit": "m"
            },
            {
              "label": "Bottom chord length",
              "value": 5.153882032022076,
              "unit": "m"
            },
            {
              "label": "Truss depth between chords at the peak",
              "value": 2.916666666666667,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "scm-replacement-calculator",
      "title": "Fly Ash / Silica Fume SCM Replacement Calculator",
      "url": "https://craftquantities.com/calculators/sustainability-compliance/scm-replacement-calculator/",
      "sources": [
        "Supplementary cementitious materials commonly replace 15-30% of portland cement by mass for fly ash (ACI 232.2R) and 5-10% for silica fume (ACI 234R), reducing embodied carbon and, at these replacement levels, generally improving long-term strength and durability"
      ],
      "vectors": [
        {
          "name": "350 kg/m³ total, 20% fly ash",
          "inputs": {
            "totalCementitiousMass": 350,
            "scmType": "fly-ash",
            "replacementPercent": 20
          },
          "expected": 280,
          "toleranceDecimalPlaces": 0,
          "unit": "kg per m³",
          "confidence": "high",
          "steps": [
            {
              "label": "SCM mass required",
              "value": 70,
              "unit": "kg per m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "400 kg/m³ total, 8% silica fume",
          "inputs": {
            "totalCementitiousMass": 400,
            "scmType": "silica-fume",
            "replacementPercent": 8
          },
          "expected": 368,
          "toleranceDecimalPlaces": 0,
          "unit": "kg per m³",
          "confidence": "high",
          "steps": [
            {
              "label": "SCM mass required",
              "value": 32,
              "unit": "kg per m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "scrap-metal-value-calculator",
      "title": "Scrap Metal Recycling Value Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/scrap-metal-value-calculator/",
      "sources": [
        "Estimated value = Scrap Weight × Price per Unit Weight — scrap metal prices are market-variable and change daily/regionally, and this calculator applies whatever current price you supply from your local scrap yard or metal market index."
      ],
      "vectors": [
        {
          "name": "500 kg at $0.15/kg",
          "inputs": {
            "scrapWeight": 500,
            "pricePerUnitWeight": 0.15
          },
          "expected": 75,
          "toleranceDecimalPlaces": 0,
          "unit": "$",
          "confidence": "medium",
          "steps": [
            {
              "label": "Scrap weight",
              "value": 500,
              "unit": "kg"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1200 kg at $2.50/kg",
          "inputs": {
            "scrapWeight": 1200,
            "pricePerUnitWeight": 2.5
          },
          "expected": 3000,
          "toleranceDecimalPlaces": 0,
          "unit": "$",
          "confidence": "medium",
          "steps": [
            {
              "label": "Scrap weight",
              "value": 1200,
              "unit": "kg"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "screed-cubic-yards-to-tons-calculator",
      "title": "Floor Screed Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/screed-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 1.9 short tons per cubic yard",
        "Density varies with moisture, grading and composition — the supplier's ticket weight governs"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 19,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.9,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 190,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.9,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "screed-thickness-calculator",
      "title": "Floor Screed Thickness Calculator — Bonded, Unbonded and Floating",
      "url": "https://craftquantities.com/calculators/materials-quantities/screed-thickness-calculator/",
      "sources": [
        "BS 8204-1 gives a minimum thickness of 25 mm for a bonded levelling screed and 50 mm for an unbonded one, and splits floating screeds by duty category: 65 mm for light duty and domestic work (Category C), and 75 mm for medium and heavy duty (Categories A and B)",
        "The standard distinguishes that MINIMUM from a SPECIFIED thickness for the drawing: a bonded screed is normally specified at 40 mm with a tolerance of ±15 mm, and an unbonded screed at a specified minimum of 70 mm. The ±15 mm on a 40 mm bonded screed is exactly the 25 mm minimum plus an allowance for the base not being flat, which is why this page takes the greater of the standard's nominal and the minimum plus your own measured deviation",
        "BS 8204-1 flags a high risk of curling in unbonded and floating levelling screeds, and recommends they be either reinforced across the joints or made 100 mm or more thick",
        "For heavy commercial traffic, or point loads above about 3.0 kN/m², published guidance on the standard adds a further 10 mm to 15 mm to a floating screed's depth over the Category A and B figure",
        "Drying is the trade rule of thumb — roughly a day per millimetre for the first 50 mm and slower beyond it, in still, heated conditions — rather than a standard, and only a hygrometer reading on the floor settles it",
        "Mineral Products Association, MPA Mortar Data Sheet 22, Screeds (Issue 3, October 2023), reporting BS 8204-1: nominal proportions by weight of cement to fine aggregate of 1:4, with a lower limit of 1:3 and an upper limit of 1:4.5 — the 1:4 by weight this page works the cement and sand at; a specification that names a ratio governs over it",
        "Sika, SikaScreed-40 Binder product data sheet (Version 04.01, February 2026): 400 kg of binder per m³ of fresh mortar at 1:4 with the sand by weight (4 bags of 20 kg to about 320 kg of aggregate in a 200 litre mixer), 2,000 kg of material as batched in each cubic metre — the figure this page and the floor screed page both turn a volume of screed into cement and sand with",
        "QUIKRETE Portland Cement (No. 1124) data sheet (revised August 2022): sold in 94 lb (42.6 kg) bags, among other sizes — the US sack this page counts"
      ],
      "vectors": [
        {
          "name": "60 m² floating Category C over a base 10 mm out",
          "inputs": {
            "floorArea": 60,
            "screedType": "floating-c",
            "baseDeviation": 0.01,
            "wastePercent": 10
          },
          "expected": 2.95,
          "toleranceDecimalPlaces": 1,
          "unit": "in",
          "confidence": "medium",
          "steps": [
            {
              "label": "Minimum at any point",
              "value": 2.5590551181102366,
              "unit": "in"
            },
            {
              "label": "Minimum plus this base's deviation",
              "value": 2.952755905511811,
              "unit": "in"
            },
            {
              "label": "Screed volume after waste",
              "value": 174.80760027136853,
              "unit": "ft³"
            },
            {
              "label": "Cement by weight",
              "value": 1980,
              "unit": "kg"
            },
            {
              "label": "94 lb cement sacks",
              "value": 47,
              "unit": "sacks"
            },
            {
              "label": "Sharp sand by weight",
              "value": 7.92,
              "unit": "t"
            },
            {
              "label": "Rough drying time before a covering",
              "value": 100,
              "unit": "days"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "bonded on a flat slab takes the standard's 40 mm nominal, not its 25 mm minimum",
          "inputs": {
            "floorArea": 20,
            "screedType": "bonded",
            "baseDeviation": 0,
            "wastePercent": 10
          },
          "expected": 1.57,
          "toleranceDecimalPlaces": 1,
          "unit": "in",
          "confidence": "high",
          "steps": [
            {
              "label": "Minimum at any point",
              "value": 0.9842519685039371,
              "unit": "in"
            },
            {
              "label": "Nominal on the drawing",
              "value": 1.5748031496062993,
              "unit": "in"
            },
            {
              "label": "Minimum plus this base's deviation",
              "value": 0.9842519685039371,
              "unit": "in"
            },
            {
              "label": "Screed volume after waste",
              "value": 31.076906714909963,
              "unit": "ft³"
            },
            {
              "label": "Cement by weight",
              "value": 352.00000000000006,
              "unit": "kg"
            },
            {
              "label": "94 lb cement sacks",
              "value": 9,
              "unit": "sacks"
            },
            {
              "label": "Sharp sand by weight",
              "value": 1.4080000000000001,
              "unit": "t"
            },
            {
              "label": "Rough drying time before a covering",
              "value": 40,
              "unit": "days"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "heavy duty floating over a base 25 mm out",
          "inputs": {
            "floorArea": 400,
            "screedType": "floating-ab",
            "baseDeviation": 0.025,
            "wastePercent": 10
          },
          "expected": 3.94,
          "toleranceDecimalPlaces": 1,
          "unit": "in",
          "confidence": "medium",
          "steps": [
            {
              "label": "Minimum at any point",
              "value": 2.952755905511811,
              "unit": "in"
            },
            {
              "label": "Minimum plus this base's deviation",
              "value": 3.9370078740157486,
              "unit": "in"
            },
            {
              "label": "Screed volume after waste",
              "value": 1553.845335745498,
              "unit": "ft³"
            },
            {
              "label": "Cement by weight",
              "value": 17600,
              "unit": "kg"
            },
            {
              "label": "94 lb cement sacks",
              "value": 413,
              "unit": "sacks"
            },
            {
              "label": "Sharp sand by weight",
              "value": 70.4,
              "unit": "t"
            },
            {
              "label": "Rough drying time before a covering",
              "value": 150,
              "unit": "days"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "unbonded on a good base takes the 70 mm nominal over the 50 mm minimum",
          "inputs": {
            "floorArea": 100,
            "screedType": "unbonded",
            "baseDeviation": 0.005,
            "wastePercent": 10
          },
          "expected": 2.76,
          "toleranceDecimalPlaces": 1,
          "unit": "in",
          "confidence": "medium",
          "steps": [
            {
              "label": "Minimum at any point",
              "value": 1.9685039370078743,
              "unit": "in"
            },
            {
              "label": "Nominal on the drawing",
              "value": 2.755905511811024,
              "unit": "in"
            },
            {
              "label": "Minimum plus this base's deviation",
              "value": 2.1653543307086616,
              "unit": "in"
            },
            {
              "label": "Screed volume after waste",
              "value": 271.92293375546217,
              "unit": "ft³"
            },
            {
              "label": "Cement by weight",
              "value": 3080.0000000000005,
              "unit": "kg"
            },
            {
              "label": "94 lb cement sacks",
              "value": 73,
              "unit": "sacks"
            },
            {
              "label": "Sharp sand by weight",
              "value": 12.320000000000002,
              "unit": "t"
            },
            {
              "label": "Rough drying time before a covering",
              "value": 90,
              "unit": "days"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "screed-tons-to-cubic-yards-calculator",
      "title": "Floor Screed Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/screed-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 1.9 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 5.263157894736842,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.5263157894736842,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 52.63157894736842,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.5263157894736842,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "seal-off-fitting-grout-calculator",
      "title": "Explosion-Proof Seal-Off Compound Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/seal-off-fitting-grout-calculator/",
      "sources": [
        "Grout volume = π × (bore radius)² × fitting length, the standard cylindrical cavity volume calculation for the sealing chamber of an explosion-proof seal-off fitting (per NEC 501.15 hazardous location sealing requirements)"
      ],
      "vectors": [
        {
          "name": "25mm bore, 50mm chamber",
          "inputs": {
            "boreDiameter": 0.025,
            "fittingLength": 0.05
          },
          "expected": 0.0245,
          "toleranceDecimalPlaces": 3,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "32mm bore, 60mm chamber",
          "inputs": {
            "boreDiameter": 0.032,
            "fittingLength": 0.06
          },
          "expected": 0.0483,
          "toleranceDecimalPlaces": 3,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "seat-wall-concrete-volume-calculator",
      "title": "Built-In Bench/Planter Seat Wall Concrete Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/seat-wall-concrete-volume-calculator/",
      "sources": [
        "Volume = Wall Length × Wall Height × Wall Thickness — a straightforward rectangular concrete volume takeoff applied to a built-in seat wall or planter wall feature."
      ],
      "vectors": [
        {
          "name": "6m long, 0.45m high, 0.2m thick",
          "inputs": {
            "wallLength": 6,
            "wallHeight": 0.45,
            "wallThickness": 0.2
          },
          "expected": 0.54,
          "toleranceDecimalPlaces": 2,
          "unit": "m³",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "10m long, 0.5m high, 0.25m thick",
          "inputs": {
            "wallLength": 10,
            "wallHeight": 0.5,
            "wallThickness": 0.25
          },
          "expected": 1.25,
          "toleranceDecimalPlaces": 1,
          "unit": "m³",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "secant-pile-overlap-calculator",
      "title": "Secant / Contiguous Pile Wall Overlap Calculator",
      "url": "https://craftquantities.com/calculators/heavy-civil/secant-pile-overlap-calculator/",
      "sources": [
        "Secant pile geometry: adjacent piles overlap when center-to-center spacing is less than the pile diameter; overlap distance = diameter minus spacing (a negative result indicates a gap, i.e. a contiguous rather than secant wall)"
      ],
      "vectors": [
        {
          "name": "0.6m diameter, 0.45m spacing (secant)",
          "inputs": {
            "pileDiameter": 0.6,
            "centerToCenterSpacing": 0.45
          },
          "expected": 0.15,
          "toleranceDecimalPlaces": 2,
          "unit": "m overlap",
          "confidence": "high",
          "steps": [
            {
              "label": "Spacing-to-diameter ratio",
              "value": 0.75
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "0.6m diameter, 0.7m spacing (contiguous, gap)",
          "inputs": {
            "pileDiameter": 0.6,
            "centerToCenterSpacing": 0.7
          },
          "expected": -0.1,
          "toleranceDecimalPlaces": 3,
          "unit": "m gap",
          "confidence": "low",
          "steps": [
            {
              "label": "Spacing-to-diameter ratio",
              "value": 1.1666666666666667
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "sediment-basin-sizing-calculator",
      "title": "Sediment Basin Sizing Calculator",
      "url": "https://craftquantities.com/calculators/heavy-civil/sediment-basin-sizing-calculator/",
      "sources": [
        "3,600 ft³ of storage per acre of disturbed drainage area — the sizing rule used in the EPA construction general permit and in most state SWPPP manuals",
        "Equivalent metric rate: approximately 252 m³ per hectare of disturbed area"
      ],
      "vectors": [
        {
          "name": "2 hectares at the standard rate",
          "inputs": {
            "disturbedArea": 20000,
            "storageRate": 252,
            "sedimentStoragePercent": 20
          },
          "expected": 604.8,
          "toleranceDecimalPlaces": 2,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Drainage area",
              "value": 2,
              "unit": "ha"
            },
            {
              "label": "Drainage area in acres",
              "value": 4.942107629343306,
              "unit": "acres"
            },
            {
              "label": "Wet storage",
              "value": 504,
              "unit": "m³"
            },
            {
              "label": "Sediment storage",
              "value": 100.80000000000001,
              "unit": "m³"
            },
            {
              "label": "Total in cubic yards",
              "value": 791.0485345613444,
              "unit": "yd³"
            },
            {
              "label": "Clean out when sediment reaches",
              "value": 50.400000000000006,
              "unit": "m³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Double the area doubles the basin",
          "inputs": {
            "disturbedArea": 40000,
            "storageRate": 252,
            "sedimentStoragePercent": 20
          },
          "expected": 1209.6,
          "toleranceDecimalPlaces": 2,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Drainage area",
              "value": 4,
              "unit": "ha"
            },
            {
              "label": "Drainage area in acres",
              "value": 9.884215258686613,
              "unit": "acres"
            },
            {
              "label": "Wet storage",
              "value": 1008,
              "unit": "m³"
            },
            {
              "label": "Sediment storage",
              "value": 201.60000000000002,
              "unit": "m³"
            },
            {
              "label": "Total in cubic yards",
              "value": 1582.0970691226887,
              "unit": "yd³"
            },
            {
              "label": "Clean out when sediment reaches",
              "value": 100.80000000000001,
              "unit": "m³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Without the sediment allowance",
          "inputs": {
            "disturbedArea": 20000,
            "storageRate": 252,
            "sedimentStoragePercent": 0
          },
          "expected": 504,
          "toleranceDecimalPlaces": 2,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Drainage area",
              "value": 2,
              "unit": "ha"
            },
            {
              "label": "Drainage area in acres",
              "value": 4.942107629343306,
              "unit": "acres"
            },
            {
              "label": "Wet storage",
              "value": 504,
              "unit": "m³"
            },
            {
              "label": "Sediment storage",
              "value": 0,
              "unit": "m³"
            },
            {
              "label": "Total in cubic yards",
              "value": 659.2071121344536,
              "unit": "yd³"
            },
            {
              "label": "Clean out when sediment reaches",
              "value": 0,
              "unit": "m³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Zero disturbed area needs no basin",
          "inputs": {
            "disturbedArea": 0,
            "storageRate": 252,
            "sedimentStoragePercent": 20
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Drainage area",
              "value": 0,
              "unit": "ha"
            },
            {
              "label": "Drainage area in acres",
              "value": 0,
              "unit": "acres"
            },
            {
              "label": "Wet storage",
              "value": 0,
              "unit": "m³"
            },
            {
              "label": "Sediment storage",
              "value": 0,
              "unit": "m³"
            },
            {
              "label": "Total in cubic yards",
              "value": 0,
              "unit": "yd³"
            },
            {
              "label": "Clean out when sediment reaches",
              "value": 0,
              "unit": "m³"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "seismic-reinforcement-ratio-calculator",
      "title": "Seismic Masonry Horizontal Reinforcement Ratio Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/seismic-reinforcement-ratio-calculator/",
      "sources": [
        "Horizontal reinforcement ratio = bar cross-sectional area / (wall thickness x vertical spacing between horizontal bars); a commonly-cited TMS 402-style minimum ratio for masonry requiring seismic reinforcement is 0.0007"
      ],
      "vectors": [
        {
          "name": "#4 bar, 200mm wall, 1200mm spacing (below min)",
          "inputs": {
            "rebarArea": 0.000129,
            "wallThickness": 0.2,
            "verticalSpacing": 1.2
          },
          "expected": 0.0005375,
          "toleranceDecimalPlaces": 7,
          "unit": "(ratio)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Common minimum threshold",
              "value": 0.06999999999999999,
              "unit": "%"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "#4 bar, 200mm wall, 800mm spacing (above min)",
          "inputs": {
            "rebarArea": 0.000129,
            "wallThickness": 0.2,
            "verticalSpacing": 0.8
          },
          "expected": 0.0008063,
          "toleranceDecimalPlaces": 6,
          "unit": "(ratio)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Common minimum threshold",
              "value": 0.06999999999999999,
              "unit": "%"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "self-leveling-underlayment-calculator",
      "title": "Self-Leveling Underlayment (SLU) Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/self-leveling-underlayment-calculator/",
      "sources": [
        "SLU volume = floor area × average pour depth, the standard method for a self-leveling compound poured at a roughly uniform average thickness"
      ],
      "vectors": [
        {
          "name": "25m² floor, 6mm average depth",
          "inputs": {
            "floorArea": 25,
            "averageDepth": 0.006
          },
          "expected": 150,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "35m² floor, 8mm average depth",
          "inputs": {
            "floorArea": 35,
            "averageDepth": 0.008
          },
          "expected": 280,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "separation-geotextile-roll-calculator",
      "title": "Driveway Separation Geotextile Roll Calculator",
      "url": "https://craftquantities.com/calculators/auto-utility/separation-geotextile-roll-calculator/",
      "sources": [
        "AASHTO M 288, Geosynthetic Specification for Highway Applications — the specification that classifies a separation geotextile and sets its overlap and seaming requirements against subgrade strength",
        "Roll count = ceil(total run length ÷ roll length), where the run is the number of parallel passes across the drive times the drive length plus its end laps, the first pass covers the full roll width and each pass after it adds the width less one side lap — only the joints consume a lap — and a pass covers the roll width less one side lap."
      ],
      "vectors": [
        {
          "name": "120 m rural drive, 3.8 m rolls, 0.45 m lap",
          "inputs": {
            "driveLength": 120,
            "driveWidth": 4.2,
            "extraArea": 60,
            "rollWidth": 3.8,
            "rollLength": 100,
            "lapWidth": 0.45
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Fabric area, laps included",
              "value": 983.4797014925373,
              "unit": "m²"
            },
            {
              "label": "Effective coverage width per pass",
              "value": 3.3499999999999996,
              "unit": "m"
            },
            {
              "label": "Parallel passes across the drive",
              "value": 2,
              "unit": "passes"
            },
            {
              "label": "Fabric run to be laid",
              "value": 258.81044776119404,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "60 m suburban drive, 4.5 m rolls, 0.6 m lap",
          "inputs": {
            "driveLength": 60,
            "driveWidth": 3.6,
            "extraArea": 30,
            "rollWidth": 4.5,
            "rollLength": 100,
            "lapWidth": 0.6
          },
          "expected": 1,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Fabric area, laps included",
              "value": 304.61538461538464,
              "unit": "m²"
            },
            {
              "label": "Effective coverage width per pass",
              "value": 3.9,
              "unit": "m"
            },
            {
              "label": "Parallel passes across the drive",
              "value": 1,
              "unit": "passes"
            },
            {
              "label": "Fabric run to be laid",
              "value": 67.6923076923077,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "200 m drive wider than one roll, with a turnaround",
          "inputs": {
            "driveLength": 200,
            "driveWidth": 6,
            "extraArea": 120,
            "rollWidth": 4.5,
            "rollLength": 100,
            "lapWidth": 0.45
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Fabric area, laps included",
              "value": 1941.4333333333334,
              "unit": "m²"
            },
            {
              "label": "Effective coverage width per pass",
              "value": 4.05,
              "unit": "m"
            },
            {
              "label": "Parallel passes across the drive",
              "value": 2,
              "unit": "passes"
            },
            {
              "label": "Fabric run to be laid",
              "value": 431.42962962962963,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "septic-drain-field-calculator",
      "title": "Septic Drain Field Sizing Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/septic-drain-field-calculator/",
      "sources": [
        "Required absorption area = daily wastewater flow ÷ soil application rate (the rate tables are published in gal/day/sq ft; metric inputs convert at the boundary); application rate is commonly categorized by percolation test results (faster-draining soil allows a higher application rate)"
      ],
      "vectors": [
        {
          "name": "1,514 L/day (400 gal), moderate soil",
          "inputs": {
            "dailyFlow": 1514.1647136,
            "percRateCategory": "moderate"
          },
          "expected": 666.67,
          "toleranceDecimalPlaces": 1,
          "unit": "sq ft (estimated absorption area)",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2,271 L/day (600 gal), slow soil",
          "inputs": {
            "dailyFlow": 2271.2470704,
            "percRateCategory": "slow"
          },
          "expected": 1333.33,
          "toleranceDecimalPlaces": 1,
          "unit": "sq ft (estimated absorption area)",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "septic-tank-sizing-calculator",
      "title": "Septic Tank Sizing Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/septic-tank-sizing-calculator/",
      "sources": [
        "Commonly used state/local health-code sizing guideline: 1-3 bedrooms = 1,000 gal minimum, 4 bedrooms = 1,200 gal, 5-6 bedrooms = 1,500 gal, 7-8 bedrooms = 2,000 gal"
      ],
      "vectors": [
        {
          "name": "1-3 bedrooms",
          "inputs": {
            "bedroomCount": "1-3"
          },
          "expected": 1000,
          "toleranceDecimalPlaces": 0,
          "unit": "gallons (minimum)",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "5-6 bedrooms",
          "inputs": {
            "bedroomCount": "5-6"
          },
          "expected": 1500,
          "toleranceDecimalPlaces": 0,
          "unit": "gallons (minimum)",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "service-panel-sizing-calculator",
      "title": "Home Electrical Service Panel Amperage Sizing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/service-panel-sizing-calculator/",
      "sources": [
        "Simplified NEC Article 220 standard method: general lighting load = floor area × 3 VA/ft² (NEC 220.12), added to the small-appliance circuits (1500 VA each) and the laundry circuit (1500 VA). The NEC Table 220.42 demand factor (100% of the first 3000 VA, 35% of the remainder) applies to THAT subtotal only — 220.42 governs general lighting and receptacle load. Fixed appliances are then added at 100% of nameplate, because they are not part of the 220.42 pool. Required amperage = total demand VA ÷ voltage"
      ],
      "vectors": [
        {
          "name": "139.4m² (1500ft²), 2 small-appliance, 1 laundry, 4000VA fixed",
          "inputs": {
            "floorArea": 139.4,
            "smallApplianceCircuits": 2,
            "laundryCircuits": 1,
            "fixedApplianceVA": 4000,
            "serviceVoltage": 240
          },
          "expected": 37.92,
          "toleranceDecimalPlaces": 2,
          "unit": "A",
          "confidence": "low",
          "steps": [
            {
              "label": "Total connected load (before demand factor)",
              "value": 13001.467336268006,
              "unit": "VA"
            },
            {
              "label": "General lighting and receptacles, after the 220.42 factor",
              "value": 5100.5135676938025,
              "unit": "VA"
            },
            {
              "label": "Fixed appliances, at 100%",
              "value": 4000,
              "unit": "VA"
            },
            {
              "label": "Demand load",
              "value": 9100.513567693803,
              "unit": "VA"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "204.4m² (2200ft²), 2 small-appliance, 1 laundry, 6000VA fixed",
          "inputs": {
            "floorArea": 204.4,
            "smallApplianceCircuits": 2,
            "laundryCircuits": 1,
            "fixedApplianceVA": 6000,
            "serviceVoltage": 240
          },
          "expected": 49.31,
          "toleranceDecimalPlaces": 2,
          "unit": "A",
          "confidence": "low",
          "steps": [
            {
              "label": "Total connected load (before demand factor)",
              "value": 17100.4298675264,
              "unit": "VA"
            },
            {
              "label": "General lighting and receptacles, after the 220.42 factor",
              "value": 5835.15045363424,
              "unit": "VA"
            },
            {
              "label": "Fixed appliances, at 100%",
              "value": 6000,
              "unit": "VA"
            },
            {
              "label": "Demand load",
              "value": 11835.15045363424,
              "unit": "VA"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "shaftwall-j-track-calculator",
      "title": "Shaftwall J-Track Length Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/shaftwall-j-track-calculator/",
      "sources": [
        "J-track total length = wall run length × (1 + waste allowance), the track that receives the shaftwall studs and liner panels at the floor and ceiling"
      ],
      "vectors": [
        {
          "name": "10m wall, 5% waste, floor and head",
          "inputs": {
            "wallLength": 10,
            "wastePercent": 5
          },
          "expected": 21,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15m wall, 8% waste, floor and head",
          "inputs": {
            "wallLength": 15,
            "wastePercent": 8
          },
          "expected": 32.4,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "shaftwall-limiting-height-calculator",
      "title": "Shaftwall C-H Stud Limiting Height Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/shaftwall-limiting-height-calculator/",
      "sources": [
        "ASTM C645 (non-structural steel framing members) and ASTM C754 (installation of steel framing to receive gypsum panel products), which is where the practice of selecting studs from a published limiting-height table originates",
        "AISI S100 takes the modulus of elasticity of cold-formed sheet steel as 29,500,000 psi (203,400 MPa); the effective moment of inertia for a given C-H stud depth and gauge comes from the system manufacturer's own limiting height table",
        "Deflection-governed limiting height from elastic beam theory for a uniformly loaded simple span: setting 5wL⁴/(384EI) equal to L divided by the deflection ratio gives L = cube root of 384EI/(5wR)"
      ],
      "vectors": [
        {
          "name": "24 in spacing at 250 Pa, I_eff 0.45, L/240",
          "inputs": {
            "designPressure": 250,
            "studSpacing": 0.6096,
            "momentOfInertia": 0.45,
            "deflectionRatio": "240",
            "proposedHeight": 4
          },
          "expected": 5.7709,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Line load carried by one stud",
              "value": 152.4,
              "unit": "N/m"
            },
            {
              "label": "Deflection at the proposed height",
              "value": 5.550092865727084,
              "unit": "mm"
            },
            {
              "label": "Allowable deflection at the proposed height",
              "value": 16.666666666666668,
              "unit": "mm"
            },
            {
              "label": "Deflection allowance used at that height",
              "value": 33.300557194362504,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "16 in spacing at 359 Pa, I_eff 0.9, L/240",
          "inputs": {
            "designPressure": 359,
            "studSpacing": 0.4064,
            "momentOfInertia": 0.9,
            "deflectionRatio": "240",
            "proposedHeight": 6
          },
          "expected": 7.3773,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Line load carried by one stud",
              "value": 145.89759999999998,
              "unit": "N/m"
            },
            {
              "label": "Deflection at the proposed height",
              "value": 13.449262536873155,
              "unit": "mm"
            },
            {
              "label": "Allowable deflection at the proposed height",
              "value": 25,
              "unit": "mm"
            },
            {
              "label": "Deflection allowance used at that height",
              "value": 53.79705014749262,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Same stud held to L/360 instead of L/240",
          "inputs": {
            "designPressure": 250,
            "studSpacing": 0.6096,
            "momentOfInertia": 0.45,
            "deflectionRatio": "360",
            "proposedHeight": 4
          },
          "expected": 5.0413,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Line load carried by one stud",
              "value": 152.4,
              "unit": "N/m"
            },
            {
              "label": "Deflection at the proposed height",
              "value": 5.550092865727084,
              "unit": "mm"
            },
            {
              "label": "Allowable deflection at the proposed height",
              "value": 11.11111111111111,
              "unit": "mm"
            },
            {
              "label": "Deflection allowance used at that height",
              "value": 49.95083579154376,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "shaftwall-liner-panel-calculator",
      "title": "Fire-Rated Shaftwall Liner Panel Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/shaftwall-liner-panel-calculator/",
      "sources": [
        "Liner panel count = ceil(wall length ÷ liner panel width) — shaftwall liner panels are commonly 1 in thick and 24 in wide, friction-fit between the shaftwall studs"
      ],
      "vectors": [
        {
          "name": "10m wall, 0.61m panels",
          "inputs": {
            "wallLength": 10,
            "linerPanelWidth": 0.61
          },
          "expected": 17,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "14m wall, 0.61m panels",
          "inputs": {
            "wallLength": 14,
            "linerPanelWidth": 0.61
          },
          "expected": 23,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "shaftwall-screw-count-calculator",
      "title": "Shaftwall Track & Stud Screw Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/shaftwall-screw-count-calculator/",
      "sources": [
        "Total screws = stud count × screws per stud, the same fastening-count method used for standard cold-formed steel stud framing"
      ],
      "vectors": [
        {
          "name": "18 studs, 4 screws/stud",
          "inputs": {
            "studCount": 18,
            "screwsPerStud": 4
          },
          "expected": 72,
          "toleranceDecimalPlaces": 0,
          "unit": "screws",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15 studs, 6 screws/stud",
          "inputs": {
            "studCount": 15,
            "screwsPerStud": 6
          },
          "expected": 90,
          "toleranceDecimalPlaces": 0,
          "unit": "screws",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "shaftwall-stud-framework-calculator",
      "title": "Shaftwall Stud Framework Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/shaftwall-stud-framework-calculator/",
      "sources": [
        "Shaftwall stud count = ceil(wall length ÷ spacing) + 1, the same layout method as standard steel/wood stud framing, typically at 24 in o.c. for shaftwall assemblies"
      ],
      "vectors": [
        {
          "name": "10m wall, 24in o.c.",
          "inputs": {
            "wallLength": 10,
            "studSpacing": 0.6096
          },
          "expected": 18,
          "toleranceDecimalPlaces": 0,
          "unit": "studs",
          "confidence": "high",
          "steps": [
            {
              "label": "Whole bays up the run",
              "value": 16
            },
            {
              "label": "Closing space at the last stud",
              "value": 9.700787401574757,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "8m wall, 24in o.c.",
          "inputs": {
            "wallLength": 8,
            "studSpacing": 0.6096
          },
          "expected": 15,
          "toleranceDecimalPlaces": 0,
          "unit": "studs",
          "confidence": "high",
          "steps": [
            {
              "label": "Whole bays up the run",
              "value": 13
            },
            {
              "label": "Closing space at the last stud",
              "value": 2.9606299212597946,
              "unit": "in"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "shed-anchor-kit-calculator",
      "title": "Shed Anchor Kit Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/shed-anchor-kit-calculator/",
      "sources": [
        "Anchor count = shed perimeter / anchor spacing, rounded up; a common general guideline spaces anchors every 6 ft around the perimeter"
      ],
      "vectors": [
        {
          "name": "13.2m perimeter, 6ft spacing",
          "inputs": {
            "shedPerimeter": 13.2,
            "anchorSpacing": 1.8288
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "anchors",
          "confidence": "medium",
          "steps": [
            {
              "label": "Shed perimeter",
              "value": 43.30708661417322,
              "unit": "ft"
            },
            {
              "label": "Anchor centres round the shed",
              "value": 5.413385826771653,
              "unit": "ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "16.8m perimeter, 6ft spacing",
          "inputs": {
            "shedPerimeter": 16.8,
            "anchorSpacing": 1.8288
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "anchors",
          "confidence": "medium",
          "steps": [
            {
              "label": "Shed perimeter",
              "value": 55.118110236220474,
              "unit": "ft"
            },
            {
              "label": "Anchor centres round the shed",
              "value": 5.511811023622047,
              "unit": "ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "shed-foundation-skid-calculator",
      "title": "Shed Foundation Skid Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/shed-foundation-skid-calculator/",
      "sources": [
        "Skid count = (shed width / skid spacing) + 1; each skid runs the full length of the shed, spaced at a standard 2 ft interval across the width"
      ],
      "vectors": [
        {
          "name": "3x3.6m shed",
          "inputs": {
            "shedWidth": 3,
            "shedLength": 3.6
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "skids",
          "confidence": "medium",
          "steps": [
            {
              "label": "Length of each skid",
              "value": 11.811023622047244,
              "unit": "ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "3.6x4.8m shed",
          "inputs": {
            "shedWidth": 3.6,
            "shedLength": 4.8
          },
          "expected": 7,
          "toleranceDecimalPlaces": 0,
          "unit": "skids",
          "confidence": "medium",
          "steps": [
            {
              "label": "Length of each skid",
              "value": 15.74803149606299,
              "unit": "ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "sheet-drain-rate-calculator",
      "title": "Foundation Sheet Drain Drainage Rate Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/sheet-drain-rate-calculator/",
      "sources": [
        "Total drainage capacity = the drain product's rated flow capacity per unit width × total drainage width, the standard method for scaling a manufacturer's per-unit-width flow rating to a full installation"
      ],
      "vectors": [
        {
          "name": "5 L/s/m, 20m width",
          "inputs": {
            "ratedCapacity": 5,
            "drainageWidth": 20
          },
          "expected": 100,
          "toleranceDecimalPlaces": 0,
          "unit": "L/s",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "6 L/s/m, 30m width",
          "inputs": {
            "ratedCapacity": 6,
            "drainageWidth": 30
          },
          "expected": 180,
          "toleranceDecimalPlaces": 0,
          "unit": "L/s",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "shgc-effective-shading-calculator",
      "title": "SHGC Effective Shading Fraction Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/shgc-effective-shading-calculator/",
      "sources": [
        "ASHRAE profile-angle method (Fundamentals Ch. 15): shadow drop on the glass = overhang projection × tan(solar altitude angle) [for a window facing directly into the sun]; shaded fraction = clamp((shadow drop − head gap) ÷ window height, 0, 1); a common simplified approximation is effective SHGC ≈ glass SHGC × (1 − shaded fraction), treating shaded glass as receiving negligible direct gain"
      ],
      "vectors": [
        {
          "name": "0.4 SHGC glass, 60° altitude, 0.6m overhang",
          "inputs": {
            "glassSHGC": 0.4,
            "solarAltitude": 60,
            "overhangProjection": 0.6,
            "headGap": 0.1,
            "windowHeight": 1.5
          },
          "expected": 0.1495,
          "toleranceDecimalPlaces": 2,
          "unit": "SHGC",
          "confidence": "medium",
          "steps": [
            {
              "label": "Shaded fraction of window",
              "value": 0.626153656360884
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "0.35 SHGC glass, 45° altitude, 0.5m overhang",
          "inputs": {
            "glassSHGC": 0.35,
            "solarAltitude": 45,
            "overhangProjection": 0.5,
            "headGap": 0.15,
            "windowHeight": 1.2
          },
          "expected": 0.2479,
          "toleranceDecimalPlaces": 2,
          "unit": "SHGC",
          "confidence": "medium",
          "steps": [
            {
              "label": "Shaded fraction of window",
              "value": 0.2916666666666667
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "shoring-active-pressure-calculator",
      "title": "Excavation Shoring Lateral Active Soil Pressure Calculator (Rankine)",
      "url": "https://craftquantities.com/calculators/heavy-civil/shoring-active-pressure-calculator/",
      "sources": [
        "Rankine active earth pressure theory for a cohesionless soil, vertical smooth wall, horizontal ground surface, no surcharge, no water table: Ka = tan²(45° − φ/2); peak pressure at base p_max = γ×H×Ka; total active force per unit length of wall Pa = 0.5×γ×H²×Ka. This is the standard textbook formula (used in the Caltrans Trenching and Shoring Manual and standard geotechnical references). OSHA 29 CFR 1926 Subpart P classifies soil by Type A/B/C using field tests (unconfined compressive strength), NOT by friction angle or Ka — the actual protective system must be selected per Subpart P's prescriptive tables or designed by a registered professional engineer (1926.652(b)/(c)); this formula is not itself an OSHA-published method."
      ],
      "vectors": [
        {
          "name": "18 kN/m³, φ=30°, 3m excavation",
          "inputs": {
            "soilUnitWeight": 18,
            "frictionAngle": 30,
            "excavationHeight": 3
          },
          "expected": 27,
          "toleranceDecimalPlaces": 1,
          "unit": "kN/m",
          "confidence": "low",
          "steps": [
            {
              "label": "Peak lateral pressure at base of cut",
              "value": 18.000000000000004,
              "unit": "kN/m²"
            },
            {
              "label": "Active pressure coefficient Ka",
              "value": 0.3333333333333334,
              "unit": "(dimensionless)"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "19 kN/m³, φ=32°, 4m excavation",
          "inputs": {
            "soilUnitWeight": 19,
            "frictionAngle": 32,
            "excavationHeight": 4
          },
          "expected": 46.7,
          "toleranceDecimalPlaces": 1,
          "unit": "kN/m",
          "confidence": "low",
          "steps": [
            {
              "label": "Peak lateral pressure at base of cut",
              "value": 23.351647863707605,
              "unit": "kN/m²"
            },
            {
              "label": "Active pressure coefficient Ka",
              "value": 0.3072585245224685,
              "unit": "(dimensionless)"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "short-circuit-current-calculator",
      "title": "Transformer-Limited Short-Circuit Current Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/short-circuit-current-calculator/",
      "sources": [
        "Simplified transformer-only fault current estimate: full-load amps = (transformer kVA × 1000) ÷ (voltage × √3) for three-phase; available fault current = full-load amps ÷ (transformer impedance percentage ÷ 100) — this is the classical 'infinite source' approximation used for preliminary screening. It ignores upstream utility source impedance and downstream conductor impedance, which reduce the current available at a given point — and it also ignores motor contribution and the tolerance on nameplate impedance, which raise it"
      ],
      "vectors": [
        {
          "name": "500 kVA, 480V, 5.5% Z",
          "inputs": {
            "transformerKVA": 500,
            "secondaryVoltage": 480,
            "impedancePercent": 5.5
          },
          "expected": 10934.66,
          "toleranceDecimalPlaces": -1,
          "unit": "A",
          "confidence": "low",
          "steps": [
            {
              "label": "Transformer full-load amps",
              "value": 601.4065304058603,
              "unit": "A"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "750 kVA, 480V, 5.75% Z",
          "inputs": {
            "transformerKVA": 750,
            "secondaryVoltage": 480,
            "impedancePercent": 5.75
          },
          "expected": 15688.87,
          "toleranceDecimalPlaces": -1,
          "unit": "A",
          "confidence": "low",
          "steps": [
            {
              "label": "Transformer full-load amps",
              "value": 902.1097956087904,
              "unit": "A"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "sidewalk-joint-spacing-calculator",
      "title": "Concrete Sidewalk Control Joint Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/sidewalk-joint-spacing-calculator/",
      "sources": [
        "Control joints needed = ceil(sidewalk length ÷ maximum panel length) − 1, keeping each concrete panel within the standard maximum unbroken length to control shrinkage cracking (commonly matching the sidewalk width, per ACI guidance)"
      ],
      "vectors": [
        {
          "name": "30m sidewalk, 1.52m max panel",
          "inputs": {
            "sidewalkLength": 30,
            "maxPanelLength": 1.52
          },
          "expected": 19,
          "toleranceDecimalPlaces": 0,
          "unit": "control joints",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "45m sidewalk, 1.52m max panel",
          "inputs": {
            "sidewalkLength": 45,
            "maxPanelLength": 1.52
          },
          "expected": 29,
          "toleranceDecimalPlaces": 0,
          "unit": "control joints",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "siding-calculator",
      "title": "Siding Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/siding-calculator/",
      "sources": [
        "Vinyl siding is conventionally quoted in 'squares' of 100 sq ft, the same convention used for roofing"
      ],
      "vectors": [
        {
          "name": "40m perimeter, 3m height, 2 doors, 8 windows, 10% waste",
          "inputs": {
            "wallLength": 40,
            "wallHeight": 3,
            "doorCount": 2,
            "windowCount": 8,
            "wasteFactorPercent": 10
          },
          "expected": 12.42,
          "toleranceDecimalPlaces": 1,
          "unit": "squares",
          "confidence": "high",
          "steps": [
            {
              "label": "Net wall area",
              "value": 1129.1342027128499,
              "unit": "sq ft"
            },
            {
              "label": "Openings subtracted",
              "value": 162.5350472923168,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "60m perimeter, 2.7m height, 3 doors, 12 windows, 12% waste",
          "inputs": {
            "wallLength": 60,
            "wallHeight": 2.7,
            "doorCount": 3,
            "windowCount": 12,
            "wasteFactorPercent": 12
          },
          "expected": 16.8,
          "toleranceDecimalPlaces": 1,
          "unit": "squares",
          "confidence": "high",
          "steps": [
            {
              "label": "Net wall area",
              "value": 1499.9509165684997,
              "unit": "sq ft"
            },
            {
              "label": "Openings subtracted",
              "value": 243.80257093847518,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "siding-fastener-count-calculator",
      "title": "Vinyl Siding Fastener Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/siding-fastener-count-calculator/",
      "sources": [
        "Total fasteners = panel count × fasteners per panel, the standard fastening-count method for lap siding installation"
      ],
      "vectors": [
        {
          "name": "150 panels, 6 fasteners each",
          "inputs": {
            "panelCount": 150,
            "fastenersPerPanel": 6
          },
          "expected": 900,
          "toleranceDecimalPlaces": 0,
          "unit": "fasteners",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "200 panels, 8 fasteners each",
          "inputs": {
            "panelCount": 200,
            "fastenersPerPanel": 8
          },
          "expected": 1600,
          "toleranceDecimalPlaces": 0,
          "unit": "fasteners",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "siding-j-channel-calculator",
      "title": "Vinyl/Fiber-Cement Siding J-Channel Trim Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/siding-j-channel-calculator/",
      "sources": [
        "Total J-channel = total trim run length (around openings and edges) × (1 + waste allowance)"
      ],
      "vectors": [
        {
          "name": "35m trim run, 8% waste",
          "inputs": {
            "trimLength": 35,
            "wastePercent": 8
          },
          "expected": 37.8,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "50m trim run, 10% waste",
          "inputs": {
            "trimLength": 50,
            "wastePercent": 10
          },
          "expected": 55,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "siding-starter-strip-calculator",
      "title": "Vinyl Siding Starter Strip Linear Footage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/siding-starter-strip-calculator/",
      "sources": [
        "Total starter strip = wall perimeter × (1 + waste allowance), since a continuous starter strip runs along the base of every sided wall to anchor the first course"
      ],
      "vectors": [
        {
          "name": "40m perimeter, 5% waste",
          "inputs": {
            "wallPerimeter": 40,
            "wastePercent": 5
          },
          "expected": 42,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "55m perimeter, 8% waste",
          "inputs": {
            "wallPerimeter": 55,
            "wastePercent": 8
          },
          "expected": 59.4,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "siding-undersill-trim-calculator",
      "title": "Vinyl Siding Undersill/Utility Trim Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/siding-undersill-trim-calculator/",
      "sources": [
        "Total undersill trim = total top-of-wall run length × (1 + waste allowance), terminating the top course of siding beneath the soffit"
      ],
      "vectors": [
        {
          "name": "40m run, 5% waste",
          "inputs": {
            "runLength": 40,
            "wastePercent": 5
          },
          "expected": 42,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "55m run, 8% waste",
          "inputs": {
            "runLength": 55,
            "wastePercent": 8
          },
          "expected": 59.4,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "sign-post-foundation-calculator",
      "title": "Traffic Sign Post Foundation Concrete Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/sign-post-foundation-calculator/",
      "sources": [
        "Foundation volume = π × (foundation diameter ÷ 2)² × foundation depth, standard cylindrical footing volume applied to a drilled sign post foundation"
      ],
      "vectors": [
        {
          "name": "0.3m diameter, 0.9m depth",
          "inputs": {
            "foundationDiameter": 0.3,
            "foundationDepth": 0.9
          },
          "expected": 0.0636,
          "toleranceDecimalPlaces": 2,
          "unit": "m³",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "0.35m diameter, 1.0m depth",
          "inputs": {
            "foundationDiameter": 0.35,
            "foundationDepth": 1
          },
          "expected": 0.0962,
          "toleranceDecimalPlaces": 2,
          "unit": "m³",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "silt-fence-run-calculator",
      "title": "Silt Fence Run and Contributing Area Calculator",
      "url": "https://craftquantities.com/calculators/heavy-civil/silt-fence-run-calculator/",
      "sources": [
        "ASTM D6462 Standard Practice for Silt Fence Installation — trenched and sliced installation, post embedment, and attachment of the geotextile to the posts",
        "A ceiling of 0.25 acre (about 1,010 m²) of contributing drainage area per 100 ft (30 m) of silt fence is the figure carried by most state erosion and sediment control manuals. It is an editable input here, not a constant, because the number that governs your site is the one printed in your own state's manual",
        "Turning the ends of a run upslope so runoff cannot escape around them — a J-hook — is standard field practice in state erosion and sediment control manuals. The return LENGTH is a rule of thumb rather than a published figure, which is why it is asked for rather than assumed"
      ],
      "vectors": [
        {
          "name": "120 m run, four 2.4 m returns",
          "inputs": {
            "fenceRunLength": 120,
            "contributingArea": 1200,
            "slopeLengthAbove": 10,
            "slopeSteepness": 10,
            "postSpacing": 1.83,
            "jHookCount": 4,
            "jHookReturnLength": 2.4,
            "allowableAreaPer100ft": 1011.7141056
          },
          "expected": 129.6,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Main run before returns",
              "value": 120,
              "unit": "m"
            },
            {
              "label": "Added by the J-hook returns",
              "value": 9.6,
              "unit": "m"
            },
            {
              "label": "Posts required",
              "value": 75,
              "unit": "posts"
            },
            {
              "label": "Bays along the main run",
              "value": 66
            },
            {
              "label": "Post centres along the main run",
              "value": 1.8181818181818181,
              "unit": "m"
            },
            {
              "label": "Contributing area per 100 ft (30 m) of run",
              "value": 304.8,
              "unit": "m²"
            },
            {
              "label": "Allowance entered, for the same length",
              "value": 1011.7141056,
              "unit": "m²"
            },
            {
              "label": "Share of the allowance used",
              "value": 30.127088108476798,
              "unit": "%"
            },
            {
              "label": "Catchment the slope length above implies",
              "value": 1200,
              "unit": "m²"
            },
            {
              "label": "Fall over the slope above the fence",
              "value": 1,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "250 m run, six 3 m returns",
          "inputs": {
            "fenceRunLength": 250,
            "contributingArea": 4000,
            "slopeLengthAbove": 16,
            "slopeSteepness": 25,
            "postSpacing": 2.44,
            "jHookCount": 6,
            "jHookReturnLength": 3,
            "allowableAreaPer100ft": 1011.7141056
          },
          "expected": 268,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Main run before returns",
              "value": 250,
              "unit": "m"
            },
            {
              "label": "Added by the J-hook returns",
              "value": 18,
              "unit": "m"
            },
            {
              "label": "Posts required",
              "value": 116,
              "unit": "posts"
            },
            {
              "label": "Bays along the main run",
              "value": 103
            },
            {
              "label": "Post centres along the main run",
              "value": 2.4271844660194173,
              "unit": "m"
            },
            {
              "label": "Contributing area per 100 ft (30 m) of run",
              "value": 487.68,
              "unit": "m²"
            },
            {
              "label": "Allowance entered, for the same length",
              "value": 1011.7141056,
              "unit": "m²"
            },
            {
              "label": "Share of the allowance used",
              "value": 48.203340973562874,
              "unit": "%"
            },
            {
              "label": "Catchment the slope length above implies",
              "value": 4000,
              "unit": "m²"
            },
            {
              "label": "Fall over the slope above the fence",
              "value": 4,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "single-phase-motor-full-load-current-calculator",
      "title": "Single-Phase Motor Full-Load Current Calculator (Amps from hp or kW)",
      "url": "https://craftquantities.com/calculators/electrical/single-phase-motor-full-load-current-calculator/",
      "sources": [
        "Single-phase motor input current from rated output: I = P(out) ÷ (V × efficiency × power factor), the electrical input being the shaft output divided by the efficiency, and single-phase current that input divided by volts times power factor",
        "WEG Rolled Steel General Purpose 1-phase Motors, performance data (AutomationDirect catalogue page tMTR-54): full-load amps, efficiency and power factor per motor — 3/4 hp 1,745 rpm .7518ES1B56C-S at 10.6/5.86-5.3 A (115/208-230 V), 68.5% and 0.67, the figures this page opens on; 1 hp 1,745 rpm 00118ES1B56C-S at 13.6/7.52-6.8 A, 71.0% and 0.68; 1 hp 3,500 rpm 00136ES1B56C-S at 10.1/5.64-5.06 A, 70.0% and 0.92",
        "Mechanical horsepower is 550 ft·lbf/s = 745.699872 W exactly",
        "NFPA 70-1968, the National Electrical Code, Section 430-6(a) (reprinted with permission by the US Mine Safety and Health Administration): where a motor's current is used to size conductors, switches and branch-circuit protection, the code's full-load current tables are used instead of the nameplate current, and running overload protection is based on the nameplate. Its exceptions in the same section: 430-6(b), a sealed (hermetic-type) motor-compressor takes the full-load current marked on the nameplate of the equipment it is in, for the branch-circuit conductors, the controller and the protection; 430-6(c), a torque motor its nameplate locked-rotor current; and multispeed motors their own rules. Current editions number it 430.6(A)(1) and the single-phase table 430.248, which this page does not reproduce",
        "WEG W22 Single-Phase Electric Motor, Commercial Catalogue, European Market (Cod. 50069268, Rev. 00, 01/2017), page 5, Electrical Data, W22 Single-Phase CSR (starting and run capacitor), IV pole, 50 Hz: 0.75 kW (1 HP), frame 80, 1,435 rpm, efficiency 70.0% and power factor 0.92 at full load, 5.06 A at 230 V — the motor a UK, Australian or international reader opens on; II pole 0.75 kW, 2,915 rpm, 75.0% and 0.91, 4.78 A"
      ],
      "vectors": [
        {
          "name": "the opening motor: WEG's 3/4 hp at 230 V, 68.5% and 0.67, draws the 5.3 A its sheet lists",
          "inputs": {
            "rating": 0.75,
            "ratingUnit": "hp",
            "voltage": "230",
            "efficiency": 68.5,
            "powerFactor": 0.67
          },
          "expected": 5.298246,
          "toleranceDecimalPlaces": 4,
          "unit": "A",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rated output at the shaft",
              "value": 0.5592749036867027,
              "unit": "kW"
            },
            {
              "label": "Rated output in watts",
              "value": 559.2749036867027,
              "unit": "W"
            },
            {
              "label": "Electrical input, output ÷ efficiency",
              "value": 0.8164597134112448,
              "unit": "kW"
            },
            {
              "label": "Apparent power drawn, volts × amps",
              "value": 1.2185965871809623,
              "unit": "kVA"
            },
            {
              "label": "Voltage used",
              "value": 230,
              "unit": "V"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "the same motor connected for 115 V draws 10.6 A, twice the 230 V figure",
          "inputs": {
            "rating": 0.75,
            "ratingUnit": "hp",
            "voltage": "115",
            "efficiency": 68.5,
            "powerFactor": 0.67
          },
          "expected": 10.596492,
          "toleranceDecimalPlaces": 4,
          "unit": "A",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rated output at the shaft",
              "value": 0.5592749036867027,
              "unit": "kW"
            },
            {
              "label": "Rated output in watts",
              "value": 559.2749036867027,
              "unit": "W"
            },
            {
              "label": "Electrical input, output ÷ efficiency",
              "value": 0.8164597134112448,
              "unit": "kW"
            },
            {
              "label": "Apparent power drawn, volts × amps",
              "value": 1.2185965871809623,
              "unit": "kVA"
            },
            {
              "label": "Voltage used",
              "value": 115,
              "unit": "V"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "WEG's 1 hp 3,500 rpm motor at 230 V, 70% and 0.92: 5.04 A against the 5.06 A listed",
          "inputs": {
            "rating": 1,
            "ratingUnit": "hp",
            "voltage": "230",
            "efficiency": 70,
            "powerFactor": 0.92
          },
          "expected": 5.03443,
          "toleranceDecimalPlaces": 4,
          "unit": "A",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rated output at the shaft",
              "value": 0.7456998715822702,
              "unit": "kW"
            },
            {
              "label": "Rated output in watts",
              "value": 745.6998715822702,
              "unit": "W"
            },
            {
              "label": "Electrical input, output ÷ efficiency",
              "value": 1.0652855308318145,
              "unit": "kW"
            },
            {
              "label": "Apparent power drawn, volts × amps",
              "value": 1.1579190552519725,
              "unit": "kVA"
            },
            {
              "label": "Voltage used",
              "value": 230,
              "unit": "V"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "a kW reader's opening: WEG's 0.75 kW four-pole W22 at 230 V, 70% and 0.92, draws the 5.06 A its catalogue lists",
          "inputs": {
            "rating": 0.75,
            "ratingUnit": "kw",
            "voltage": "230",
            "efficiency": 70,
            "powerFactor": 0.92
          },
          "expected": 5.063462,
          "toleranceDecimalPlaces": 4,
          "unit": "A",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rated output at the shaft",
              "value": 0.75,
              "unit": "kW"
            },
            {
              "label": "Rated output in horsepower",
              "value": 1.005766567196271,
              "unit": "hp"
            },
            {
              "label": "Electrical input, output ÷ efficiency",
              "value": 1.0714285714285716,
              "unit": "kW"
            },
            {
              "label": "Apparent power drawn, volts × amps",
              "value": 1.1645962732919255,
              "unit": "kVA"
            },
            {
              "label": "Voltage used",
              "value": 230,
              "unit": "V"
            }
          ],
          "basis": "cited",
          "sourceIndex": 4
        },
        {
          "name": "WEG's 0.75 kW two-pole W22 at 230 V, 75% and 0.91: 4.78 A, as listed",
          "inputs": {
            "rating": 0.75,
            "ratingUnit": "kw",
            "voltage": "230",
            "efficiency": 75,
            "powerFactor": 0.91
          },
          "expected": 4.777831,
          "toleranceDecimalPlaces": 4,
          "unit": "A",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rated output at the shaft",
              "value": 0.75,
              "unit": "kW"
            },
            {
              "label": "Rated output in horsepower",
              "value": 1.005766567196271,
              "unit": "hp"
            },
            {
              "label": "Electrical input, output ÷ efficiency",
              "value": 1,
              "unit": "kW"
            },
            {
              "label": "Apparent power drawn, volts × amps",
              "value": 1.098901098901099,
              "unit": "kVA"
            },
            {
              "label": "Voltage used",
              "value": 230,
              "unit": "V"
            }
          ],
          "basis": "cited",
          "sourceIndex": 4
        },
        {
          "name": "a typed 220 V: 1.5 kW at 80% and 0.95 draws 8.97 A",
          "inputs": {
            "rating": 1.5,
            "ratingUnit": "kw",
            "voltage": "other",
            "customVoltage": 220,
            "efficiency": 80,
            "powerFactor": 0.95
          },
          "expected": 8.97129,
          "toleranceDecimalPlaces": 4,
          "unit": "A",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rated output at the shaft",
              "value": 1.5,
              "unit": "kW"
            },
            {
              "label": "Rated output in horsepower",
              "value": 2.011533134392542,
              "unit": "hp"
            },
            {
              "label": "Electrical input, output ÷ efficiency",
              "value": 1.875,
              "unit": "kW"
            },
            {
              "label": "Apparent power drawn, volts × amps",
              "value": 1.9736842105263157,
              "unit": "kVA"
            },
            {
              "label": "Voltage used",
              "value": 220,
              "unit": "V"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "power factor 1 and 100% efficiency reduce to watts over volts: 2.3 kW at 230 V is 10 A",
          "inputs": {
            "rating": 2.3,
            "ratingUnit": "kw",
            "voltage": "230",
            "efficiency": 100,
            "powerFactor": 1
          },
          "expected": 10,
          "toleranceDecimalPlaces": 6,
          "unit": "A",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rated output at the shaft",
              "value": 2.3,
              "unit": "kW"
            },
            {
              "label": "Rated output in horsepower",
              "value": 3.084350806068564,
              "unit": "hp"
            },
            {
              "label": "Electrical input, output ÷ efficiency",
              "value": 2.3,
              "unit": "kW"
            },
            {
              "label": "Apparent power drawn, volts × amps",
              "value": 2.3,
              "unit": "kVA"
            },
            {
              "label": "Voltage used",
              "value": 230,
              "unit": "V"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1 hp at 70% and 0.92 on 120 V draws 9.65 A",
          "inputs": {
            "rating": 1,
            "ratingUnit": "hp",
            "voltage": "120",
            "efficiency": 70,
            "powerFactor": 0.92
          },
          "expected": 9.649325,
          "toleranceDecimalPlaces": 4,
          "unit": "A",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rated output at the shaft",
              "value": 0.7456998715822702,
              "unit": "kW"
            },
            {
              "label": "Rated output in watts",
              "value": 745.6998715822702,
              "unit": "W"
            },
            {
              "label": "Electrical input, output ÷ efficiency",
              "value": 1.0652855308318145,
              "unit": "kW"
            },
            {
              "label": "Apparent power drawn, volts × amps",
              "value": 1.1579190552519725,
              "unit": "kVA"
            },
            {
              "label": "Voltage used",
              "value": 120,
              "unit": "V"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1 hp at 70% and 0.92 on 200 V draws 5.79 A",
          "inputs": {
            "rating": 1,
            "ratingUnit": "hp",
            "voltage": "200",
            "efficiency": 70,
            "powerFactor": 0.92
          },
          "expected": 5.789595,
          "toleranceDecimalPlaces": 4,
          "unit": "A",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rated output at the shaft",
              "value": 0.7456998715822702,
              "unit": "kW"
            },
            {
              "label": "Rated output in watts",
              "value": 745.6998715822702,
              "unit": "W"
            },
            {
              "label": "Electrical input, output ÷ efficiency",
              "value": 1.0652855308318145,
              "unit": "kW"
            },
            {
              "label": "Apparent power drawn, volts × amps",
              "value": 1.1579190552519725,
              "unit": "kVA"
            },
            {
              "label": "Voltage used",
              "value": 200,
              "unit": "V"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1 hp at 70% and 0.92 on 208 V draws 5.57 A",
          "inputs": {
            "rating": 1,
            "ratingUnit": "hp",
            "voltage": "208",
            "efficiency": 70,
            "powerFactor": 0.92
          },
          "expected": 5.566919,
          "toleranceDecimalPlaces": 4,
          "unit": "A",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rated output at the shaft",
              "value": 0.7456998715822702,
              "unit": "kW"
            },
            {
              "label": "Rated output in watts",
              "value": 745.6998715822702,
              "unit": "W"
            },
            {
              "label": "Electrical input, output ÷ efficiency",
              "value": 1.0652855308318145,
              "unit": "kW"
            },
            {
              "label": "Apparent power drawn, volts × amps",
              "value": 1.1579190552519725,
              "unit": "kVA"
            },
            {
              "label": "Voltage used",
              "value": 208,
              "unit": "V"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1 hp at 70% and 0.92 on 220 V draws 5.26 A",
          "inputs": {
            "rating": 1,
            "ratingUnit": "hp",
            "voltage": "220",
            "efficiency": 70,
            "powerFactor": 0.92
          },
          "expected": 5.263268,
          "toleranceDecimalPlaces": 4,
          "unit": "A",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rated output at the shaft",
              "value": 0.7456998715822702,
              "unit": "kW"
            },
            {
              "label": "Rated output in watts",
              "value": 745.6998715822702,
              "unit": "W"
            },
            {
              "label": "Electrical input, output ÷ efficiency",
              "value": 1.0652855308318145,
              "unit": "kW"
            },
            {
              "label": "Apparent power drawn, volts × amps",
              "value": 1.1579190552519725,
              "unit": "kVA"
            },
            {
              "label": "Voltage used",
              "value": 220,
              "unit": "V"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1 hp at 70% and 0.92 on 240 V draws 4.82 A",
          "inputs": {
            "rating": 1,
            "ratingUnit": "hp",
            "voltage": "240",
            "efficiency": 70,
            "powerFactor": 0.92
          },
          "expected": 4.824663,
          "toleranceDecimalPlaces": 4,
          "unit": "A",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rated output at the shaft",
              "value": 0.7456998715822702,
              "unit": "kW"
            },
            {
              "label": "Rated output in watts",
              "value": 745.6998715822702,
              "unit": "W"
            },
            {
              "label": "Electrical input, output ÷ efficiency",
              "value": 1.0652855308318145,
              "unit": "kW"
            },
            {
              "label": "Apparent power drawn, volts × amps",
              "value": 1.1579190552519725,
              "unit": "kVA"
            },
            {
              "label": "Voltage used",
              "value": 240,
              "unit": "V"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "single-sided-fire-rated-board-calculator",
      "title": "Single-Sided Fire-Rated Gypsum Board Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/single-sided-fire-rated-board-calculator/",
      "sources": [
        "ASTM C840, Standard Specification for Application and Finishing of Gypsum Board, which governs how the layers are laid up, offset and fastened once the count is known",
        "The number of layers required for a given fire-resistance rating comes from the tested UL or GA design listing for the exact assembly, and cannot be derived from a rating alone",
        "Arithmetic only: boards per layer = ceil((wall area − openings) × (1 + waste) ÷ board area), multiplied by the number of layers on the single finished face"
      ],
      "vectors": [
        {
          "name": "30 m² face, 2 layers, 10% waste",
          "inputs": {
            "wallArea": 30,
            "boardArea": 2.88,
            "layers": 2,
            "openingArea": 0,
            "wastePercent": 10
          },
          "expected": 24,
          "toleranceDecimalPlaces": 0,
          "unit": "boards",
          "confidence": "medium",
          "steps": [
            {
              "label": "Boards in one layer",
              "value": 12,
              "unit": "boards"
            },
            {
              "label": "Net area after opening deductions",
              "value": 30,
              "unit": "m²"
            },
            {
              "label": "Area including the waste allowance",
              "value": 33,
              "unit": "m²"
            }
          ],
          "includesAllowance": {
            "label": "Waste allowance",
            "percent": 10
          },
          "basis": "ambiguous"
        },
        {
          "name": "48 m² face less 4 m² of openings, 3 layers, 12% waste",
          "inputs": {
            "wallArea": 48,
            "boardArea": 2.88,
            "layers": 3,
            "openingArea": 4,
            "wastePercent": 12
          },
          "expected": 54,
          "toleranceDecimalPlaces": 0,
          "unit": "boards",
          "confidence": "medium",
          "steps": [
            {
              "label": "Boards in one layer",
              "value": 18,
              "unit": "boards"
            },
            {
              "label": "Net area after opening deductions",
              "value": 44,
              "unit": "m²"
            },
            {
              "label": "Area including the waste allowance",
              "value": 49.28,
              "unit": "m²"
            }
          ],
          "includesAllowance": {
            "label": "Waste allowance",
            "percent": 12
          },
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "site-trailer-electrical-load-calculator",
      "title": "Temporary Site Trailer Electrical Load Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/site-trailer-electrical-load-calculator/",
      "sources": [
        "Total connected load (VA) = Lighting + HVAC + Receptacle Loads; Required amperage = Total VA ÷ Voltage — a straightforward connected-load sum with no demand factor applied (unlike a permanent dwelling service calculation), appropriate for a temporary construction trailer under NEC Article 590 (Temporary Installations), which governs the actual code requirements for temporary wiring."
      ],
      "vectors": [
        {
          "name": "1500+3500+2000 VA at 240V",
          "inputs": {
            "lightingLoad": 1500,
            "hvacLoad": 3500,
            "receptacleLoad": 2000,
            "voltage": 240
          },
          "expected": 29.17,
          "toleranceDecimalPlaces": 1,
          "unit": "A",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total connected load",
              "value": 7000,
              "unit": "VA"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2000+5000+3000 VA at 240V",
          "inputs": {
            "lightingLoad": 2000,
            "hvacLoad": 5000,
            "receptacleLoad": 3000,
            "voltage": 240
          },
          "expected": 41.67,
          "toleranceDecimalPlaces": 1,
          "unit": "A",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total connected load",
              "value": 10000,
              "unit": "VA"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "site-welfare-facilities-calculator",
      "title": "Site Welfare Toilets and Washing Stations Calculator",
      "url": "https://craftquantities.com/calculators/sustainability-compliance/site-welfare-facilities-calculator/",
      "sources": [
        "Workplace (Health, Safety and Welfare) Regulations 1992, Approved Code of Practice L24, Table 1 (mixed use or women): 1 to 5 people, 1 toilet and 1 washing station; 6 to 25, 2 of each; 26 to 50, 3; 51 to 75, 4; 76 to 100, 5; and above 100, one more of each for every 25 people or part of 25",
        "Construction (Design and Management) Regulations 2015, Schedule 2: suitable and sufficient sanitary conveniences and washing facilities must be provided or made available at readily accessible places on a construction site",
        "29 CFR 1926.51(c)(1), Table D-1: 20 employees or fewer, 1 toilet; 20 or more, 1 toilet seat and 1 urinal per 40 workers; 200 or more, 1 toilet seat and 1 urinal per 50 workers — and where the facilities will not be used by women, urinals may replace toilet seats down to two-thirds of the minimum number of seats"
      ],
      "vectors": [
        {
          "name": "Thirty people fall in L24's 26-to-50 band: 3 toilets and 3 washing stations",
          "inputs": {
            "people": 30,
            "basis": "uk"
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "toilets",
          "confidence": "high",
          "steps": [
            {
              "label": "Washing stations",
              "value": 3,
              "unit": "washing stations"
            },
            {
              "label": "People per toilet",
              "value": 10,
              "unit": "people"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Five people are the smallest band: 1 toilet",
          "inputs": {
            "people": 5,
            "basis": "uk"
          },
          "expected": 1,
          "toleranceDecimalPlaces": 0,
          "unit": "toilets",
          "confidence": "high",
          "steps": [
            {
              "label": "Washing stations",
              "value": 1,
              "unit": "washing stations"
            },
            {
              "label": "People per toilet",
              "value": 5,
              "unit": "people"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "126 people: 5 for the first hundred and one more for each started 25 — 7",
          "inputs": {
            "people": 126,
            "basis": "uk"
          },
          "expected": 7,
          "toleranceDecimalPlaces": 0,
          "unit": "toilets",
          "confidence": "high",
          "steps": [
            {
              "label": "Washing stations",
              "value": 7,
              "unit": "washing stations"
            },
            {
              "label": "People per toilet",
              "value": 18,
              "unit": "people"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Forty-five workers under OSHA's Table D-1: 2 toilet seats and 2 urinals",
          "inputs": {
            "people": 45,
            "basis": "us"
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "toilets",
          "confidence": "high",
          "steps": [
            {
              "label": "Urinals",
              "value": 2,
              "unit": "urinals"
            },
            {
              "label": "Workers per toilet seat",
              "value": 22.5,
              "unit": "workers"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "250 workers under Table D-1's 200-plus ratio: 5 toilet seats",
          "inputs": {
            "people": 250,
            "basis": "us"
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "toilets",
          "confidence": "high",
          "steps": [
            {
              "label": "Urinals",
              "value": 5,
              "unit": "urinals"
            },
            {
              "label": "Workers per toilet seat",
              "value": 50,
              "unit": "workers"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "skim-coat-plaster-calculator",
      "title": "Skim Coat Plaster Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/skim-coat-plaster-calculator/",
      "sources": [
        "Geometry: the plaster in a skim is the area times the finished thickness of the two passes, and its mass is that volume times the applied density of the mixed plaster",
        "Gypsum finish plaster is sold by weight and its coverage published by area at a nominal thickness — a 25 kg bag covering about 10 m² at 2 mm, which is an applied density of about 1,250 kg/m³"
      ],
      "vectors": [
        {
          "name": "30 m² at 2 mm, one coat, 1,250 kg/m³, 15% allowance",
          "inputs": {
            "area": 30,
            "thicknessMm": 0.002,
            "coats": 1,
            "density": 1250,
            "wastePercent": 15
          },
          "expected": 190.15,
          "toleranceDecimalPlaces": 1,
          "unit": "lb",
          "confidence": "high",
          "steps": [
            {
              "label": "Plaster volume",
              "value": 2.1188800032893154,
              "unit": "ft³"
            },
            {
              "label": "Before the allowance",
              "value": 165.3466966386582,
              "unit": "lb"
            },
            {
              "label": "Allowance at 15%",
              "value": 24.802004495798727,
              "unit": "lb"
            },
            {
              "label": "50 lb bags",
              "value": 4,
              "unit": "bags"
            },
            {
              "label": "Coverage at this thickness",
              "value": 80.72932812532291,
              "unit": "ft²/bag"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The published coverage, checked: 10 m² at 2 mm with no allowance is one 25 kg bag",
          "inputs": {
            "area": 10,
            "thicknessMm": 0.002,
            "coats": 1,
            "density": 1250,
            "wastePercent": 0
          },
          "expected": 55.116,
          "toleranceDecimalPlaces": 2,
          "unit": "lb",
          "confidence": "high",
          "steps": [
            {
              "label": "Plaster volume",
              "value": 0.7062933344297718,
              "unit": "ft³"
            },
            {
              "label": "Before the allowance",
              "value": 55.11556554621939,
              "unit": "lb"
            },
            {
              "label": "Allowance at 0%",
              "value": 0,
              "unit": "lb"
            },
            {
              "label": "50 lb bags",
              "value": 2,
              "unit": "bags"
            },
            {
              "label": "Coverage at this thickness",
              "value": 53.81955208354861,
              "unit": "ft²/bag"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A patched wall at 3 mm takes half as much again",
          "inputs": {
            "area": 30,
            "thicknessMm": 0.003,
            "coats": 1,
            "density": 1250,
            "wastePercent": 0
          },
          "expected": 248.02,
          "toleranceDecimalPlaces": 1,
          "unit": "lb",
          "confidence": "high",
          "steps": [
            {
              "label": "Plaster volume",
              "value": 3.178320004933973,
              "unit": "ft³"
            },
            {
              "label": "Before the allowance",
              "value": 248.02004495798727,
              "unit": "lb"
            },
            {
              "label": "Allowance at 0%",
              "value": 0,
              "unit": "lb"
            },
            {
              "label": "50 lb bags",
              "value": 5,
              "unit": "bags"
            },
            {
              "label": "Coverage at this thickness",
              "value": 64.58346250025832,
              "unit": "ft²/bag"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "skip-and-dumpster-size-calculator",
      "title": "Skip & Dumpster Size Calculator",
      "url": "https://craftquantities.com/calculators/auto-utility/skip-and-dumpster-size-calculator/",
      "sources": [
        "Typical loose waste densities: mixed construction 200-300 kg/m³; soil and rubble 1400-1600 kg/m³; timber 200 kg/m³",
        "Skips and roll-off containers carry a weight limit as well as a volume; heavy waste reaches the weight limit first"
      ],
      "vectors": [
        {
          "name": "6 m³ of mixed waste",
          "inputs": {
            "wasteVolume": 6000,
            "wasteType": "mixed",
            "weightLimitKg": 8000
          },
          "expected": 6,
          "toleranceDecimalPlaces": 1,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Estimated weight",
              "value": 1680,
              "unit": "kg"
            },
            {
              "label": "Metric tonnes",
              "value": 1.68,
              "unit": "t"
            },
            {
              "label": "Cubic yards",
              "value": 7.847703715886353,
              "unit": "yd³"
            },
            {
              "label": "Volume this container can take at the weight limit",
              "value": 28.571428571428573,
              "unit": "m³"
            },
            {
              "label": "Containers needed on weight",
              "value": 1,
              "unit": "loads"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Rubble at the same volume",
          "inputs": {
            "wasteVolume": 6000,
            "wasteType": "rubble",
            "weightLimitKg": 8000
          },
          "expected": 6,
          "toleranceDecimalPlaces": 1,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Estimated weight",
              "value": 9000,
              "unit": "kg"
            },
            {
              "label": "Metric tonnes",
              "value": 9,
              "unit": "t"
            },
            {
              "label": "Cubic yards",
              "value": 7.847703715886353,
              "unit": "yd³"
            },
            {
              "label": "Volume this container can take at the weight limit",
              "value": 5.333333333333333,
              "unit": "m³"
            },
            {
              "label": "Containers needed on weight",
              "value": 2,
              "unit": "loads"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A larger job",
          "inputs": {
            "wasteVolume": 20000,
            "wasteType": "mixed",
            "weightLimitKg": 8000
          },
          "expected": 20,
          "toleranceDecimalPlaces": 0,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Estimated weight",
              "value": 5600,
              "unit": "kg"
            },
            {
              "label": "Metric tonnes",
              "value": 5.6,
              "unit": "t"
            },
            {
              "label": "Cubic yards",
              "value": 26.159012386287845,
              "unit": "yd³"
            },
            {
              "label": "Volume this container can take at the weight limit",
              "value": 28.571428571428573,
              "unit": "m³"
            },
            {
              "label": "Containers needed on weight",
              "value": 1,
              "unit": "loads"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Zero waste needs no container",
          "inputs": {
            "wasteVolume": 0,
            "wasteType": "mixed",
            "weightLimitKg": 8000
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Estimated weight",
              "value": 0,
              "unit": "kg"
            },
            {
              "label": "Metric tonnes",
              "value": 0,
              "unit": "t"
            },
            {
              "label": "Cubic yards",
              "value": 0,
              "unit": "yd³"
            },
            {
              "label": "Volume this container can take at the weight limit",
              "value": 28.571428571428573,
              "unit": "m³"
            },
            {
              "label": "Containers needed on weight",
              "value": 0,
              "unit": "loads"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "skylight-curb-flashing-calculator",
      "title": "Skylight Curb Perimeter Flashing Length Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/skylight-curb-flashing-calculator/",
      "sources": [
        "Perimeter = 2 × (Curb Length + Curb Width) — a straightforward material takeoff for skylight curb flashing, distinct from this site's existing skylight rough-opening (framing) and glazing-bar (glass support spacing) calculators."
      ],
      "vectors": [
        {
          "name": "1.2m x 0.9m curb",
          "inputs": {
            "curbLength": 1.2,
            "curbWidth": 0.9
          },
          "expected": 4.2,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2.0m x 1.5m curb",
          "inputs": {
            "curbLength": 2,
            "curbWidth": 1.5
          },
          "expected": 7,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "skylight-curb-timber-calculator",
      "title": "Skylight Curb Timber Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/skylight-curb-timber-calculator/",
      "sources": [
        "A curb is built to the rough opening's outside dimensions and stood on the deck, so two pieces run the full opening and two fit between them: stock length per curb = 2 × opening length + 2 × (opening width − 2 × stock thickness)",
        "The height that matters is measured from the FINISHED roof surface, not the deck — height above the roof = board depth − the thickness of the covering build-up running up to the curb",
        "Curb height is set by the skylight manufacturer's installation instructions and by the covering. North American instructions commonly call for at least 4 in (100 mm) above the finished roof; 150 mm is the usual upstand in UK and European practice, and a low pitch or a snow site wants more than either"
      ],
      "vectors": [
        {
          "name": "One 1,400 × 780 mm opening, 38 mm stock, 10% waste",
          "inputs": {
            "openingLength": 1.4,
            "openingWidth": 0.78,
            "stockThickness": 0.038,
            "stockDepth": 0.184,
            "roofingThickness": 0.03,
            "targetHeight": 0.15,
            "curbCount": 1,
            "wasteAllowance": 10
          },
          "expected": 4.6288,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Two long pieces per curb, cut to",
              "value": 1400,
              "unit": "mm"
            },
            {
              "label": "Two short pieces per curb, cut to",
              "value": 704.0000000000001,
              "unit": "mm"
            },
            {
              "label": "Stock per curb before waste",
              "value": 4.208,
              "unit": "m"
            },
            {
              "label": "Height this board stands above the finished roof",
              "value": 154,
              "unit": "mm"
            },
            {
              "label": "Clear of the height you asked for by",
              "value": 4.0000000000000036,
              "unit": "mm"
            }
          ],
          "includesAllowance": {
            "label": "Cutting allowance",
            "percent": 10
          },
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Two 1,180 × 780 mm openings, no waste allowance",
          "inputs": {
            "openingLength": 1.18,
            "openingWidth": 0.78,
            "stockThickness": 0.038,
            "stockDepth": 0.14,
            "roofingThickness": 0.03,
            "targetHeight": 0.15,
            "curbCount": 2,
            "wasteAllowance": 0
          },
          "expected": 7.536,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "low",
          "steps": [
            {
              "label": "Two long pieces per curb, cut to",
              "value": 1180,
              "unit": "mm"
            },
            {
              "label": "Two short pieces per curb, cut to",
              "value": 704.0000000000001,
              "unit": "mm"
            },
            {
              "label": "Stock per curb before waste",
              "value": 3.768,
              "unit": "m"
            },
            {
              "label": "Height this board stands above the finished roof",
              "value": 110.00000000000001,
              "unit": "mm"
            },
            {
              "label": "SHORT of the height you asked for by",
              "value": 39.99999999999998,
              "unit": "mm"
            }
          ],
          "includesAllowance": {
            "label": "Cutting allowance",
            "percent": 0
          },
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "skylight-glazing-bar-calculator",
      "title": "Skylight Glazing Bar Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/skylight-glazing-bar-calculator/",
      "sources": [
        "Glazing bar count = ceil(skylight width ÷ maximum bar spacing) + 1, the standard layout method for spacing structural support bars beneath skylight glazing"
      ],
      "vectors": [
        {
          "name": "6m skylight, 0.7m max spacing",
          "inputs": {
            "skylightWidth": 6,
            "maxBarSpacing": 0.7
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "glazing bars",
          "confidence": "high",
          "steps": [
            {
              "label": "Bays across the skylight",
              "value": 9
            },
            {
              "label": "Bar centres across the opening",
              "value": 0.6666666666666666,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "8m skylight, 0.7m max spacing",
          "inputs": {
            "skylightWidth": 8,
            "maxBarSpacing": 0.7
          },
          "expected": 13,
          "toleranceDecimalPlaces": 0,
          "unit": "glazing bars",
          "confidence": "high",
          "steps": [
            {
              "label": "Bays across the skylight",
              "value": 12
            },
            {
              "label": "Bar centres across the opening",
              "value": 0.6666666666666666,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "skylight-light-well-area-calculator",
      "title": "Skylight Light Well Surface Area Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/skylight-light-well-area-calculator/",
      "sources": [
        "Light well wall area = 2 × (Width + Length) × Well Height — a straightforward surface-area takeoff for a straight (non-splayed) light well/shaft connecting a roof skylight to a ceiling opening below, useful for estimating reflective finish material needed to maximize daylight transmission."
      ],
      "vectors": [
        {
          "name": "1.2x1.5m well, 2.0m deep",
          "inputs": {
            "wellWidth": 1.2,
            "wellLength": 1.5,
            "wellHeight": 2
          },
          "expected": 10.8,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1.5x1.8m well, 2.5m deep",
          "inputs": {
            "wellWidth": 1.5,
            "wellLength": 1.8,
            "wellHeight": 2.5
          },
          "expected": 16.5,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "skylight-rough-opening-calculator",
      "title": "Skylight Rough Opening Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/skylight-rough-opening-calculator/",
      "sources": [
        "Rough opening dimension = skylight unit dimension + 2 x manufacturer-specified installation clearance (commonly 0.5in / 13mm per side)",
        "Clear gap between two rafters = spacing on centres - rafter thickness, so the widest unit that misses the rafters entirely is that gap less twice the clearance",
        "A rafter is interrupted when its own thickness overlaps the opening, so the rafter centres that fall in an open span of (opening width + rafter thickness) are the ones cut: either ceil(span / spacing) - 1 or ceil(span / spacing) of them, depending where the opening lands"
      ],
      "vectors": [
        {
          "name": "0.6x0.9m unit, 13mm clearance",
          "inputs": {
            "skylightWidth": 0.6,
            "skylightHeight": 0.9,
            "clearance": 0.013
          },
          "expected": 0.626,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Rough opening height",
              "value": 0.926,
              "unit": "m"
            },
            {
              "label": "Clear gap between two rafters",
              "value": null,
              "unit": "m"
            },
            {
              "label": "Widest unit that misses the rafters",
              "value": null,
              "unit": "m"
            },
            {
              "label": "Rafters interrupted, at fewest",
              "value": null
            },
            {
              "label": "Rafters interrupted, at most",
              "value": null
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "0.8x1.2m unit, 13mm clearance",
          "inputs": {
            "skylightWidth": 0.8,
            "skylightHeight": 1.2,
            "clearance": 0.013
          },
          "expected": 0.826,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Rough opening height",
              "value": 1.226,
              "unit": "m"
            },
            {
              "label": "Clear gap between two rafters",
              "value": null,
              "unit": "m"
            },
            {
              "label": "Widest unit that misses the rafters",
              "value": null,
              "unit": "m"
            },
            {
              "label": "Rafters interrupted, at fewest",
              "value": null
            },
            {
              "label": "Rafters interrupted, at most",
              "value": null
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "slab-rebar-combined-mass-calculator",
      "title": "Concrete Slab + Rebar Combined Mass Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/slab-rebar-combined-mass-calculator/",
      "sources": [
        "Concrete mass uses a typical normal-weight density of 2,400 kg/m³; rebar mass uses standard ASTM A615 linear density coefficients (#3 = 0.56 kg/m, #4 = 0.994 kg/m, #5 = 1.552 kg/m)",
        "A 15% lap-splice allowance is applied to total rebar linear footage, matching the site's Rebar Calculator"
      ],
      "vectors": [
        {
          "name": "4x3m slab, 0.15m thick, 12in grid, #4 bar",
          "inputs": {
            "slabLength": 4,
            "slabWidth": 3,
            "slabThickness": 0.15,
            "gridSpacingIn": 12,
            "rebarSize": "4"
          },
          "expected": 4413.74,
          "toleranceDecimalPlaces": -1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Concrete volume",
              "value": 1.7999999999999998,
              "unit": "m³"
            },
            {
              "label": "Concrete mass",
              "value": 4320,
              "unit": "kg"
            },
            {
              "label": "Rebar linear length (incl. lap splice)",
              "value": 94.3,
              "unit": "m"
            },
            {
              "label": "Rebar mass",
              "value": 93.7342,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "6x5m slab, 0.2m thick, 16in grid, #5 bar",
          "inputs": {
            "slabLength": 6,
            "slabWidth": 5,
            "slabThickness": 0.2,
            "gridSpacingIn": 16,
            "rebarSize": "5"
          },
          "expected": 14673.09,
          "toleranceDecimalPlaces": -1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Concrete volume",
              "value": 6,
              "unit": "m³"
            },
            {
              "label": "Concrete mass",
              "value": 14400,
              "unit": "kg"
            },
            {
              "label": "Rebar linear length (incl. lap splice)",
              "value": 175.95,
              "unit": "m"
            },
            {
              "label": "Rebar mass",
              "value": 273.07439999999997,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "slate-chippings-cubic-yards-to-tons-calculator",
      "title": "Slate Chippings Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/slate-chippings-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 1.35 short tons per cubic yard",
        "Density varies with moisture, grading and composition — the supplier's ticket weight governs"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 13.5,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.35,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 135,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.35,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "slate-chippings-tons-to-cubic-yards-calculator",
      "title": "Slate Chippings Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/slate-chippings-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 1.35 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 7.4074074074074066,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.7407407407407407,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 74.07407407407408,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.7407407407407407,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "slate-shingle-course-calculator",
      "title": "Slate Shingle Course Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/slate-shingle-course-calculator/",
      "sources": [
        "Course count = ceil(roof run length ÷ slate exposure), the same course-layout method used for wood shingles, applied to slate's typical weather exposure"
      ],
      "vectors": [
        {
          "name": "6m run, 0.19m exposure",
          "inputs": {
            "roofRunLength": 6,
            "slateExposure": 0.19
          },
          "expected": 32,
          "toleranceDecimalPlaces": 0,
          "unit": "courses",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "8m run, 0.178m exposure",
          "inputs": {
            "roofRunLength": 8,
            "slateExposure": 0.178
          },
          "expected": 45,
          "toleranceDecimalPlaces": 0,
          "unit": "courses",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "sleeper-retaining-wall-calculator",
      "title": "Sleeper Retaining Wall Calculator (Sleepers, Steel Posts and Post Concrete)",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/sleeper-retaining-wall-calculator/",
      "sources": [
        "Outback Sleepers, Installation Guide — Concrete Sleepers: holes at 2,010 mm centres for 2.0 m sleepers and 2,410 mm for 2.4 m sleepers, a similar 10 mm allowance for other lengths; hole diameter at least 450 mm for a one metre high wall, to be confirmed by a qualified engineer; for a one metre wall, post holes dug 1,100 mm deep, drawn with 1,000 mm of post above the ground, 1,000 mm in the hole and 100 mm of concrete under it; for all walls over 1 m, pier depth to be confirmed by a qualified engineer; a C section post drawn at the end of the run and H sections between; a plastic membrane behind the wall, an AG pipe or strip drain at the bottom of the wall covered in 20 mm gravel; no equipment over the backfill within 75% of the wall height; designs for typical soil conditions, and for walls over 1 metre independent engineering advice for the site",
        "Outback Sleepers, information for specifiers: sleepers in 2 m and 2.4 m lengths, 200 mm high, in a range of thicknesses; walls 600 mm high or less set a minimum of 600 mm into the ground; structures over 1 m in height require council approval and site-specific engineering; steel lengths and sizes to be confirmed by the site engineer",
        "Outback Sleepers, retaining wall calculator: number of sleepers = (wall height ÷ 0.2) × (wall length ÷ 2), number of steel posts = (wall length ÷ 2) + 1, using the standard 2 m sleeper on a straight wall of constant height; the customer checks product suitability and seeks council approval and engineering advice where required",
        "Wallbridge Gilbert Aztec for Outback Sleepers, drawing WAD150933-S01 revision 5 (3 July 2020), concrete sleepers, 2,000 mm long: 200 mm high, 75 mm thick for walls up to 2.0 m, 100 mm to 3.0 m and 110 mm to 4.0 m; suitable only where the wall carries no heavy surcharge (no retaining walls, structures or buildings within twice the wall height) and the finished surface above it is flatter than 1 vertical in 10 horizontal; assumed soil 18 kN/m³ and 30°, surcharge 5 kPa; hand compaction only within 0.75 of the wall height; at least 25 mm of end bearing at each end of a sleeper; steel posts and concrete pier footings by others",
        "Outback Sleepers, steel H-channel posts (NSW): 100 UC 14 galvanised I sections from 600 to 5,000 mm long and 150 UC 23 from 600 to 8,000 mm, hot-dip galvanised, for concrete sleeper retaining walls",
        "Bag yield: the Concrete Bag Calculator's standard published yield for pre-mixed concrete, 0.0075 cubic ft per pound of dry mix (0.60 cubic ft from an 80 lb bag, about 9.4 litres from a 20 kg bag); the yield printed on the bag governs"
      ],
      "vectors": [
        {
          "name": "The page's opening: 6 m of 1 m wall, 2.0 m sleepers 200 mm high at 2,010 mm centres",
          "inputs": {
            "wallLength": 6,
            "wallHeight": 1,
            "sleeperLength": 2,
            "sleeperHeight": 0.2,
            "postSpacing": 2.01,
            "embedment": 1,
            "holeDiameter": 0.45,
            "holeDepth": 1.1,
            "bagMass": 20
          },
          "expected": 15,
          "toleranceDecimalPlaces": 0,
          "unit": "sleepers",
          "confidence": "high",
          "steps": [
            {
              "label": "Courses of sleepers",
              "value": 5,
              "unit": "courses"
            },
            {
              "label": "Bays between posts, one sleeper a course in each",
              "value": 3,
              "unit": "bays"
            },
            {
              "label": "Sleepers cut to fit their bay",
              "value": 5,
              "unit": "sleepers"
            },
            {
              "label": "Last bay, post centre to post centre",
              "value": 77.95275590551184,
              "unit": "in"
            },
            {
              "label": "Height of the stacked courses",
              "value": 39.37007874015748,
              "unit": "in"
            },
            {
              "label": "Top course above the height entered, posts taken up to it",
              "value": 0,
              "unit": "in"
            },
            {
              "label": "Steel posts in all",
              "value": 4,
              "unit": "posts"
            },
            {
              "label": "End posts, C section",
              "value": 2,
              "unit": "posts"
            },
            {
              "label": "Intermediate posts, H section",
              "value": 2,
              "unit": "posts"
            },
            {
              "label": "Length of each post, stacked courses plus embedment",
              "value": 6.561679790026246,
              "unit": "ft"
            },
            {
              "label": "Concrete in each post hole",
              "value": 6.178210569047167,
              "unit": "ft³"
            },
            {
              "label": "Concrete for all the post holes",
              "value": 24.712842276188667,
              "unit": "ft³"
            },
            {
              "label": "Bags of pre-mixed concrete",
              "value": 75,
              "unit": "bags"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The maker's own calculator: 10 m of 600 mm wall in 2 m sleepers is 3 courses of 5",
          "inputs": {
            "wallLength": 10,
            "wallHeight": 0.6,
            "sleeperLength": 2,
            "sleeperHeight": 0.2,
            "postSpacing": 2.01,
            "embedment": 0.6,
            "holeDiameter": 0.45,
            "holeDepth": 0.7,
            "bagMass": 20
          },
          "expected": 15,
          "toleranceDecimalPlaces": 0,
          "unit": "sleepers",
          "confidence": "high",
          "steps": [
            {
              "label": "Courses of sleepers",
              "value": 3,
              "unit": "courses"
            },
            {
              "label": "Bays between posts, one sleeper a course in each",
              "value": 5,
              "unit": "bays"
            },
            {
              "label": "Sleepers cut to fit their bay",
              "value": 3,
              "unit": "sleepers"
            },
            {
              "label": "Last bay, post centre to post centre",
              "value": 77.1653543307087,
              "unit": "in"
            },
            {
              "label": "Height of the stacked courses",
              "value": 23.622047244094492,
              "unit": "in"
            },
            {
              "label": "Top course above the height entered, posts taken up to it",
              "value": 4.370956789862821e-15,
              "unit": "in"
            },
            {
              "label": "Steel posts in all",
              "value": 6,
              "unit": "posts"
            },
            {
              "label": "End posts, C section",
              "value": 2,
              "unit": "posts"
            },
            {
              "label": "Intermediate posts, H section",
              "value": 4,
              "unit": "posts"
            },
            {
              "label": "Length of each post, stacked courses plus embedment",
              "value": 3.9370078740157486,
              "unit": "ft"
            },
            {
              "label": "Concrete in each post hole",
              "value": 3.931588543939105,
              "unit": "ft³"
            },
            {
              "label": "Concrete for all the post holes",
              "value": 23.58953126363463,
              "unit": "ft³"
            },
            {
              "label": "Bags of pre-mixed concrete",
              "value": 72,
              "unit": "bags"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "2.4 m sleepers at 2,410 mm centres along 12 m of 0.9 m wall",
          "inputs": {
            "wallLength": 12,
            "wallHeight": 0.9,
            "sleeperLength": 2.4,
            "sleeperHeight": 0.2,
            "postSpacing": 2.41,
            "embedment": 1,
            "holeDiameter": 0.45,
            "holeDepth": 1.1,
            "bagMass": 20
          },
          "expected": 25,
          "toleranceDecimalPlaces": 0,
          "unit": "sleepers",
          "confidence": "high",
          "steps": [
            {
              "label": "Courses of sleepers",
              "value": 5,
              "unit": "courses"
            },
            {
              "label": "Bays between posts, one sleeper a course in each",
              "value": 5,
              "unit": "bays"
            },
            {
              "label": "Sleepers cut to fit their bay",
              "value": 5,
              "unit": "sleepers"
            },
            {
              "label": "Last bay, post centre to post centre",
              "value": 92.91338582677163,
              "unit": "in"
            },
            {
              "label": "Height of the stacked courses",
              "value": 39.37007874015748,
              "unit": "in"
            },
            {
              "label": "Top course above the height entered, posts taken up to it",
              "value": 3.9370078740157473,
              "unit": "in"
            },
            {
              "label": "Steel posts in all",
              "value": 6,
              "unit": "posts"
            },
            {
              "label": "End posts, C section",
              "value": 2,
              "unit": "posts"
            },
            {
              "label": "Intermediate posts, H section",
              "value": 4,
              "unit": "posts"
            },
            {
              "label": "Length of each post, stacked courses plus embedment",
              "value": 6.561679790026246,
              "unit": "ft"
            },
            {
              "label": "Concrete in each post hole",
              "value": 6.178210569047167,
              "unit": "ft³"
            },
            {
              "label": "Concrete for all the post holes",
              "value": 37.06926341428299,
              "unit": "ft³"
            },
            {
              "label": "Bags of pre-mixed concrete",
              "value": 113,
              "unit": "bags"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "sling-leg-tension-calculator",
      "title": "Sling Leg Tension and Angle Factor Calculator",
      "url": "https://craftquantities.com/calculators/heavy-civil/sling-leg-tension-calculator/",
      "sources": [
        "ASME B30.9, Slings — sling capacity is rated for the angle of use, and a multi-leg sling on a rigid load is not credited with sharing equally across more than two legs unless the arrangement is known to equalise",
        "Leg tension = vertical share ÷ sin(angle to horizontal); the load angle factor is 1 ÷ sin(angle), so a leg at 30 degrees carries twice the vertical load it supports",
        "Centre-of-gravity share: for lift points in symmetric pairs, the heavier side carries (0.5 + offset) of the load, where the offset is expressed as a fraction of the distance between the pairs"
      ],
      "vectors": [
        {
          "name": "2 t load on four legs at 60 degrees, centre of gravity central",
          "inputs": {
            "loadWeight": 2000,
            "legCount": "4",
            "slingAngle": 60,
            "cgOffset": 0
          },
          "expected": 5661.87,
          "toleranceDecimalPlaces": 1,
          "unit": "N",
          "confidence": "medium",
          "steps": [
            {
              "label": "Load angle factor at this sling angle",
              "value": 1.1547005383792517,
              "unit": "multiplier"
            },
            {
              "label": "Vertical share carried by the most heavily loaded leg",
              "value": 4903.325,
              "unit": "N"
            },
            {
              "label": "Tension if only two legs are credited",
              "value": 11323.744034696887,
              "unit": "N"
            },
            {
              "label": "Minimum rated capacity needed for each leg",
              "value": 1154.7005383792516,
              "unit": "kg"
            },
            {
              "label": "Sideways pull into the load at each attachment",
              "value": 2830.936008674222,
              "unit": "N"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "5 t load on two legs at 45 degrees with the centre of gravity 20% off",
          "inputs": {
            "loadWeight": 5000,
            "legCount": "2",
            "slingAngle": 45,
            "cgOffset": 20
          },
          "expected": 48540.44,
          "toleranceDecimalPlaces": 1,
          "unit": "N",
          "confidence": "high",
          "steps": [
            {
              "label": "Load angle factor at this sling angle",
              "value": 1.4142135623730951,
              "unit": "multiplier"
            },
            {
              "label": "Vertical share carried by the most heavily loaded leg",
              "value": 34323.275,
              "unit": "N"
            },
            {
              "label": "Tension if only two legs are credited",
              "value": 48540.4410100614,
              "unit": "N"
            },
            {
              "label": "Minimum rated capacity needed for each leg",
              "value": 4949.7474683058335,
              "unit": "kg"
            },
            {
              "label": "Sideways pull into the load at each attachment",
              "value": 34323.275,
              "unit": "N"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "slope-degrees-to-percent-calculator",
      "title": "Slope Degrees to Percent Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/slope-degrees-to-percent-calculator/",
      "sources": [
        "Gradient percentage = tan(angle) x 100"
      ],
      "vectors": [
        {
          "name": "5 ° converts correctly",
          "inputs": {
            "degrees": 5
          },
          "expected": 8.748866352592401,
          "toleranceDecimalPlaces": 6,
          "unit": "%",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "degrees": 50
          },
          "expected": 119.175359259421,
          "toleranceDecimalPlaces": 6,
          "unit": "%",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "slope-grade-calculator",
      "title": "Slope & Grade Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/slope-grade-calculator/",
      "sources": [
        "Grade percent = (rise / run) x 100; angle in degrees = arctangent(rise / run)"
      ],
      "vectors": [
        {
          "name": "1m rise over 12m run",
          "inputs": {
            "rise": 1,
            "run": 12
          },
          "expected": 8.333,
          "toleranceDecimalPlaces": 1,
          "unit": "%",
          "confidence": "high",
          "steps": [
            {
              "label": "Angle",
              "value": 4.763641690726177,
              "unit": "degrees"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "0.5m rise over 2m run",
          "inputs": {
            "rise": 0.5,
            "run": 2
          },
          "expected": 25,
          "toleranceDecimalPlaces": 0,
          "unit": "%",
          "confidence": "high",
          "steps": [
            {
              "label": "Angle",
              "value": 14.036243467926479,
              "unit": "degrees"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "slope-percent-to-degrees-calculator",
      "title": "Slope Percent to Degrees Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/slope-percent-to-degrees-calculator/",
      "sources": [
        "Slope percentage = (rise / run) x 100; angle = arctan(rise / run)",
        "ADA maximum running slope for a ramp is 1:12, which is 8.33% or about 4.76 degrees"
      ],
      "vectors": [
        {
          "name": "2 % converts correctly",
          "inputs": {
            "percent": 2
          },
          "expected": 1.1457628381751035,
          "toleranceDecimalPlaces": 6,
          "unit": "°",
          "confidence": "high",
          "steps": [],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "percent": 20
          },
          "expected": 11.309932474020213,
          "toleranceDecimalPlaces": 6,
          "unit": "°",
          "confidence": "high",
          "steps": [],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "slurry-pressure-balance-calculator",
      "title": "Drilled Shaft Slurry Pressure Balance Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/slurry-pressure-balance-calculator/",
      "sources": [
        "Slurry-supported excavation stability requires the slurry column's hydrostatic pressure to exceed the surrounding groundwater pressure at every depth, preventing borehole wall collapse or inflow"
      ],
      "vectors": [
        {
          "name": "15m depth, 10.5 kN/m³ slurry, 0.5m surface, 3m groundwater (stable)",
          "inputs": {
            "depthOfInterest": 15,
            "slurryUnitWeight": 10.5,
            "slurrySurfaceDepth": 0.5,
            "groundwaterTableDepth": 3
          },
          "expected": 34.53,
          "toleranceDecimalPlaces": 2,
          "unit": "kPa",
          "confidence": "medium",
          "steps": [
            {
              "label": "Slurry column pressure",
              "value": 152.25,
              "unit": "kPa"
            },
            {
              "label": "Groundwater column pressure",
              "value": 117.72,
              "unit": "kPa"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "10m depth, 10.2 kN/m³ slurry, 2m surface, 1m groundwater (unstable)",
          "inputs": {
            "depthOfInterest": 10,
            "slurryUnitWeight": 10.2,
            "slurrySurfaceDepth": 2,
            "groundwaterTableDepth": 1
          },
          "expected": -6.69,
          "toleranceDecimalPlaces": 2,
          "unit": "kPa",
          "confidence": "low",
          "steps": [
            {
              "label": "Slurry column pressure",
              "value": 81.6,
              "unit": "kPa"
            },
            {
              "label": "Groundwater column pressure",
              "value": 88.29,
              "unit": "kPa"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "smoke-detector-calculator",
      "title": "Smoke Detector Placement Calculator",
      "url": "https://craftquantities.com/calculators/electrical/smoke-detector-calculator/",
      "sources": [
        "Common simplified NFPA 72-based guideline: one detector inside every bedroom, one outside each sleeping area, and one on every level of the home (including basements)"
      ],
      "vectors": [
        {
          "name": "3 bedrooms, 2 floors",
          "inputs": {
            "bedrooms": 3,
            "floors": 2
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "detectors (minimum)",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "4 bedrooms, 3 floors",
          "inputs": {
            "bedrooms": 4,
            "floors": 3
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "detectors (minimum)",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "snow-guard-spacing-calculator",
      "title": "Metal Roof Snow Guard Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/snow-guard-spacing-calculator/",
      "sources": [
        "Snow guards per row = ceil(eave width ÷ guard spacing) + 1; total = guards per row × number of rows, following standard snow retention device layout practice for multi-row systems on steep metal roofs"
      ],
      "vectors": [
        {
          "name": "12m eave, 0.6m spacing, 2 rows",
          "inputs": {
            "eaveWidth": 12,
            "guardSpacing": 0.6,
            "numberOfRows": 2
          },
          "expected": 42,
          "toleranceDecimalPlaces": 0,
          "unit": "snow guards",
          "confidence": "high",
          "steps": [
            {
              "label": "Guards per row",
              "value": 21
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15m eave, 0.5m spacing, 3 rows",
          "inputs": {
            "eaveWidth": 15,
            "guardSpacing": 0.5,
            "numberOfRows": 3
          },
          "expected": 93,
          "toleranceDecimalPlaces": 0,
          "unit": "snow guards",
          "confidence": "high",
          "steps": [
            {
              "label": "Guards per row",
              "value": 31
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "snow-weight-calculator",
      "title": "Snow Weight Calculator — What the Snow on a Roof Weighs",
      "url": "https://craftquantities.com/calculators/materials-quantities/snow-weight-calculator/",
      "sources": [
        "National Research Council of Canada, National Building Code of Canada 2020, Division B, Appendix C, Climatic and Seismic Information, Snow Loads: \"The specific weight of old snow generally ranges from 2 to 5 kN/m3, and it is usually assumed in Canada that 1 kN/m3 is the average for new snow\"; the seasonal snowpack averages 2.01 kN/m3 east of the continental divide (2.94 kN/m3 north of the treeline) and ranges from 2.55 to 4.21 kN/m3 west of it",
        "National Building Code of Canada 2020, Note A-9.4.2.1.(1): values of the specific weight of snow on roofs measured at weather stations across Canada ranged from about 1.0 to 4.5 kN/m3, with an average of approximately 3.0 kN/m3; Article 4.1.6.13 takes the specific weight of snow in drifts as 4.0 kN/m3 or 0.43 Ss + 2.2 kN/m3, whichever is lesser, for design"
      ],
      "vectors": [
        {
          "name": "Opening: 50 cm of roof snow at 3.0 kN/m³",
          "inputs": {
            "snowDepth": 0.5,
            "snowType": "roof",
            "customWeight": 3,
            "roofArea": 100
          },
          "expected": 1.5,
          "toleranceDecimalPlaces": 3,
          "unit": "kN/m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Snow on the whole roof, by mass",
              "value": 15.295743194668924,
              "unit": "t"
            },
            {
              "label": "The same weight as a depth of water",
              "value": 152.95743194668924,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A foot of new snow at 1.0 kN/m³",
          "inputs": {
            "snowDepth": 0.3048,
            "snowType": "new",
            "customWeight": 3,
            "roofArea": 100
          },
          "expected": 0.3048,
          "toleranceDecimalPlaces": 3,
          "unit": "kN/m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Snow on the whole roof, by mass",
              "value": 3.1080950171567254,
              "unit": "t"
            },
            {
              "label": "The same weight as a depth of water",
              "value": 31.080950171567256,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Half a metre of seasonal snowpack east of the continental divide, 2.01 kN/m³",
          "inputs": {
            "snowDepth": 0.5,
            "snowType": "seasonal",
            "customWeight": 3,
            "roofArea": 100
          },
          "expected": 1.005,
          "toleranceDecimalPlaces": 6,
          "unit": "kN/m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Snow on the whole roof, by mass",
              "value": 10.248147940428177,
              "unit": "t"
            },
            {
              "label": "The same weight as a depth of water",
              "value": 102.48147940428179,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Half a metre of old snow at the heavy end of the NBC's range, 5 kN/m³",
          "inputs": {
            "snowDepth": 0.5,
            "snowType": "old",
            "customWeight": 3,
            "roofArea": 100
          },
          "expected": 2.5,
          "toleranceDecimalPlaces": 6,
          "unit": "kN/m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Snow on the whole roof, by mass",
              "value": 25.49290532444821,
              "unit": "t"
            },
            {
              "label": "The same weight as a depth of water",
              "value": 254.92905324448205,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Half a metre at 4.5 kN/m³, the heaviest roof snow the NBC reports measured",
          "inputs": {
            "snowDepth": 0.5,
            "snowType": "custom",
            "customWeight": 4.5,
            "roofArea": 100
          },
          "expected": 2.25,
          "toleranceDecimalPlaces": 6,
          "unit": "kN/m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Snow on the whole roof, by mass",
              "value": 22.943614792003387,
              "unit": "t"
            },
            {
              "label": "The same weight as a depth of water",
              "value": 229.43614792003387,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "soakaway-infiltration-rate-calculator",
      "title": "Soakaway Infiltration Rate Calculator (BRE 365 Trial Pit)",
      "url": "https://craftquantities.com/calculators/materials-quantities/soakaway-infiltration-rate-calculator/",
      "sources": [
        "BRE Digest 365 Soakaway design: the soil infiltration rate f = Vp75–25 ÷ (ap50 × tp75–25), where Vp75–25 is the volume of water in the pit between 75% and 25% of the effective depth, ap50 the internal surface area of the pit up to 50% of the effective depth including the base, and tp75–25 the time for the level to fall from 75% to 25%; the pit is filled three times and the lowest rate is used"
      ],
      "vectors": [
        {
          "name": "The soakaway guide's pit: 1.5 × 0.5 m, 1.0 m effective, slowest fill 11 h 50 min",
          "inputs": {
            "pitLength": 1.5,
            "pitWidth": 0.5,
            "effectiveDepth": 1,
            "fill1Minutes": 580,
            "fill2Minutes": 660,
            "fill3Minutes": 710
          },
          "expected": 11.5237,
          "toleranceDecimalPlaces": 3,
          "unit": "mm/h",
          "confidence": "high",
          "steps": [
            {
              "label": "Water lost between the 75% and 25% marks",
              "value": 0.375,
              "unit": "m³"
            },
            {
              "label": "Wetted area to half depth, base included",
              "value": 2.75,
              "unit": "m²"
            },
            {
              "label": "Slowest fill, 75% to 25%",
              "value": 710,
              "unit": "min"
            },
            {
              "label": "Rate from fill 1",
              "value": 14.106583072100316,
              "unit": "mm/h"
            },
            {
              "label": "Rate from fill 2",
              "value": 12.396694214876034,
              "unit": "mm/h"
            },
            {
              "label": "Rate from fill 3",
              "value": 11.523687580025609,
              "unit": "mm/h"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "One fill of two hours in a 2.0 × 0.6 m pit, 1.2 m deep",
          "inputs": {
            "pitLength": 2,
            "pitWidth": 0.6,
            "effectiveDepth": 1.2,
            "fill1Minutes": 120,
            "fill2Minutes": 0,
            "fill3Minutes": 0
          },
          "expected": 83.3333,
          "toleranceDecimalPlaces": 3,
          "unit": "mm/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Water lost between the 75% and 25% marks",
              "value": 0.72,
              "unit": "m³"
            },
            {
              "label": "Wetted area to half depth, base included",
              "value": 4.32,
              "unit": "m²"
            },
            {
              "label": "Slowest fill, 75% to 25%",
              "value": 120,
              "unit": "min"
            },
            {
              "label": "Rate from fill 1",
              "value": 83.33333333333331,
              "unit": "mm/h"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "soakaway-storage-half-emptying-calculator",
      "title": "Soakaway Storage and Half-Emptying Time Calculator (BRE 365)",
      "url": "https://craftquantities.com/calculators/materials-quantities/soakaway-storage-half-emptying-calculator/",
      "sources": [
        "BRE Digest 365 Soakaway design: inflow I = impermeable area × rainfall depth for each storm duration D; outflow O = as50 × f × D, where as50 is the internal surface area of the soakaway to 50% of its effective storage depth, excluding the base; the storage required is the largest I − O over the durations tested; the time to half empty ts50 = 0.5 × storage volume ÷ (as50 × f), usually required within 24 hours"
      ],
      "vectors": [
        {
          "name": "The soakaway guide's trench: 46 m², 3.2 × 10⁻⁶ m/s, 4.0 × 0.5 × 1.2 m of crates",
          "inputs": {
            "impermeableArea": 46,
            "infiltrationRate": 11.52,
            "storeLength": 4,
            "storeWidth": 0.5,
            "storeDepth": 1.2,
            "voidRatio": 0.95,
            "duration1": 15,
            "depth1": 0.012,
            "duration2": 60,
            "depth2": 0.022,
            "duration3": 360,
            "depth3": 0.04,
            "duration4": 1440,
            "depth4": 0.065,
            "duration5": 2880,
            "depth5": 0.08,
            "duration6": 0,
            "depth6": 0,
            "duration7": 0,
            "depth7": 0,
            "duration8": 0,
            "depth8": 0
          },
          "expected": 1.497,
          "toleranceDecimalPlaces": 3,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Storage the store provides",
              "value": 2.28,
              "unit": "m³"
            },
            {
              "label": "Critical storm duration",
              "value": 1440,
              "unit": "min"
            },
            {
              "label": "Inflow over the critical storm",
              "value": 2.99,
              "unit": "m³"
            },
            {
              "label": "Outflow over the critical storm",
              "value": 1.4929919999999997,
              "unit": "m³"
            },
            {
              "label": "Side area to half depth (base excluded)",
              "value": 5.3999999999999995,
              "unit": "m²"
            },
            {
              "label": "Time to empty to half",
              "value": 18.32561728395062,
              "unit": "hours"
            },
            {
              "label": "Time the Digest asks for, at most",
              "value": 24,
              "unit": "hours"
            },
            {
              "label": "Plan area ÷ perimeter",
              "value": 0.2222222222222222,
              "unit": "m"
            },
            {
              "label": "Largest plan area ÷ perimeter that half-empties in 24 hours",
              "value": 0.2910315789473684,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "The same roof on the guide's first, compact box: 2.0 × 1.2 × 1.2 m",
          "inputs": {
            "impermeableArea": 46,
            "infiltrationRate": 11.52,
            "storeLength": 2,
            "storeWidth": 1.2,
            "storeDepth": 1.2,
            "voidRatio": 0.95,
            "duration1": 15,
            "depth1": 0.012,
            "duration2": 60,
            "depth2": 0.022,
            "duration3": 360,
            "depth3": 0.04,
            "duration4": 1440,
            "depth4": 0.065,
            "duration5": 2880,
            "depth5": 0.08,
            "duration6": 0,
            "depth6": 0,
            "duration7": 0,
            "depth7": 0,
            "duration8": 0,
            "depth8": 0
          },
          "expected": 1.9283,
          "toleranceDecimalPlaces": 3,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Storage the store provides",
              "value": 2.7359999999999998,
              "unit": "m³"
            },
            {
              "label": "Critical storm duration",
              "value": 1440,
              "unit": "min"
            },
            {
              "label": "Inflow over the critical storm",
              "value": 2.99,
              "unit": "m³"
            },
            {
              "label": "Outflow over the critical storm",
              "value": 1.0616831999999998,
              "unit": "m³"
            },
            {
              "label": "Side area to half depth (base excluded)",
              "value": 3.84,
              "unit": "m²"
            },
            {
              "label": "Time to empty to half",
              "value": 30.924479166666668,
              "unit": "hours"
            },
            {
              "label": "Time the Digest asks for, at most",
              "value": 24,
              "unit": "hours"
            },
            {
              "label": "Plan area ÷ perimeter",
              "value": 0.37499999999999994,
              "unit": "m"
            },
            {
              "label": "Largest plan area ÷ perimeter that half-empties in 24 hours",
              "value": 0.2910315789473684,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Shropshire Council's BRE 365 example: 125 m², 3.3 × 10⁻⁵ m/s, 2.4 × 2.12 × 1.5 m of stone at 30%",
          "inputs": {
            "impermeableArea": 125,
            "infiltrationRate": 118.8,
            "storeLength": 2.4,
            "storeWidth": 2.12,
            "storeDepth": 1.5,
            "voidRatio": 0.3,
            "duration1": 10,
            "depth1": 0.0127,
            "duration2": 15,
            "depth2": 0.0155,
            "duration3": 30,
            "depth3": 0.0198,
            "duration4": 60,
            "depth4": 0.0248,
            "duration5": 120,
            "depth5": 0.03,
            "duration6": 240,
            "depth6": 0.0356,
            "duration7": 360,
            "depth7": 0.0392,
            "duration8": 600,
            "depth8": 0.0433
          },
          "expected": 2.2945,
          "toleranceDecimalPlaces": 3,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Storage the store provides",
              "value": 2.2895999999999996,
              "unit": "m³"
            },
            {
              "label": "Critical storm duration",
              "value": 60,
              "unit": "min"
            },
            {
              "label": "Inflow over the critical storm",
              "value": 3.1,
              "unit": "m³"
            },
            {
              "label": "Outflow over the critical storm",
              "value": 0.8054639999999997,
              "unit": "m³"
            },
            {
              "label": "Side area to half depth (base excluded)",
              "value": 6.779999999999999,
              "unit": "m²"
            },
            {
              "label": "Time to empty to half",
              "value": 1.42129257173505,
              "unit": "hours"
            },
            {
              "label": "Time the Digest asks for, at most",
              "value": 24,
              "unit": "hours"
            },
            {
              "label": "Plan area ÷ perimeter",
              "value": 0.5628318584070797,
              "unit": "m"
            },
            {
              "label": "Largest plan area ÷ perimeter that half-empties in 24 hours",
              "value": 9.504,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "sod-calculator",
      "title": "Sod Calculator",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/sod-calculator/",
      "sources": [
        "Standard sod pieces cover 9-10 sq ft each; coverage per pallet varies by supplier and is printed on the delivery ticket"
      ],
      "vectors": [
        {
          "name": "10x8m lawn, 450 sqft/pallet",
          "inputs": {
            "lawnLength": 10,
            "lawnWidth": 8,
            "coveragePerPalletSqft": 41.806368,
            "wasteFactorPercent": 5
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "pallets",
          "confidence": "high",
          "steps": [
            {
              "label": "Lawn area",
              "value": 861.1128333367777,
              "unit": "sq ft"
            },
            {
              "label": "Area with waste",
              "value": 904.1684750036167,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "20x15m lawn, 500 sqft/pallet",
          "inputs": {
            "lawnLength": 20,
            "lawnWidth": 15,
            "coveragePerPalletSqft": 46.45152,
            "wasteFactorPercent": 5
          },
          "expected": 7,
          "toleranceDecimalPlaces": 0,
          "unit": "pallets",
          "confidence": "high",
          "steps": [
            {
              "label": "Lawn area",
              "value": 3229.1731250129164,
              "unit": "sq ft"
            },
            {
              "label": "Area with waste",
              "value": 3390.6317812635625,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "sod-staple-calculator",
      "title": "Sod Staple Calculator",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/sod-staple-calculator/",
      "sources": [
        "A commonly cited rate for securing sod on slopes is approximately 1 staple per 5 sq ft"
      ],
      "vectors": [
        {
          "name": "50m² sod area",
          "inputs": {
            "sodArea": 50
          },
          "expected": 108,
          "toleranceDecimalPlaces": 0,
          "unit": "staples",
          "confidence": "low",
          "steps": [
            {
              "label": "Area",
              "value": 538.195520835486,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "100m² sod area",
          "inputs": {
            "sodArea": 100
          },
          "expected": 216,
          "toleranceDecimalPlaces": 0,
          "unit": "staples",
          "confidence": "low",
          "steps": [
            {
              "label": "Area",
              "value": 1076.391041670972,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "soffit-bulkhead-wrap-area-calculator",
      "title": "Soffit/Bulkhead Drywall Wrap Area Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/soffit-bulkhead-wrap-area-calculator/",
      "sources": [
        "Wrap area = 2 × (depth × length) for the two side faces + (bottom width × length) for the bottom face, assuming the top of the soffit is closed against the structure above"
      ],
      "vectors": [
        {
          "name": "6m length, 0.3m depth, 0.4m bottom",
          "inputs": {
            "length": 6,
            "depth": 0.3,
            "bottomWidth": 0.4
          },
          "expected": 6,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "8m length, 0.25m depth, 0.35m bottom",
          "inputs": {
            "length": 8,
            "depth": 0.25,
            "bottomWidth": 0.35
          },
          "expected": 6.8,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "soffit-panel-calculator",
      "title": "Soffit Panel Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/soffit-panel-calculator/",
      "sources": [
        "Standard vented vinyl/aluminum soffit panel in North America is 12 in wide x 12 ft long (12 sq ft); panel count = overhang area / 12, rounded up with a waste allowance. Metric markets sell soffit as board in a range of widths rather than in one fixed panel size, so the metric answer is reported as an area of board"
      ],
      "vectors": [
        {
          "name": "15m eave, 18in overhang",
          "inputs": {
            "eaveLength": 15,
            "overhangWidth": 0.457
          },
          "expected": 7,
          "toleranceDecimalPlaces": 0,
          "unit": "x 12 sq ft panels",
          "confidence": "high",
          "steps": [
            {
              "label": "Overhang area (with waste)",
              "value": 81.16526649719965,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30m eave, 0.6m overhang",
          "inputs": {
            "eaveLength": 30,
            "overhangWidth": 0.6
          },
          "expected": 18,
          "toleranceDecimalPlaces": 0,
          "unit": "x 12 sq ft panels",
          "confidence": "high",
          "steps": [
            {
              "label": "Overhang area (with waste)",
              "value": 213.12542625085248,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30m eave, 0.6m overhang, no waste",
          "inputs": {
            "eaveLength": 30,
            "overhangWidth": 0.6,
            "wastePercent": 0
          },
          "expected": 17,
          "toleranceDecimalPlaces": 0,
          "unit": "x 12 sq ft panels",
          "confidence": "high",
          "steps": [
            {
              "label": "Overhang area (with waste)",
              "value": 193.75038750077496,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "soil-nail-pullout-calculator",
      "title": "Soil Nail Pull-Out Safety Factor Calculator",
      "url": "https://craftquantities.com/calculators/heavy-civil/soil-nail-pullout-calculator/",
      "sources": [
        "FHWA GEC No. 7 soil nail wall design: pullout capacity = nominal bond strength x pi x drill hole diameter x bonded length; a minimum pullout safety factor of 2.0 is standard practice"
      ],
      "vectors": [
        {
          "name": "qs=100kPa, 0.15m hole, 6m bonded, 80kN load (pass)",
          "inputs": {
            "bondStrength": 100000,
            "holeDiameter": 0.15,
            "bondedLength": 6,
            "designLoad": 80000
          },
          "expected": 3.53,
          "toleranceDecimalPlaces": 1,
          "unit": "(target ≥2.0)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Pullout capacity",
              "value": 282.7433388230814,
              "unit": "kN"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "qs=80kPa, 0.1m hole, 4m bonded, 100kN load (fail)",
          "inputs": {
            "bondStrength": 80000,
            "holeDiameter": 0.1,
            "bondedLength": 4,
            "designLoad": 100000
          },
          "expected": 1.01,
          "toleranceDecimalPlaces": 1,
          "unit": "(target ≥2.0)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Pullout capacity",
              "value": 100.53096491487338,
              "unit": "kN"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "soil-phase-relationships-calculator",
      "title": "Soil Phase Relationships Calculator (Unit Weights and Degree of Saturation)",
      "url": "https://craftquantities.com/calculators/materials-quantities/soil-phase-relationships-calculator/",
      "sources": [
        "Phase relationships of a soil element of solids, water and air: void ratio e = Gs·γw/γd − 1, porosity n = e/(1 + e), degree of saturation S = w·Gs/e, moist unit weight γ = γd(1 + w), saturated unit weight γsat = (Gs + e)·γw/(1 + e) and buoyant unit weight γ′ = γsat − γw (Craig's Soil Mechanics, chapter 1; the quantities as BS 1377-2 and ASTM D7263 define them)"
      ],
      "vectors": [
        {
          "name": "BH-3 from the soil report guide: γd 16.28 kN/m³, w 18.4%, Gs 2.68",
          "inputs": {
            "dryUnitWeight": 16.28,
            "waterContent": 18.4,
            "specificGravity": 2.68
          },
          "expected": 19.2755,
          "toleranceDecimalPlaces": 3,
          "unit": "kN/m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Void ratio (e)",
              "value": 0.6149140049140052
            },
            {
              "label": "Porosity (n)",
              "value": 38.07719810732272,
              "unit": "%"
            },
            {
              "label": "Degree of saturation (S)",
              "value": 80.19332720661683,
              "unit": "%"
            },
            {
              "label": "Air voids",
              "value": 7.541826038005703,
              "unit": "%"
            },
            {
              "label": "Dry unit weight",
              "value": 16.28,
              "unit": "kN/m³"
            },
            {
              "label": "Saturated unit weight",
              "value": 20.01537313432836,
              "unit": "kN/m³"
            },
            {
              "label": "Buoyant (submerged) unit weight",
              "value": 10.20537313432836,
              "unit": "kN/m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "A fully saturated specimen reads the same moist and saturated",
          "inputs": {
            "dryUnitWeight": 15,
            "waterContent": 28.363,
            "specificGravity": 2.7
          },
          "expected": 19.2545,
          "toleranceDecimalPlaces": 3,
          "unit": "kN/m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Void ratio (e)",
              "value": 0.7658
            },
            {
              "label": "Porosity (n)",
              "value": 43.368444897496886,
              "unit": "%"
            },
            {
              "label": "Degree of saturation (S)",
              "value": 100.00013058239749,
              "unit": "%"
            },
            {
              "label": "Air voids",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Dry unit weight",
              "value": 15,
              "unit": "kN/m³"
            },
            {
              "label": "Saturated unit weight",
              "value": 19.254444444444445,
              "unit": "kN/m³"
            },
            {
              "label": "Buoyant (submerged) unit weight",
              "value": 9.444444444444445,
              "unit": "kN/m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Dry soil weighs its dry unit weight",
          "inputs": {
            "dryUnitWeight": 17.5,
            "waterContent": 0,
            "specificGravity": 2.65
          },
          "expected": 17.5,
          "toleranceDecimalPlaces": 3,
          "unit": "kN/m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Void ratio (e)",
              "value": 0.4855142857142858
            },
            {
              "label": "Porosity (n)",
              "value": 32.6832458215529,
              "unit": "%"
            },
            {
              "label": "Degree of saturation (S)",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Air voids",
              "value": 32.6832458215529,
              "unit": "%"
            },
            {
              "label": "Dry unit weight",
              "value": 17.5,
              "unit": "kN/m³"
            },
            {
              "label": "Saturated unit weight",
              "value": 20.70622641509434,
              "unit": "kN/m³"
            },
            {
              "label": "Buoyant (submerged) unit weight",
              "value": 10.896226415094338,
              "unit": "kN/m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "An impossible specimen still returns the formula's figure, flagged",
          "inputs": {
            "dryUnitWeight": 18.5,
            "waterContent": 25,
            "specificGravity": 2.65
          },
          "expected": 23.125,
          "toleranceDecimalPlaces": 3,
          "unit": "kN/m³",
          "confidence": "low",
          "steps": [
            {
              "label": "Void ratio (e)",
              "value": 0.4052162162162163
            },
            {
              "label": "Porosity (n)",
              "value": 28.836574154213068,
              "unit": "%"
            },
            {
              "label": "Degree of saturation (S)",
              "value": 163.492963382912,
              "unit": "%"
            },
            {
              "label": "Air voids",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Dry unit weight",
              "value": 18.5,
              "unit": "kN/m³"
            },
            {
              "label": "Saturated unit weight",
              "value": 21.328867924528303,
              "unit": "kN/m³"
            },
            {
              "label": "Buoyant (submerged) unit weight",
              "value": 11.518867924528303,
              "unit": "kN/m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "soil-relative-density-calculator",
      "title": "Soil Relative Density Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/soil-relative-density-calculator/",
      "sources": [
        "Standard relative density formula: Dr = (emax − e) / (emax − emin) x 100%, where emax and emin are determined from standard maximum/minimum density lab tests (ASTM D4253/D4254)"
      ],
      "vectors": [
        {
          "name": "emax=0.85, emin=0.45, e=0.6",
          "inputs": {
            "maxVoidRatio": 0.85,
            "minVoidRatio": 0.45,
            "fieldVoidRatio": 0.6
          },
          "expected": 62.5,
          "toleranceDecimalPlaces": 1,
          "unit": "%",
          "confidence": "high",
          "steps": [
            {
              "label": "Field void ratio",
              "value": 0.6
            },
            {
              "label": "Range between emin and emax",
              "value": 0.39999999999999997
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "emax=0.9, emin=0.5, e=0.55",
          "inputs": {
            "maxVoidRatio": 0.9,
            "minVoidRatio": 0.5,
            "fieldVoidRatio": 0.55
          },
          "expected": 87.5,
          "toleranceDecimalPlaces": 1,
          "unit": "%",
          "confidence": "high",
          "steps": [
            {
              "label": "Field void ratio",
              "value": 0.55
            },
            {
              "label": "Range between emin and emax",
              "value": 0.4
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "an organic soil above the old 1.5 cap comes through unclamped",
          "inputs": {
            "maxVoidRatio": 2.4,
            "minVoidRatio": 1.2,
            "fieldVoidRatio": 1.845
          },
          "expected": 46.25,
          "toleranceDecimalPlaces": 1,
          "unit": "%",
          "confidence": "high",
          "steps": [
            {
              "label": "Field void ratio",
              "value": 1.845
            },
            {
              "label": "Range between emin and emax",
              "value": 1.2
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "a field void ratio above emax is not a negative density",
          "inputs": {
            "maxVoidRatio": 1.5,
            "minVoidRatio": 0.45,
            "fieldVoidRatio": 1.845
          },
          "expected": -32.86,
          "toleranceDecimalPlaces": 1,
          "unit": "%",
          "confidence": "low",
          "steps": [
            {
              "label": "Field void ratio",
              "value": 1.845
            },
            {
              "label": "Range between emin and emax",
              "value": 1.05
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "soil-swell-shrinkage-calculator",
      "title": "Soil Swell & Shrinkage Haul Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/soil-swell-shrinkage-calculator/",
      "sources": [
        "Standard earthwork volume states: loose (haul) volume = bank volume x (1 + swell%); compacted volume = bank volume x (1 + shrinkage%), where shrinkage is typically expressed as a negative percentage"
      ],
      "vectors": [
        {
          "name": "100m³ bank, 25% swell, -10% shrinkage",
          "inputs": {
            "bankVolume": 100000,
            "swellFactorPercent": 25,
            "shrinkageFactorPercent": -10
          },
          "expected": 125,
          "toleranceDecimalPlaces": 0,
          "unit": "m³ (loose)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Bank (in-situ) volume",
              "value": 100,
              "unit": "m³"
            },
            {
              "label": "Compacted (recompacted) volume",
              "value": 90,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "250m³ bank, 30% swell, -15% shrinkage",
          "inputs": {
            "bankVolume": 250000,
            "swellFactorPercent": 30,
            "shrinkageFactorPercent": -15
          },
          "expected": 325,
          "toleranceDecimalPlaces": 0,
          "unit": "m³ (loose)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Bank (in-situ) volume",
              "value": 250,
              "unit": "m³"
            },
            {
              "label": "Compacted (recompacted) volume",
              "value": 212.5,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "soil-unit-weight-specific-gravity-calculator",
      "title": "Soil Unit Weight from Specific Gravity Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/soil-unit-weight-specific-gravity-calculator/",
      "sources": [
        "Standard soil phase relationships: dry unit weight γd = Gs x γw / (1 + e); saturated unit weight γsat = (Gs + e) x γw / (1 + e), where Gs is specific gravity of solids, e is void ratio, and γw is the unit weight of water"
      ],
      "vectors": [
        {
          "name": "Gs=2.65, e=0.6",
          "inputs": {
            "specificGravity": 2.65,
            "voidRatio": 0.6
          },
          "expected": 16.25,
          "toleranceDecimalPlaces": 1,
          "unit": "kN/m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Saturated unit weight",
              "value": 19.9265625,
              "unit": "kN/m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Gs=2.70, e=0.5",
          "inputs": {
            "specificGravity": 2.7,
            "voidRatio": 0.5
          },
          "expected": 17.66,
          "toleranceDecimalPlaces": 1,
          "unit": "kN/m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Saturated unit weight",
              "value": 20.928,
              "unit": "kN/m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "e=1.845 from the void ratio calculator, which the 1.5 cap used to rewrite",
          "inputs": {
            "specificGravity": 2.65,
            "voidRatio": 1.845
          },
          "expected": 9.14,
          "toleranceDecimalPlaces": 1,
          "unit": "kN/m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Saturated unit weight",
              "value": 15.499455184534273,
              "unit": "kN/m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "soil-void-ratio-calculator",
      "title": "Soil Void Ratio Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/soil-void-ratio-calculator/",
      "sources": [
        "Standard soil phase relationship: void ratio e = (Gs x γw / γd) − 1, where Gs is specific gravity of solids, γw is the unit weight of water, and γd is the soil's dry unit weight"
      ],
      "vectors": [
        {
          "name": "Gs=2.65, γd=16.5",
          "inputs": {
            "specificGravity": 2.65,
            "dryUnitWeight": 16.5
          },
          "expected": 0.576,
          "toleranceDecimalPlaces": 2,
          "unit": "(e)",
          "confidence": "high",
          "steps": [
            {
              "label": "Equivalent porosity",
              "value": 36.529917488892735,
              "unit": "%"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Gs=2.70, γd=17.66",
          "inputs": {
            "specificGravity": 2.7,
            "dryUnitWeight": 17.66
          },
          "expected": 0.5,
          "toleranceDecimalPlaces": 2,
          "unit": "(e)",
          "confidence": "high",
          "steps": [
            {
              "label": "Equivalent porosity",
              "value": 33.325782459319676,
              "unit": "%"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "solar-mount-ballast-calculator",
      "title": "Solar Panel Roof Mount Wind Uplift Ballast Calculator",
      "url": "https://craftquantities.com/calculators/solar-energy/solar-mount-ballast-calculator/",
      "sources": [
        "Uplift force = wind uplift pressure × array area; required ballast mass = uplift force ÷ gravitational acceleration × a safety factor, the standard method for sizing ballast counterweight against calculated wind uplift"
      ],
      "vectors": [
        {
          "name": "1.2kPa, 50m² array, 1.5 SF",
          "inputs": {
            "windUpliftPressure": 1200,
            "arrayArea": 50,
            "safetyFactor": 1.5
          },
          "expected": 9174.31,
          "toleranceDecimalPlaces": -1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total wind uplift force",
              "value": 60000,
              "unit": "N"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1.0kPa, 60m² array, 1.4 SF",
          "inputs": {
            "windUpliftPressure": 1000,
            "arrayArea": 60,
            "safetyFactor": 1.4
          },
          "expected": 8562.69,
          "toleranceDecimalPlaces": -1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total wind uplift force",
              "value": 60000,
              "unit": "N"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "solar-panel-array-sizing-calculator",
      "title": "Solar Panel Array Sizing Calculator",
      "url": "https://craftquantities.com/calculators/solar-energy/solar-panel-array-sizing-calculator/",
      "sources": [
        "Panels needed = daily energy target (Wh) / (panel wattage x average daily sun hours x system efficiency)"
      ],
      "vectors": [
        {
          "name": "10 kWh/day target, 400W panels, 5 sun hours, 80% efficiency",
          "inputs": {
            "dailyKwhTarget": 10,
            "panelWattage": 400,
            "avgSunHours": 5,
            "systemEfficiencyPercent": 80
          },
          "expected": 7,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "medium",
          "steps": [
            {
              "label": "Estimated daily output per panel",
              "value": 1600,
              "unit": "Wh"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "20 kWh/day target, 350W panels, 6 sun hours, 75% efficiency",
          "inputs": {
            "dailyKwhTarget": 20,
            "panelWattage": 350,
            "avgSunHours": 6,
            "systemEfficiencyPercent": 75
          },
          "expected": 13,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "medium",
          "steps": [
            {
              "label": "Estimated daily output per panel",
              "value": 1575,
              "unit": "Wh"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "solar-payback-period-calculator",
      "title": "Solar Payback Period Calculator",
      "url": "https://craftquantities.com/calculators/solar-energy/solar-payback-period-calculator/",
      "sources": [
        "Simple payback period (years) = total system cost / annual energy cost savings"
      ],
      "vectors": [
        {
          "name": "$15,000 system, $1,500/year savings",
          "inputs": {
            "systemCost": 15000,
            "annualEnergySavings": 1500
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "years",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "$20,000 system, $1,800/year savings",
          "inputs": {
            "systemCost": 20000,
            "annualEnergySavings": 1800
          },
          "expected": 11.111,
          "toleranceDecimalPlaces": 3,
          "unit": "years",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "solar-pool-heater-collector-calculator",
      "title": "Solar Pool Heater Collector Size Calculator",
      "url": "https://craftquantities.com/calculators/pools-water/solar-pool-heater-collector-calculator/",
      "sources": [
        "US Department of Energy, Heat Your Water with the Sun — A Consumer's Guide (DOE/GO-102003-1824, December 2003): solar pool heating requires a collector of 50% to 100% of the pool's surface area; a 15 by 30 ft Florida pool used year round typically takes 100%, 450 sq ft of unglazed flat-plate collectors; northern California pools used 6 to 8 months a year are typically sized at 60% to 70%"
      ],
      "vectors": [
        {
          "name": "The guide's Florida example: 15 by 30 ft, year round, is 450 sq ft",
          "inputs": {
            "poolLength": 9.144,
            "poolWidth": 4.572,
            "share": "100"
          },
          "expected": 450,
          "toleranceDecimalPlaces": 3,
          "unit": "sq ft",
          "confidence": "medium",
          "steps": [
            {
              "label": "Pool surface",
              "value": 449.99999999999994,
              "unit": "sq ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A 10 by 5 m pool for a 6-to-8-month season, lower end: 30 m²",
          "inputs": {
            "poolLength": 10,
            "poolWidth": 5,
            "share": "60"
          },
          "expected": 322.917,
          "toleranceDecimalPlaces": 2,
          "unit": "sq ft",
          "confidence": "medium",
          "steps": [
            {
              "label": "Pool surface",
              "value": 538.195520835486,
              "unit": "sq ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The same pool at 70%: 35 m²",
          "inputs": {
            "poolLength": 10,
            "poolWidth": 5,
            "share": "70"
          },
          "expected": 376.737,
          "toleranceDecimalPlaces": 2,
          "unit": "sq ft",
          "confidence": "medium",
          "steps": [
            {
              "label": "Pool surface",
              "value": 538.195520835486,
              "unit": "sq ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "At the guide's lower bound: 25 m²",
          "inputs": {
            "poolLength": 10,
            "poolWidth": 5,
            "share": "50"
          },
          "expected": 269.098,
          "toleranceDecimalPlaces": 2,
          "unit": "sq ft",
          "confidence": "medium",
          "steps": [
            {
              "label": "Pool surface",
              "value": 538.195520835486,
              "unit": "sq ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "solar-pv-wire-sizing-calculator",
      "title": "Solar Panel PV Wire Sizing Calculator",
      "url": "https://craftquantities.com/calculators/solar-energy/solar-pv-wire-sizing-calculator/",
      "sources": [
        "Conductor area = (2 x resistivity x one-way distance x current) ÷ maximum allowable voltage drop, the standard DC circuit voltage-drop sizing method applied to a solar PV source/output circuit run (the factor of 2 accounts for the round-trip conductor length)"
      ],
      "vectors": [
        {
          "name": "10A, 48V, 15m one-way, 2% max drop",
          "inputs": {
            "current": 10,
            "systemVoltage": 48,
            "oneWayDistance": 15,
            "maxVoltageDropPercent": 2,
            "copperResistivity": 0.0175
          },
          "expected": 5.47,
          "toleranceDecimalPlaces": 1,
          "unit": "mm²",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15A, 48V, 20m one-way, 2% max drop",
          "inputs": {
            "current": 15,
            "systemVoltage": 48,
            "oneWayDistance": 20,
            "maxVoltageDropPercent": 2,
            "copperResistivity": 0.0175
          },
          "expected": 10.94,
          "toleranceDecimalPlaces": 1,
          "unit": "mm²",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "solar-row-spacing-calculator",
      "title": "Solar Array Row Spacing and Shading Pitch Calculator",
      "url": "https://craftquantities.com/calculators/solar-energy/solar-row-spacing-calculator/",
      "sources": [
        "Geometry: a panel of slope length L at tilt β stands L·sin β high and occupies L·cos β of ground, so at sun altitude α its shadow reaches (L·sin β)/tan α behind it and the row pitch is the sum of the two",
        "The usual design criterion is no row-to-row shading between 9 am and 3 pm on the winter solstice, which is when the sun is lowest in the working day",
        "Ground coverage ratio is the panel footprint divided by the row pitch — the share of the site that is under panel, and the direct cost of tilting further"
      ],
      "vectors": [
        {
          "name": "2 m panel at 30°, sun at 20°",
          "inputs": {
            "panelLength": 2,
            "tiltAngle": 30,
            "sunAltitude": 20,
            "availableDepth": 20
          },
          "expected": 14.697,
          "toleranceDecimalPlaces": 2,
          "unit": "ft",
          "confidence": "medium",
          "steps": [
            {
              "label": "Clear gap behind each row",
              "value": 9.014033528394428,
              "unit": "ft"
            },
            {
              "label": "Ground the panel occupies",
              "value": 5.682581389661671,
              "unit": "ft"
            },
            {
              "label": "Height the row stands",
              "value": 3.280839895013123,
              "unit": "ft"
            },
            {
              "label": "Ground coverage ratio",
              "value": 38.665920154716126,
              "unit": "%"
            },
            {
              "label": "Rows that fit the depth",
              "value": 5,
              "unit": "rows"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Laying it flatter packs the rows closer",
          "inputs": {
            "panelLength": 2,
            "tiltAngle": 15,
            "sunAltitude": 20,
            "availableDepth": 20
          },
          "expected": 11.004,
          "toleranceDecimalPlaces": 2,
          "unit": "ft",
          "confidence": "medium",
          "steps": [
            {
              "label": "Clear gap behind each row",
              "value": 4.666007100682305,
              "unit": "ft"
            },
            {
              "label": "Ground the panel occupies",
              "value": 6.338095973025382,
              "unit": "ft"
            },
            {
              "label": "Height the row stands",
              "value": 1.6982876975231018,
              "unit": "ft"
            },
            {
              "label": "Ground coverage ratio",
              "value": 57.597570020669075,
              "unit": "%"
            },
            {
              "label": "Rows that fit the depth",
              "value": 6,
              "unit": "rows"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "A lower sun pushes them apart fast",
          "inputs": {
            "panelLength": 2,
            "tiltAngle": 30,
            "sunAltitude": 10,
            "availableDepth": 20
          },
          "expected": 24.289,
          "toleranceDecimalPlaces": 2,
          "unit": "ft",
          "confidence": "medium",
          "steps": [
            {
              "label": "Clear gap behind each row",
              "value": 18.6065676496644,
              "unit": "ft"
            },
            {
              "label": "Ground the panel occupies",
              "value": 5.682581389661671,
              "unit": "ft"
            },
            {
              "label": "Height the row stands",
              "value": 3.280839895013123,
              "unit": "ft"
            },
            {
              "label": "Ground coverage ratio",
              "value": 23.3955556881022,
              "unit": "%"
            },
            {
              "label": "Rows that fit the depth",
              "value": 3,
              "unit": "rows"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "solar-water-heater-collector-calculator",
      "title": "Solar Water Heater Collector Size Calculator",
      "url": "https://craftquantities.com/calculators/solar-energy/solar-water-heater-collector-calculator/",
      "sources": [
        "US Department of Energy, Heat Your Water with the Sun — A Consumer's Guide (DOE/GO-102003-1824, December 2003): size to meet 90% to 100% of summer hot water needs; about 20 sq ft (2 m²) of collector for each of the first two family members, then 8 sq ft (0.7 m²) per additional person in the Sun Belt or 12 to 14 sq ft (1.1 to 1.3 m²) in the northern United States",
        "The same guide: for active systems the solar storage tank grows with the collector, typically 1.5 gallons per square foot of collector; a 66-gallon system usually serves one to three people, an 80-gallon system three or four, a 120-gallon system four to six"
      ],
      "vectors": [
        {
          "name": "Four people in the Sun Belt: 20 + 20 + 8 + 8 = 56 sq ft",
          "inputs": {
            "people": 4,
            "climate": "sunbelt"
          },
          "expected": 56,
          "toleranceDecimalPlaces": 3,
          "unit": "sq ft",
          "confidence": "medium",
          "steps": [
            {
              "label": "Solar storage for an active system",
              "value": 84,
              "unit": "gallons"
            },
            {
              "label": "Collector per person beyond the first two",
              "value": 8,
              "unit": "sq ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Four people in the northern United States, lower end: 64 sq ft",
          "inputs": {
            "people": 4,
            "climate": "northLow"
          },
          "expected": 64,
          "toleranceDecimalPlaces": 3,
          "unit": "sq ft",
          "confidence": "medium",
          "steps": [
            {
              "label": "Solar storage for an active system",
              "value": 96,
              "unit": "gallons"
            },
            {
              "label": "Collector per person beyond the first two",
              "value": 12,
              "unit": "sq ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Four people in the northern United States, upper end: 68 sq ft",
          "inputs": {
            "people": 4,
            "climate": "northHigh"
          },
          "expected": 68,
          "toleranceDecimalPlaces": 3,
          "unit": "sq ft",
          "confidence": "medium",
          "steps": [
            {
              "label": "Solar storage for an active system",
              "value": 102,
              "unit": "gallons"
            },
            {
              "label": "Collector per person beyond the first two",
              "value": 14,
              "unit": "sq ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "One person: the first person's 20 sq ft",
          "inputs": {
            "people": 1,
            "climate": "sunbelt"
          },
          "expected": 20,
          "toleranceDecimalPlaces": 3,
          "unit": "sq ft",
          "confidence": "medium",
          "steps": [
            {
              "label": "Solar storage for an active system",
              "value": 30,
              "unit": "gallons"
            },
            {
              "label": "Collector per person beyond the first two",
              "value": 8,
              "unit": "sq ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "solar-water-heater-savings-calculator",
      "title": "Solar Water Heater Savings Calculator",
      "url": "https://craftquantities.com/calculators/solar-energy/solar-water-heater-savings-calculator/",
      "sources": [
        "US Department of Energy, Energy Saver, Estimating the Cost and Energy Efficiency of a Solar Water Heater: daily water heating energy = gallons of hot water per day × 8.35 lb/gal × 1 Btu/lb·°F × (hot − cold water temperature); annual solar energy savings = daily energy × 365 × (1/UEF − 1/SEF); benchmark 64.3 gallons a day from 58 °F to 135 °F",
        "The same page: the solar energy factor is the energy delivered by the system divided by the electrical or gas energy put into it, ranging from 1.0 to 11 with 2 or 3 the most common; the solar fraction is typically 0.5 to 0.75; certified systems' SEF and solar fraction are listed by the Solar Rating and Certification Corporation",
        "The same page: a conventional heater's efficiency is its Uniform Energy Factor (10 CFR Part 430, Subpart B, Appendix E); the page's examples use 0.64 for household gas and take electric resistance as 1.0; one therm is 100,000 Btu"
      ],
      "vectors": [
        {
          "name": "The DOE's gas example by its formula: 64.3 gal from 58 to 135 °F, UEF 0.64, SEF 2.5 — 175.4 therms a year (the page rounds from its 41,045 Btu benchmark to 174)",
          "inputs": {
            "hotWater": 243.40197771119998,
            "coldTemp": 14.444444444444445,
            "hotTemp": 57.22222222222222,
            "fuel": "gas",
            "uefGas": 0.64,
            "uefElectric": 1,
            "sef": 2.5,
            "gasPrice": "",
            "electricityPrice": "",
            "systemCost": ""
          },
          "expected": 175.42,
          "toleranceDecimalPlaces": 1,
          "unit": "therms",
          "confidence": "medium",
          "steps": [
            {
              "label": "Water heating energy per day",
              "value": 0.41341685,
              "unit": "therms"
            },
            {
              "label": "Backup energy per year without solar",
              "value": 235.77679726562496,
              "unit": "therms"
            },
            {
              "label": "Backup energy per year with solar",
              "value": 60.3588601,
              "unit": "therms"
            },
            {
              "label": "Money saved per year",
              "value": 0,
              "unit": "currency/year"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The DOE's electric example by its formula: UEF 1.0, SEF 2.5 — 2,653 kWh a year (the page gives 2,634 from 12.03 kWh a day)",
          "inputs": {
            "hotWater": 243.40197771119998,
            "coldTemp": 14.444444444444445,
            "hotTemp": 57.22222222222222,
            "fuel": "electric",
            "uefGas": 0.64,
            "uefElectric": 1,
            "sef": 2.5,
            "gasPrice": "",
            "electricityPrice": "",
            "systemCost": ""
          },
          "expected": 2653.42,
          "toleranceDecimalPlaces": 1,
          "unit": "kWh",
          "confidence": "medium",
          "steps": [
            {
              "label": "Water heating energy per day",
              "value": 12.116051865672814,
              "unit": "kWh"
            },
            {
              "label": "Backup energy per year without solar",
              "value": 4422.358930970577,
              "unit": "kWh"
            },
            {
              "label": "Backup energy per year with solar",
              "value": 1768.943572388231,
              "unit": "kWh"
            },
            {
              "label": "Money saved per year",
              "value": 0,
              "unit": "currency/year"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "SEF 2.9 with electric backup saves 2,897 kWh a year; the DOE's comparison against SEF 2.0 is the same load with 31% less backup energy",
          "inputs": {
            "hotWater": 243.40197771119998,
            "coldTemp": 14.444444444444445,
            "hotTemp": 57.22222222222222,
            "fuel": "electric",
            "uefGas": 0.64,
            "uefElectric": 1,
            "sef": 2.9,
            "gasPrice": "",
            "electricityPrice": "",
            "systemCost": ""
          },
          "expected": 2897.41,
          "toleranceDecimalPlaces": 1,
          "unit": "kWh",
          "confidence": "medium",
          "steps": [
            {
              "label": "Water heating energy per day",
              "value": 12.116051865672814,
              "unit": "kWh"
            },
            {
              "label": "Backup energy per year without solar",
              "value": 4422.358930970577,
              "unit": "kWh"
            },
            {
              "label": "Backup energy per year with solar",
              "value": 1524.9513555070955,
              "unit": "kWh"
            },
            {
              "label": "Money saved per year",
              "value": 0,
              "unit": "currency/year"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "spa-hot-tub-volume-calculator",
      "title": "Hot Tub & Spa Volume Calculator",
      "url": "https://craftquantities.com/calculators/pools-water/spa-hot-tub-volume-calculator/",
      "sources": [
        "Round vessel volume (gallons) = pi x radius² x depth (all in ft) x 7.4805 US gallons per cubic ft, the exact 1,728 ÷ 231 (a US gallon is 231 cubic inches)"
      ],
      "vectors": [
        {
          "name": "2.1m diameter, 0.9m depth",
          "inputs": {
            "spaDiameter": 2.1,
            "avgDepth": 0.9
          },
          "expected": 823.489,
          "toleranceDecimalPlaces": 2,
          "unit": "gallons",
          "confidence": "medium",
          "steps": [
            {
              "label": "Volume in cubic feet",
              "value": 110.08447923029495,
              "unit": "ft³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2.4m diameter, 1.0m depth",
          "inputs": {
            "spaDiameter": 2.4,
            "avgDepth": 1
          },
          "expected": 1195.086,
          "toleranceDecimalPlaces": 2,
          "unit": "gallons",
          "confidence": "medium",
          "steps": [
            {
              "label": "Volume in cubic feet",
              "value": 159.7597884521287,
              "unit": "ft³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "speed-bump-volume-calculator",
      "title": "Speed Bump/Hump Material Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/speed-bump-volume-calculator/",
      "sources": [
        "Material volume = length × width × height × a cross-section shape factor (commonly ~0.67 to approximate a rounded/parabolic hump profile rather than a full rectangular block)"
      ],
      "vectors": [
        {
          "name": "3.7m x 0.3m x 0.075m, 0.67 factor",
          "inputs": {
            "bumpLength": 3.7,
            "bumpWidth": 0.3,
            "bumpHeight": 0.075,
            "shapeFactor": 0.67
          },
          "expected": 0.0558,
          "toleranceDecimalPlaces": 2,
          "unit": "m³",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "4m x 0.35m x 0.08m, 0.67 factor",
          "inputs": {
            "bumpLength": 4,
            "bumpWidth": 0.35,
            "bumpHeight": 0.08,
            "shapeFactor": 0.67
          },
          "expected": 0.075,
          "toleranceDecimalPlaces": 2,
          "unit": "m³",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "sphere-capsule-tank-volume-calculator",
      "title": "Sphere and Capsule Tank Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/sphere-capsule-tank-volume-calculator/",
      "sources": [
        "A sphere of radius r filled to depth h contains πh²(3r − h)/3 — the standard spherical cap, which returns a hemisphere at h = r and a whole sphere at h = 2r. Both boundaries are checked rather than assumed",
        "Above the equator the filled region is a spherical zone, πt(r² − t²/3) for a height t above the widest point, which returns the upper hemisphere exactly at t = r. A vertical capsule is that pair of heads with a straight cylinder between them, so one expression family covers both shapes and a sphere is simply a capsule with no barrel",
        "For fuel inventory, custody transfer or any regulated measurement, the governing figure is the vessel's own calibrated strapping table. A pressure vessel's heads are frequently torispherical rather than hemispherical, which holds less"
      ],
      "vectors": [
        {
          "name": "a 1.6 m capsule with a 2 m barrel, filled to 1.2 m",
          "inputs": {
            "tankDiameter": 1.6,
            "tankShape": "capsule",
            "barrelLength": 2,
            "liquidDepth": 1.2
          },
          "expected": 495.74,
          "toleranceDecimalPlaces": 0,
          "unit": "gal",
          "confidence": "high",
          "steps": [
            {
              "label": "Capacity when full",
              "value": 1628.858241395903,
              "unit": "gal"
            },
            {
              "label": "Ullage — the empty space above",
              "value": 1133.1187766232367,
              "unit": "gal"
            },
            {
              "label": "Depth as a proportion of the height",
              "value": 33.33333333333333,
              "unit": "%"
            },
            {
              "label": "Volume as a proportion of capacity",
              "value": 30.434782608695656,
              "unit": "%"
            },
            {
              "label": "Height of the band a dipstick reads honestly",
              "value": 55.55555555555556,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "half a sphere is exactly a hemisphere",
          "inputs": {
            "tankDiameter": 1.6,
            "tankShape": "sphere",
            "barrelLength": 2,
            "liquidDepth": 0.8
          },
          "expected": 283.28,
          "toleranceDecimalPlaces": 0,
          "unit": "gal",
          "confidence": "high",
          "steps": [
            {
              "label": "Capacity when full",
              "value": 566.5593883116185,
              "unit": "gal"
            },
            {
              "label": "Ullage — the empty space above",
              "value": 283.2796941558092,
              "unit": "gal"
            },
            {
              "label": "Depth as a proportion of the height",
              "value": 50,
              "unit": "%"
            },
            {
              "label": "Volume as a proportion of capacity",
              "value": 50.000000000000014,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "a tenth of a sphere's diameter holds under three per cent of it",
          "inputs": {
            "tankDiameter": 1.6,
            "tankShape": "sphere",
            "barrelLength": 2,
            "liquidDepth": 0.16
          },
          "expected": 15.86,
          "toleranceDecimalPlaces": 0,
          "unit": "gal",
          "confidence": "high",
          "steps": [
            {
              "label": "Capacity when full",
              "value": 566.5593883116185,
              "unit": "gal"
            },
            {
              "label": "Ullage — the empty space above",
              "value": 550.6957254388932,
              "unit": "gal"
            },
            {
              "label": "Depth as a proportion of the height",
              "value": 10,
              "unit": "%"
            },
            {
              "label": "Volume as a proportion of capacity",
              "value": 2.8000000000000003,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "a full capsule is its sphere plus its barrel",
          "inputs": {
            "tankDiameter": 1.6,
            "tankShape": "capsule",
            "barrelLength": 2,
            "liquidDepth": 3.6
          },
          "expected": 1628.86,
          "toleranceDecimalPlaces": 0,
          "unit": "gal",
          "confidence": "high",
          "steps": [
            {
              "label": "Capacity when full",
              "value": 1628.858241395903,
              "unit": "gal"
            },
            {
              "label": "Ullage — the empty space above",
              "value": 0,
              "unit": "gal"
            },
            {
              "label": "Depth as a proportion of the height",
              "value": 100,
              "unit": "%"
            },
            {
              "label": "Volume as a proportion of capacity",
              "value": 100,
              "unit": "%"
            },
            {
              "label": "Height of the band a dipstick reads honestly",
              "value": 55.55555555555556,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "spiral-stair-headroom-calculator",
      "title": "Spiral Stair Headroom Clearance Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/spiral-stair-headroom-calculator/",
      "sources": [
        "Per the International Building Code Section 1011.3 (verified against a regulatory-text mirror this session, up.codes): standard stairways require 80 inches (2032mm) minimum headroom, but 'Spiral stairways that comply with Section 1011.10 are permitted a reduced headroom clearance of 78 inches (1981mm / 1.9812m).'"
      ],
      "vectors": [
        {
          "name": "2.0m headroom (compliant)",
          "inputs": {
            "actualHeadroom": 2
          },
          "expected": 2,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Required minimum (IBC 1011.3, spiral stair exception)",
              "value": 1.9812,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1.9m headroom (not compliant)",
          "inputs": {
            "actualHeadroom": 1.9
          },
          "expected": 1.9,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Required minimum (IBC 1011.3, spiral stair exception)",
              "value": 1.9812,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "spiral-stair-helix-calculator",
      "title": "Spiral Stair Helix Geometry Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/spiral-stair-helix-calculator/",
      "sources": [
        "Developed (unrolled) helix length = √(Total Rise² + (Helix Radius × Total Rotation in Radians)²) — the standard mathematical result for unrolling a helix into a straight line (the circumferential arc length and the vertical rise form the two legs of a right triangle when the helix is developed flat). This is a pure GEOMETRY calculation — it does NOT analyze the stringer's structural adequacy (bending, torsion, or deflection under load), which requires a full structural engineering analysis of the specific stringer's material and cross-section by a qualified engineer."
      ],
      "vectors": [
        {
          "name": "3m rise, 0.6m radius, 360° (one full turn)",
          "inputs": {
            "totalRise": 3,
            "helixRadius": 0.6,
            "totalRotationAngle": 360
          },
          "expected": 4.818,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Circumferential arc length",
              "value": 3.7699111843077517,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "3.6m rise, 0.75m radius, 450° (1.25 turns)",
          "inputs": {
            "totalRise": 3.6,
            "helixRadius": 0.75,
            "totalRotationAngle": 450
          },
          "expected": 6.903,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Circumferential arc length",
              "value": 5.890486225480862,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "sports-floor-pad-calculator",
      "title": "Sports/Athletic Floor Underlayment Pad Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/sports-floor-pad-calculator/",
      "sources": [
        "Pad area = court/floor area × (1 + waste allowance), accounting for trim waste at the perimeter and around fixed equipment anchors"
      ],
      "vectors": [
        {
          "name": "300m² court, 5% waste",
          "inputs": {
            "courtArea": 300,
            "wastePercent": 5
          },
          "expected": 315,
          "toleranceDecimalPlaces": 0,
          "unit": "m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "400m² court, 8% waste",
          "inputs": {
            "courtArea": 400,
            "wastePercent": 8
          },
          "expected": 432,
          "toleranceDecimalPlaces": 0,
          "unit": "m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "spray-foam-insulation-calculator",
      "title": "Spray Foam Insulation Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/spray-foam-insulation-calculator/",
      "sources": [
        "Board feet = area (sq ft) x thickness (in); a standard DIY 2-part spray foam kit covers approximately 600 board feet at 1 in thickness in North America. Board foot is a US trade volume (1 bd ft = 0.00236 m³, so a 600 bd-ft kit yields about 1.42 m³) with no metric counterpart in use and no equivalent standard kit size, so on metric the answer is given as the volume of foam required rather than a kit count"
      ],
      "vectors": [
        {
          "name": "20m² area, 1in thick",
          "inputs": {
            "area": 20,
            "thickness": 0.0254
          },
          "expected": 1,
          "toleranceDecimalPlaces": 0,
          "unit": "x 600 bd-ft kits",
          "confidence": "medium",
          "steps": [
            {
              "label": "Foam volume needed",
              "value": 215.27820833419443,
              "unit": "board ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "50m² area, 2in thick",
          "inputs": {
            "area": 50,
            "thickness": 0.0508
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "x 600 bd-ft kits",
          "confidence": "medium",
          "steps": [
            {
              "label": "Foam volume needed",
              "value": 1076.391041670972,
              "unit": "board ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "spray-transfer-efficiency-calculator",
      "title": "Paint and Coating Overspray Transfer Efficiency Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/spray-transfer-efficiency-calculator/",
      "sources": [
        "ASTM D5286 defines TRANSFER EFFICIENCY as the ratio of paint SOLIDS deposited to the total paint solids used, expressed as a percent, measured under general production conditions; ASTM D5009 and D5327 are the corresponding laboratory methods",
        "The bands used here are PLANNING figures spanning values commonly published for each equipment class, not a measurement of any particular gun. Published figures differ enormously with the test method — the same HVLP gun is reported at 25 to 32 per cent under one standard and 70 to 78 under another — so a transfer efficiency quoted without its method is not comparable to anything",
        "Material used to charge the hose is a FIXED loss rather than a proportional one: it is the internal volume of the line, πr²L, and it does not shrink with the job. On a small job it can exceed the overspray"
      ],
      "vectors": [
        {
          "name": "20 L airless at the cautious end, 15 m of 3/8 in hose",
          "inputs": {
            "paintOnSurface": 20,
            "applicationMethod": "airless",
            "hoseLength": 15,
            "hoseDiameter": "three-eighths"
          },
          "expected": 13.49,
          "toleranceDecimalPlaces": 1,
          "unit": "gal",
          "confidence": "low",
          "steps": [
            {
              "label": "Coating that must land on the surface",
              "value": 5.2834410471629685,
              "unit": "gal"
            },
            {
              "label": "If it goes well (the efficient end)",
              "value": 7.830129547710484,
              "unit": "gal"
            },
            {
              "label": "Never reaches the surface (the cautious end)",
              "value": 8.20751819393641,
              "unit": "gal"
            },
            {
              "label": "Held in the hose",
              "value": 0.28235662319195765,
              "unit": "gal"
            },
            {
              "label": "Transfer efficiency band used",
              "value": 40,
              "unit": "to 70%"
            },
            {
              "label": "Bought per unit that lands",
              "value": 2.5534418044360643,
              "unit": "times"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "brush and roller adds no hose and loses little",
          "inputs": {
            "paintOnSurface": 20,
            "applicationMethod": "brush-roller",
            "hoseLength": 15,
            "hoseDiameter": "three-eighths"
          },
          "expected": 5.87,
          "toleranceDecimalPlaces": 1,
          "unit": "gal",
          "confidence": "low",
          "steps": [
            {
              "label": "Coating that must land on the surface",
              "value": 5.2834410471629685,
              "unit": "gal"
            },
            {
              "label": "If it goes well (the efficient end)",
              "value": 5.39126637465609,
              "unit": "gal"
            },
            {
              "label": "Never reaches the surface (the cautious end)",
              "value": 0.5870490052403297,
              "unit": "gal"
            },
            {
              "label": "Held in the hose",
              "value": 0,
              "unit": "gal"
            },
            {
              "label": "Transfer efficiency band used",
              "value": 90,
              "unit": "to 98%"
            },
            {
              "label": "Bought per unit that lands",
              "value": 1.1111111111111112,
              "unit": "times"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "conventional air spray on a small job, where the hose is a fifth of the order",
          "inputs": {
            "paintOnSurface": 3,
            "applicationMethod": "conventional",
            "hoseLength": 30,
            "hoseDiameter": "half"
          },
          "expected": 4.97,
          "toleranceDecimalPlaces": 1,
          "unit": "gal",
          "confidence": "low",
          "steps": [
            {
              "label": "Coating that must land on the surface",
              "value": 0.7925161570744452,
              "unit": "gal"
            },
            {
              "label": "If it goes well (the efficient end)",
              "value": 2.765081675959061,
              "unit": "gal"
            },
            {
              "label": "Never reaches the surface (the cautious end)",
              "value": 4.173999288535852,
              "unit": "gal"
            },
            {
              "label": "Held in the hose",
              "value": 1.0039346602380717,
              "unit": "gal"
            },
            {
              "label": "Transfer efficiency band used",
              "value": 20,
              "unit": "to 45%"
            },
            {
              "label": "Bought per unit that lands",
              "value": 6.266768697743744,
              "unit": "times"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "spread-footing-sizing-calculator",
      "title": "Isolated Spread Footing Sizing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/spread-footing-sizing-calculator/",
      "sources": [
        "Standard preliminary footing sizing: required footing area = column load / allowable soil bearing pressure; assumed square, so side length = sqrt(area)"
      ],
      "vectors": [
        {
          "name": "400kN load, 150kPa allowable",
          "inputs": {
            "columnLoad": 400000,
            "allowableBearingPressure": 150000
          },
          "expected": 1.633,
          "toleranceDecimalPlaces": 1,
          "unit": "m (square footing side)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Required footing area",
              "value": 2.6666666666666665,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "600kN load, 200kPa allowable",
          "inputs": {
            "columnLoad": 600000,
            "allowableBearingPressure": 200000
          },
          "expected": 1.732,
          "toleranceDecimalPlaces": 1,
          "unit": "m (square footing side)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Required footing area",
              "value": 3,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "sprinkler-head-spacing-calculator",
      "title": "Sprinkler Head Spacing and Count Calculator",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/sprinkler-head-spacing-calculator/",
      "sources": [
        "Spacing = published radius × spacing percentage × (1 − wind derate). Head-to-head coverage is spacing equal to the radius, so that every point on the ground lies within the pattern of at least two heads",
        "Triangular row spacing = head spacing × √3⁄2, the row offset of an equilateral triangular grid; square row spacing equals the head spacing",
        "RULE OF THUMB, stated as one: the spacing percentage and the wind derate are BOTH taken from the manufacturer's spacing chart for the nozzle in question. The defaults here are a starting point for a calm site, not a published allowance, and manufacturers permit a wider percentage for triangular layouts than for square ones"
      ],
      "vectors": [
        {
          "name": "4.6 m radius head-to-head with a 10% wind derate, 12 m by 8 m square grid",
          "inputs": {
            "publishedRadius": 4.6,
            "spacingPercent": 100,
            "windDerate": 10,
            "zoneLength": 12,
            "zoneWidth": 8,
            "layout": "square"
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "heads",
          "confidence": "medium",
          "steps": [
            {
              "label": "Spacing between heads along each row",
              "value": 4.14,
              "unit": "m"
            },
            {
              "label": "Spacing between rows",
              "value": 4.14,
              "unit": "m"
            },
            {
              "label": "Heads on each row",
              "value": 4,
              "unit": "heads"
            },
            {
              "label": "Rows across the zone",
              "value": 3,
              "unit": "rows"
            },
            {
              "label": "Ground served by each head",
              "value": 8,
              "unit": "m²"
            },
            {
              "label": "Heads actually land at, along each row",
              "value": 4,
              "unit": "m"
            },
            {
              "label": "Rows actually land at, across the zone",
              "value": 4,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "6 m radius on a triangular grid over 20 m by 15 m, no derate",
          "inputs": {
            "publishedRadius": 6,
            "spacingPercent": 100,
            "windDerate": 0,
            "zoneLength": 20,
            "zoneWidth": 15,
            "layout": "triangular"
          },
          "expected": 20,
          "toleranceDecimalPlaces": 0,
          "unit": "heads",
          "confidence": "medium",
          "steps": [
            {
              "label": "Spacing between heads along each row",
              "value": 6,
              "unit": "m"
            },
            {
              "label": "Spacing between rows",
              "value": 5.196152422706632,
              "unit": "m"
            },
            {
              "label": "Heads on each row",
              "value": 5,
              "unit": "heads"
            },
            {
              "label": "Rows across the zone",
              "value": 4,
              "unit": "rows"
            },
            {
              "label": "Ground served by each head",
              "value": 15,
              "unit": "m²"
            },
            {
              "label": "Heads actually land at, along each row",
              "value": 5,
              "unit": "m"
            },
            {
              "label": "Rows actually land at, across the zone",
              "value": 5,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "sprinkler-precipitation-rate-calculator",
      "title": "Sprinkler Precipitation Rate Calculator (in/h and mm/h)",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/sprinkler-precipitation-rate-calculator/",
      "sources": [
        "Rain Bird Corporation, Landscape Irrigation Design Manual, pp. 43–46: PR = 96.3 x gpm / (S x L) in inches per hour and PR = 1000 x m3/h / (S x L) in millimetres per hour, gpm the total flow applied to the area by the sprinklers, S the head spacing and L the row spacing; 96.3 = 231 in³ per gallon / 144 in² per square foot x 60 minutes; four full-circle heads each put a quarter of their flow into the square between them, so one head's discharge is the flow applied; part-circle flows are added the same way; triangular spacing worked with L = S x 0.866; worked examples at 40 x 40 ft (12 x 12 m), 11 x 12 ft (3 x 4 m) and 70 ft (21 m) triangular",
        "The same manual, pp. 58–59: the circuit precipitation rate over a valve's area, and operating time OT = I x 60 / (PR x DA) in minutes a day, I the weekly irrigation requirement and DA the days available; worked at 1-1/2 in (38 mm) a week over 3 days"
      ],
      "vectors": [
        {
          "name": "Rain Bird's impact heads: 1 m³/h each, 12 x 12 m square, full circle",
          "inputs": {
            "method": "spacing",
            "headFlow": 16.666666666666668,
            "arc": 360,
            "headSpacing": 12,
            "layout": "rows",
            "rowSpacing": 12,
            "zoneFlow": 60,
            "zoneArea": 150,
            "weeklyDepth": 0.038,
            "daysPerWeek": 3
          },
          "expected": 6.9444,
          "toleranceDecimalPlaces": 3,
          "unit": "mm/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Ground the flow is spread over",
              "value": 144,
              "unit": "m²"
            },
            {
              "label": "Flow falling on that ground",
              "value": 16.666666666666668,
              "unit": "L/min"
            },
            {
              "label": "Row spacing used",
              "value": 12,
              "unit": "m"
            },
            {
              "label": "Depth applied in a 10-minute run",
              "value": 1.1574074074074077,
              "unit": "mm"
            },
            {
              "label": "Run time per watering day for the week's water",
              "value": 109.43999999999998,
              "unit": "min"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The same in US units: 4.4 gpm at 40 x 40 ft, 0.2647 in/h (the manual's 96.3 gives 0.2648)",
          "inputs": {
            "method": "spacing",
            "headFlow": 16.6558118496,
            "arc": 360,
            "headSpacing": 12.192,
            "layout": "rows",
            "rowSpacing": 12.192,
            "zoneFlow": 60,
            "zoneArea": 150,
            "weeklyDepth": 0.038,
            "daysPerWeek": 3
          },
          "expected": 6.72306,
          "toleranceDecimalPlaces": 3,
          "unit": "mm/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Ground the flow is spread over",
              "value": 148.644864,
              "unit": "m²"
            },
            {
              "label": "Flow falling on that ground",
              "value": 16.6558118496,
              "unit": "L/min"
            },
            {
              "label": "Row spacing used",
              "value": 12.192,
              "unit": "m"
            },
            {
              "label": "Depth applied in a 10-minute run",
              "value": 1.1205104166666664,
              "unit": "mm"
            },
            {
              "label": "Run time per watering day for the week's water",
              "value": 113.04372077457262,
              "unit": "min"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Half-circle heads at 4.4 gpm on the same 40 ft square: 8.8 gpm applied, 0.5294 in/h",
          "inputs": {
            "method": "spacing",
            "headFlow": 16.6558118496,
            "arc": 180,
            "headSpacing": 12.192,
            "layout": "rows",
            "rowSpacing": 12.192,
            "zoneFlow": 60,
            "zoneArea": 150,
            "weeklyDepth": 0.038,
            "daysPerWeek": 3
          },
          "expected": 13.44613,
          "toleranceDecimalPlaces": 3,
          "unit": "mm/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Ground the flow is spread over",
              "value": 148.644864,
              "unit": "m²"
            },
            {
              "label": "Flow falling on that ground",
              "value": 33.3116236992,
              "unit": "L/min"
            },
            {
              "label": "Row spacing used",
              "value": 12.192,
              "unit": "m"
            },
            {
              "label": "Depth applied in a 10-minute run",
              "value": 2.241020833333333,
              "unit": "mm"
            },
            {
              "label": "Run time per watering day for the week's water",
              "value": 56.52186038728631,
              "unit": "min"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Rain Bird's rotors, triangular at 21 m: 6.33 m³/h each, 16.57 mm/h",
          "inputs": {
            "method": "spacing",
            "headFlow": 105.5,
            "arc": 360,
            "headSpacing": 21,
            "layout": "triangular",
            "rowSpacing": 21,
            "zoneFlow": 60,
            "zoneArea": 150,
            "weeklyDepth": 0.038,
            "daysPerWeek": 3
          },
          "expected": 16.5743,
          "toleranceDecimalPlaces": 3,
          "unit": "mm/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Ground the flow is spread over",
              "value": 381.91720306893745,
              "unit": "m²"
            },
            {
              "label": "Flow falling on that ground",
              "value": 105.5,
              "unit": "L/min"
            },
            {
              "label": "Row spacing used",
              "value": 18.186533479473212,
              "unit": "m"
            },
            {
              "label": "Depth applied in a 10-minute run",
              "value": 2.762378838979842,
              "unit": "mm"
            },
            {
              "label": "Run time per watering day for the week's water",
              "value": 45.85419815677606,
              "unit": "min"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Total area: 60 L/min over 150 m², 24 mm/h",
          "inputs": {
            "method": "area",
            "headFlow": 8,
            "arc": 360,
            "headSpacing": 4.5,
            "layout": "rows",
            "rowSpacing": 4.5,
            "zoneFlow": 60,
            "zoneArea": 150,
            "weeklyDepth": 0.038,
            "daysPerWeek": 3
          },
          "expected": 24,
          "toleranceDecimalPlaces": 6,
          "unit": "mm/h",
          "confidence": "medium",
          "steps": [
            {
              "label": "Ground the flow is spread over",
              "value": 150,
              "unit": "m²"
            },
            {
              "label": "Flow falling on that ground",
              "value": 60,
              "unit": "L/min"
            },
            {
              "label": "Depth applied in a 10-minute run",
              "value": 4,
              "unit": "mm"
            },
            {
              "label": "Run time per watering day for the week's water",
              "value": 31.666666666666668,
              "unit": "min"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "spt-overburden-correction-calculator",
      "title": "SPT N-Value Overburden Correction Calculator",
      "url": "https://craftquantities.com/calculators/heavy-civil/spt-overburden-correction-calculator/",
      "sources": [
        "Liao, S. S. C. and Whitman, R. V. (1986), Overburden Correction Factors for SPT in Sand, ASCE Journal of Geotechnical Engineering: CN = sqrt(Pa / σ'v), capped at 2.0; corrected N-value N1(60) = CN x N60, where Pa is atmospheric pressure (~100 kPa) and σ'v is the effective vertical overburden stress"
      ],
      "vectors": [
        {
          "name": "N60=15, σ'v=50kPa (50,000 Pa in the base)",
          "inputs": {
            "fieldN60": 15,
            "effectiveOverburdenStress": 50000
          },
          "expected": 21.21,
          "toleranceDecimalPlaces": 1,
          "unit": "(N1,60)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Overburden correction factor (CN)",
              "value": 1.4142135623730951
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "N60=20, σ'v=150kPa (150,000 Pa in the base)",
          "inputs": {
            "fieldN60": 20,
            "effectiveOverburdenStress": 150000
          },
          "expected": 16.33,
          "toleranceDecimalPlaces": 2,
          "unit": "(N1,60)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Overburden correction factor (CN)",
              "value": 0.816496580927726
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "square-feet-per-gallon-to-square-meters-per-liter-calculator",
      "title": "Paint Coverage ft²/gal to m²/L Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/square-feet-per-gallon-to-square-meters-per-liter-calculator/",
      "sources": [
        "1 ft² = 0.09290304 m² and 1 US gallon = 3.785411784 L, both exact, so 1 ft²/gal = 0.024542386747111157… m²/L. The imperial gallon is a different unit — 4.54609 L — and would give 0.0204358 m²/L instead."
      ],
      "vectors": [
        {
          "name": "350 ft²/gal converts correctly",
          "inputs": {
            "usCoverage": 350
          },
          "expected": 8.589835361488905,
          "toleranceDecimalPlaces": 6,
          "unit": "m²/L",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.024542386747111157,
              "unit": "m²/L per ft²/gal"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "usCoverage": 3500
          },
          "expected": 85.89835361488905,
          "toleranceDecimalPlaces": 6,
          "unit": "m²/L",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.024542386747111157,
              "unit": "m²/L per ft²/gal"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "square-feet-to-acres-calculator",
      "title": "Square Feet to Acres Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/square-feet-to-acres-calculator/",
      "sources": [
        "1 acre = 43,560 square feet = 4,840 square yards exactly",
        "1 acre = 0.404686 hectares"
      ],
      "vectors": [
        {
          "name": "43560 sq ft converts correctly",
          "inputs": {
            "squareFeet": 43560
          },
          "expected": 1,
          "toleranceDecimalPlaces": 6,
          "unit": "acres",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.00002295684113865932,
              "unit": "acres per sq ft"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "squareFeet": 435600
          },
          "expected": 10,
          "toleranceDecimalPlaces": 6,
          "unit": "acres",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.00002295684113865932,
              "unit": "acres per sq ft"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "square-feet-to-bricks-calculator",
      "title": "Square Feet to Bricks Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/square-feet-to-bricks-calculator/",
      "sources": [
        "Standard modular brick with 3/8 in joints yields approximately 7 bricks per square foot of wall face",
        "Joint thickness and brick format change this materially — always confirm against the actual unit"
      ],
      "vectors": [
        {
          "name": "200 sq ft converts correctly",
          "inputs": {
            "squareFeet": 200
          },
          "expected": 1400,
          "toleranceDecimalPlaces": 6,
          "unit": "bricks",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 7,
              "unit": "bricks per sq ft"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "squareFeet": 2000
          },
          "expected": 14000,
          "toleranceDecimalPlaces": 6,
          "unit": "bricks",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 7,
              "unit": "bricks per sq ft"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "square-feet-to-drywall-sheets-calculator",
      "title": "Square Feet to Drywall Sheets Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/square-feet-to-drywall-sheets-calculator/",
      "sources": [
        "A standard 4 ft x 8 ft drywall sheet covers 32 square feet",
        "4 ft x 12 ft sheets cover 48 sq ft and reduce the number of butt joints on longer walls"
      ],
      "vectors": [
        {
          "name": "800 sq ft converts correctly",
          "inputs": {
            "squareFeet": 800
          },
          "expected": 25,
          "toleranceDecimalPlaces": 6,
          "unit": "sheets",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.03125,
              "unit": "sheets per sq ft"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "squareFeet": 8000
          },
          "expected": 250,
          "toleranceDecimalPlaces": 6,
          "unit": "sheets",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.03125,
              "unit": "sheets per sq ft"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "square-feet-to-roofing-squares-calculator",
      "title": "Square Feet to Roofing Squares Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/square-feet-to-roofing-squares-calculator/",
      "sources": [
        "A roofing square is 100 square feet of roof surface area"
      ],
      "vectors": [
        {
          "name": "2000 sq ft converts correctly",
          "inputs": {
            "squareFeet": 2000
          },
          "expected": 20,
          "toleranceDecimalPlaces": 6,
          "unit": "squares",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.01,
              "unit": "squares per sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "squareFeet": 20000
          },
          "expected": 200,
          "toleranceDecimalPlaces": 6,
          "unit": "squares",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.01,
              "unit": "squares per sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "square-feet-to-square-meters-calculator",
      "title": "Square Feet to Square Metres Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/square-feet-to-square-meters-calculator/",
      "sources": [
        "1 sq ft = (0.3048 m)^2 = 0.09290304 m^2 exactly"
      ],
      "vectors": [
        {
          "name": "500 sq ft converts correctly",
          "inputs": {
            "squareFeet": 500
          },
          "expected": 46.45152,
          "toleranceDecimalPlaces": 6,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.09290304,
              "unit": "m² per sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "squareFeet": 5000
          },
          "expected": 464.51520000000005,
          "toleranceDecimalPlaces": 6,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.09290304,
              "unit": "m² per sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "square-feet-to-square-yards-calculator",
      "title": "Square Feet to Square Yards Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/square-feet-to-square-yards-calculator/",
      "sources": [
        "1 square yard = 9 square feet exactly"
      ],
      "vectors": [
        {
          "name": "900 sq ft converts correctly",
          "inputs": {
            "squareFeet": 900
          },
          "expected": 100,
          "toleranceDecimalPlaces": 6,
          "unit": "sq yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.1111111111111111,
              "unit": "sq yd per sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "squareFeet": 9000
          },
          "expected": 1000,
          "toleranceDecimalPlaces": 6,
          "unit": "sq yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.1111111111111111,
              "unit": "sq yd per sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "square-footage-calculator",
      "title": "Square Footage Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/square-footage-calculator/",
      "sources": [
        "Standard geometry formulas: rectangle = L x W, circle = pi x r², triangle = 1/2 x base x height"
      ],
      "vectors": [
        {
          "name": "Rectangle 4x3.5m",
          "inputs": {
            "shape": "rectangle",
            "length": 4,
            "width": 3.5,
            "diameter": 6,
            "base": 5,
            "triangleHeight": 4
          },
          "expected": 14,
          "toleranceDecimalPlaces": 2,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Square feet",
              "value": 150.6947458339361,
              "unit": "sq ft"
            },
            {
              "label": "Square yards",
              "value": 16.743860648215122,
              "unit": "sq yd"
            },
            {
              "label": "Acres",
              "value": 0.00345947,
              "unit": "ac"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Circle, 6m diameter",
          "inputs": {
            "shape": "circle",
            "length": 4,
            "width": 3.5,
            "diameter": 6,
            "base": 5,
            "triangleHeight": 4
          },
          "expected": 28.27,
          "toleranceDecimalPlaces": 1,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Square feet",
              "value": 304.3423970013052,
              "unit": "sq ft"
            },
            {
              "label": "Square yards",
              "value": 33.81582188903391,
              "unit": "sq yd"
            },
            {
              "label": "Acres",
              "value": 0.006986729273987753,
              "unit": "ac"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Triangle, base 5m height 4m",
          "inputs": {
            "shape": "triangle",
            "length": 4,
            "width": 3.5,
            "diameter": 6,
            "base": 5,
            "triangleHeight": 4
          },
          "expected": 10,
          "toleranceDecimalPlaces": 2,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Square feet",
              "value": 107.63910416709722,
              "unit": "sq ft"
            },
            {
              "label": "Square yards",
              "value": 11.959900463010802,
              "unit": "sq yd"
            },
            {
              "label": "Acres",
              "value": 0.0024710500000000002,
              "unit": "ac"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "square-inches-to-square-millimeters-calculator",
      "title": "Square Inches to Square Millimetres Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/square-inches-to-square-millimeters-calculator/",
      "sources": [
        "NIST SP 811, Appendix B — 1 in² = 645.16 mm² (exact)",
        "International yard and pound agreement, 1959 — the inch is exactly 25.4 mm"
      ],
      "vectors": [
        {
          "name": "1 in² is 645.16 mm²",
          "inputs": {
            "squareInches": 1
          },
          "expected": 645.16,
          "toleranceDecimalPlaces": 6,
          "unit": "mm²",
          "confidence": "high",
          "steps": [
            {
              "label": "Area entered",
              "value": 1,
              "unit": "in²"
            },
            {
              "label": "Square millimetres",
              "value": 645.16,
              "unit": "mm²"
            },
            {
              "label": "Square centimetres",
              "value": 6.4516,
              "unit": "cm²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A #5 bar at 0.31 in² is 200 mm²",
          "inputs": {
            "squareInches": 0.31
          },
          "expected": 199.9996,
          "toleranceDecimalPlaces": 4,
          "unit": "mm²",
          "confidence": "high",
          "steps": [
            {
              "label": "Area entered",
              "value": 0.31,
              "unit": "in²"
            },
            {
              "label": "Square millimetres",
              "value": 199.9996,
              "unit": "mm²"
            },
            {
              "label": "Square centimetres",
              "value": 1.9999959999999999,
              "unit": "cm²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "0.2 in² is 129.03 mm²",
          "inputs": {
            "squareInches": 0.2
          },
          "expected": 129.032,
          "toleranceDecimalPlaces": 5,
          "unit": "mm²",
          "confidence": "high",
          "steps": [
            {
              "label": "Area entered",
              "value": 0.2,
              "unit": "in²"
            },
            {
              "label": "Square millimetres",
              "value": 129.032,
              "unit": "mm²"
            },
            {
              "label": "Square centimetres",
              "value": 1.2903200000000001,
              "unit": "cm²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "10 in² is 6451.6 mm²",
          "inputs": {
            "squareInches": 10
          },
          "expected": 6451.6,
          "toleranceDecimalPlaces": 4,
          "unit": "mm²",
          "confidence": "high",
          "steps": [
            {
              "label": "Area entered",
              "value": 10,
              "unit": "in²"
            },
            {
              "label": "Square millimetres",
              "value": 6451.599999999999,
              "unit": "mm²"
            },
            {
              "label": "Square centimetres",
              "value": 64.51599999999999,
              "unit": "cm²"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "square-meters-per-liter-to-square-feet-per-gallon-calculator",
      "title": "Paint Spread Rate m²/L to ft²/gal Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/square-meters-per-liter-to-square-feet-per-gallon-calculator/",
      "sources": [
        "1 ft² = 0.09290304 m² exactly and 1 US gallon = 3.785411784 L exactly, so 1 m²/L = 3.785411784 ÷ 0.09290304 = 9779/240 = 40.745833… ft²/gal. The ratio is exact by definition; its decimal expansion repeats (…8333…), so the digits shown are the exact value carried out, not a rounded measurement. Output is per US gallon, not per imperial gallon."
      ],
      "vectors": [
        {
          "name": "12 m²/L converts correctly",
          "inputs": {
            "metricSpreadRate": 12
          },
          "expected": 488.94999999999993,
          "toleranceDecimalPlaces": 6,
          "unit": "ft²/gal",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 40.74583333333333,
              "unit": "ft²/gal per m²/L"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "metricSpreadRate": 120
          },
          "expected": 4889.5,
          "toleranceDecimalPlaces": 6,
          "unit": "ft²/gal",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 40.74583333333333,
              "unit": "ft²/gal per m²/L"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "square-meters-to-square-feet-calculator",
      "title": "Square Metres to Square Feet Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/square-meters-to-square-feet-calculator/",
      "sources": [
        "1 m^2 = 1 / 0.09290304 = 10.763910417 sq ft"
      ],
      "vectors": [
        {
          "name": "50 m² converts correctly",
          "inputs": {
            "squareMetres": 50
          },
          "expected": 538.1955208354861,
          "toleranceDecimalPlaces": 6,
          "unit": "sq ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 10.763910416709722,
              "unit": "sq ft per m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "squareMetres": 500
          },
          "expected": 5381.955208354861,
          "toleranceDecimalPlaces": 6,
          "unit": "sq ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 10.763910416709722,
              "unit": "sq ft per m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "square-meters-to-square-yards-calculator",
      "title": "Square Metres to Square Yards Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/square-meters-to-square-yards-calculator/",
      "sources": [
        "Derived from the 1959 international yard (0.9144 m exactly): 1 m² ≈ 1.195990 square yards"
      ],
      "vectors": [
        {
          "name": "50 m² converts correctly",
          "inputs": {
            "squareMeters": 50
          },
          "expected": 59.799502315054006,
          "toleranceDecimalPlaces": 6,
          "unit": "sq yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Same area in square feet",
              "value": 538.1955208354861,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "squareMeters": 500
          },
          "expected": 597.9950231505401,
          "toleranceDecimalPlaces": 6,
          "unit": "sq yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Same area in square feet",
              "value": 5381.955208354861,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "square-millimeters-to-square-inches-calculator",
      "title": "Square Millimetres to Square Inches Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/square-millimeters-to-square-inches-calculator/",
      "sources": [
        "NIST SP 811, Appendix B — 1 mm² = 0.001550003 in²",
        "International yard and pound agreement, 1959 — the inch is exactly 25.4 mm"
      ],
      "vectors": [
        {
          "name": "200 mm² is a #5 bar at 0.31 in²",
          "inputs": {
            "squareMillimeters": 200
          },
          "expected": 0.31000062,
          "toleranceDecimalPlaces": 6,
          "unit": "in²",
          "confidence": "high",
          "steps": [
            {
              "label": "Square millimetres entered",
              "value": 200,
              "unit": "mm²"
            },
            {
              "label": "Converted area",
              "value": 0.31000062000124,
              "unit": "in²"
            },
            {
              "label": "Square centimetres",
              "value": 2,
              "unit": "cm²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "100 mm² is 0.155 in²",
          "inputs": {
            "squareMillimeters": 100
          },
          "expected": 0.15500031,
          "toleranceDecimalPlaces": 6,
          "unit": "in²",
          "confidence": "high",
          "steps": [
            {
              "label": "Square millimetres entered",
              "value": 100,
              "unit": "mm²"
            },
            {
              "label": "Converted area",
              "value": 0.15500031000062,
              "unit": "in²"
            },
            {
              "label": "Square centimetres",
              "value": 1,
              "unit": "cm²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "500 mm² is 0.775 in²",
          "inputs": {
            "squareMillimeters": 500
          },
          "expected": 0.77500155,
          "toleranceDecimalPlaces": 6,
          "unit": "in²",
          "confidence": "high",
          "steps": [
            {
              "label": "Square millimetres entered",
              "value": 500,
              "unit": "mm²"
            },
            {
              "label": "Converted area",
              "value": 0.7750015500031,
              "unit": "in²"
            },
            {
              "label": "Square centimetres",
              "value": 5,
              "unit": "cm²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "1000 mm² is 1.55 in²",
          "inputs": {
            "squareMillimeters": 1000
          },
          "expected": 1.5500031,
          "toleranceDecimalPlaces": 6,
          "unit": "in²",
          "confidence": "high",
          "steps": [
            {
              "label": "Square millimetres entered",
              "value": 1000,
              "unit": "mm²"
            },
            {
              "label": "Converted area",
              "value": 1.5500031000062,
              "unit": "in²"
            },
            {
              "label": "Square centimetres",
              "value": 10,
              "unit": "cm²"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "square-yards-to-square-feet-calculator",
      "title": "Square Yards to Square Feet Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/square-yards-to-square-feet-calculator/",
      "sources": [
        "1 square yard = 9 square feet exactly"
      ],
      "vectors": [
        {
          "name": "100 sq yd converts correctly",
          "inputs": {
            "squareYards": 100
          },
          "expected": 900,
          "toleranceDecimalPlaces": 6,
          "unit": "sq ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 9,
              "unit": "sq ft per sq yd"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "squareYards": 1000
          },
          "expected": 9000,
          "toleranceDecimalPlaces": 6,
          "unit": "sq ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 9,
              "unit": "sq ft per sq yd"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "square-yards-to-square-meters-calculator",
      "title": "Square Yards to Square Metres Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/square-yards-to-square-meters-calculator/",
      "sources": [
        "Derived from the 1959 international yard (0.9144 m exactly): 1 square yard = 0.83612736 m²"
      ],
      "vectors": [
        {
          "name": "100 sq yd converts correctly",
          "inputs": {
            "squareYards": 100
          },
          "expected": 83.612736,
          "toleranceDecimalPlaces": 6,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Same area in square feet",
              "value": 900,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "squareYards": 1000
          },
          "expected": 836.12736,
          "toleranceDecimalPlaces": 6,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Same area in square feet",
              "value": 9000,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "ssg-bite-width-calculator",
      "title": "Structural Silicone Glazing (SSG) Bite Width Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/ssg-bite-width-calculator/",
      "sources": [
        "ASTM C1401 / GANA Structural Sealant Glazing Manual: Bite = W×d / (2×Fa), where W is design wind load, d is the glass lite's short-span dimension, and Fa is the allowable silicone sealant stress — industry standard long-term allowable is 138 kPa (20 psi) per GANA consensus safety factor"
      ],
      "vectors": [
        {
          "name": "1.5 kPa wind, 1200mm short span, 138 kPa allowable",
          "inputs": {
            "windLoad": 1500,
            "liteShortDimension": 1.2,
            "allowableStress": 138000
          },
          "expected": 6.52,
          "toleranceDecimalPlaces": 1,
          "unit": "mm",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2.0 kPa wind, 1500mm short span, 138 kPa allowable",
          "inputs": {
            "windLoad": 2000,
            "liteShortDimension": 1.5,
            "allowableStress": 138000
          },
          "expected": 10.87,
          "toleranceDecimalPlaces": 1,
          "unit": "mm",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "stack-effect-pressure-calculator",
      "title": "Stack Effect Pressure Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/stack-effect-pressure-calculator/",
      "sources": [
        "ASHRAE Handbook—Fundamentals, Chapter 16, Ventilation and Infiltration: stack pressure Δp = ρo × g × (H_NPL − H) × (Ti − To) ÷ Ti, temperatures absolute; flow through a large opening with a discharge coefficient of about 0.65",
        "Outdoor air density from the ideal gas law: ρ = 101,325 Pa ÷ (287.055 J/kg·K × T), dry air at standard pressure"
      ],
      "vectors": [
        {
          "name": "The warehouse guide's 12 m shed: floor-level door 6 m below mid-height, 20 K across the wall",
          "inputs": {
            "height": 6,
            "position": "below",
            "insideTemp": 18,
            "outsideTemp": -2,
            "dischargeCoefficient": 0.65
          },
          "expected": 5.2617,
          "toleranceDecimalPlaces": 3,
          "unit": "Pa",
          "confidence": "medium",
          "steps": [
            {
              "label": "The same pressure in inches of water gauge (in. w.g.)",
              "value": 0.02112382814884849,
              "unit": "in. w.g."
            },
            {
              "label": "Outdoor air density",
              "value": 1.3017928674874784,
              "unit": "kg/m³"
            },
            {
              "label": "Air speed through the opening at this discharge coefficient",
              "value": 1.8480806423945377,
              "unit": "m/s"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The same 20 K as 20 °C inside and 0 °C outside",
          "inputs": {
            "height": 6,
            "position": "below",
            "insideTemp": 20,
            "outsideTemp": 0,
            "dischargeCoefficient": 0.65
          },
          "expected": 5.1876,
          "toleranceDecimalPlaces": 3,
          "unit": "Pa",
          "confidence": "medium",
          "steps": [
            {
              "label": "The same pressure in inches of water gauge (in. w.g.)",
              "value": 0.020826098854410707,
              "unit": "in. w.g."
            },
            {
              "label": "Outdoor air density",
              "value": 1.2922611606049048,
              "unit": "kg/m³"
            },
            {
              "label": "Air speed through the opening at this discharge coefficient",
              "value": 1.8417656379649583,
              "unit": "m/s"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A tall building: 30 m from the neutral plane, 21 °C inside, −10 °C outside",
          "inputs": {
            "height": 30,
            "position": "below",
            "insideTemp": 21,
            "outsideTemp": -10,
            "dischargeCoefficient": 0.65
          },
          "expected": 41.5894,
          "toleranceDecimalPlaces": 3,
          "unit": "Pa",
          "confidence": "medium",
          "steps": [
            {
              "label": "The same pressure in inches of water gauge (in. w.g.)",
              "value": 0.16696617738667355,
              "unit": "in. w.g."
            },
            {
              "label": "Outdoor air density",
              "value": 1.3413685579298111,
              "unit": "kg/m³"
            },
            {
              "label": "Air speed through the opening at this discharge coefficient",
              "value": 5.118535741167126,
              "unit": "m/s"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A high vent 4 m above the neutral plane, 20 °C inside and 0 °C outside — the same pressure, pushing out",
          "inputs": {
            "height": 4,
            "position": "above",
            "insideTemp": 20,
            "outsideTemp": 0,
            "dischargeCoefficient": 0.65
          },
          "expected": 3.4584,
          "toleranceDecimalPlaces": 3,
          "unit": "Pa",
          "confidence": "medium",
          "steps": [
            {
              "label": "The same pressure in inches of water gauge (in. w.g.)",
              "value": 0.01388406590294047,
              "unit": "in. w.g."
            },
            {
              "label": "Outdoor air density",
              "value": 1.2922611606049048,
              "unit": "kg/m³"
            },
            {
              "label": "Air speed through the opening at this discharge coefficient",
              "value": 1.5037953462685605,
              "unit": "m/s"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "stair-calculator",
      "title": "Stair Rise & Run Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/stair-calculator/",
      "sources": [
        "Comfortable stair proportion rule of thumb: 2 x riser height + tread depth = 24-25 inches; a riser of about 175–190 mm (6.9–7.5 in) is a comfortable target that sits inside all four codes this page checks",
        "US: IRC 2024 R311.7.5 — maximum riser height 7.75 in, minimum tread depth (going) 10 in",
        "UK: Approved Document K (2013), Section 1, Table 1.1 — a private stair's rise 150–220 mm and going 220–300 mm, pitch at most 42°, and twice the rise plus the going between 550 and 700 mm",
        "Australia: ABCB Housing Provisions Standard, Part 11.2, clause 11.2.2 and Table 11.2.2a, called up by NCC Volume Two for houses; the same table in NCC 2022 and NCC 2025. A stairway other than a spiral stair has risers of 115–190 mm, goings of 240–355 mm and a slope relationship 2R + G of 550–700 mm; each flight has not more than 18 and not less than 2 risers (11.2.2(1)(a)); goings and risers are constant through a flight, within 5 mm between neighbours and 10 mm across the flight (11.2.2(1)(c)); and risers have no opening a 125 mm sphere can pass through (11.2.2(1)(d)). Under 11.2.2(2), a stairway serving only non-habitable rooms such as attics and storerooms that are not used on a regular or daily basis may use Table 11.2.2b instead: riser 130–225 mm, going 215–355 mm and 2R + G 540–700 mm. NCC Volume One, clause D3D14 and Table D3D14, gives a public stairway in other buildings a going of 250–355 mm with the same risers and 2R + G",
        "Canada: National Building Code of Canada 2020, Volume 2, Division B, Section 9.8, for a private stair (one serving a single dwelling unit, a house with a secondary suite, or a garage serving either): rise 125–200 mm (Article 9.8.4.1, Table 9.8.4.1), run 255–355 mm (Article 9.8.4.2, Table 9.8.4.2), each tread's depth between its run and its run plus 25 mm (Sentence 9.8.4.2.(2)), risers and runs uniform within 5 mm between neighbours and 10 mm across a flight (Article 9.8.4.4), no flight more than 3.7 m high (Article 9.8.3.3), and 1 950 mm of clear height over a stair serving a single dwelling unit (Sentence 9.8.2.2.(3)). A public stair has a rise of 125–180 mm and a run of at least 280 mm. Provinces and territories adopt the NBC with amendments of their own, so check the edition in force where you build"
      ],
      "vectors": [
        {
          "name": "The page's opening: 2.8 m total rise, 18.5 cm target riser, 26 cm tread, IRC, inside the limits checked",
          "inputs": {
            "totalRise": 2.8,
            "targetRiser": 0.185,
            "actualTreadDepth": 0.26,
            "buildingCode": "irc"
          },
          "expected": 15,
          "toleranceDecimalPlaces": 0,
          "unit": "risers",
          "confidence": "high",
          "steps": [
            {
              "label": "Actual riser height",
              "value": 7.349081364829394,
              "unit": "in"
            },
            {
              "label": "Number of treads (steps)",
              "value": 14,
              "unit": "treads"
            },
            {
              "label": "Recommended tread depth (comfort formula)",
              "value": 10.301837270341212,
              "unit": "in"
            },
            {
              "label": "Code max riser height (US IRC 2024)",
              "value": 7.75,
              "unit": "in"
            },
            {
              "label": "Code min tread depth (US IRC 2024)",
              "value": 10,
              "unit": "in"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "3.5m total rise, 7in target riser, UK code, inside the limits checked",
          "inputs": {
            "totalRise": 3.5,
            "targetRiser": 0.1778,
            "actualTreadDepth": 0.28,
            "buildingCode": "uk"
          },
          "expected": 20,
          "toleranceDecimalPlaces": 0,
          "unit": "risers",
          "confidence": "high",
          "steps": [
            {
              "label": "Actual riser height",
              "value": 6.889763779527558,
              "unit": "in"
            },
            {
              "label": "Number of treads (steps)",
              "value": 19,
              "unit": "treads"
            },
            {
              "label": "Recommended tread depth (comfort formula)",
              "value": 11.220472440944883,
              "unit": "in"
            },
            {
              "label": "Code max riser height (UK Approved Document K)",
              "value": 8.661417322834646,
              "unit": "in"
            },
            {
              "label": "Code min tread depth (UK Approved Document K)",
              "value": 8.661417322834646,
              "unit": "in"
            },
            {
              "label": "Stair pitch (Approved Document K maximum 42°)",
              "value": 32.005383208083494,
              "unit": "°"
            },
            {
              "label": "Twice the rise plus the going (Approved Document K)",
              "value": 24.803149606299215,
              "unit": "in"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "2.7 m rise at a 175 mm target and a 250 mm going, Australian NCC",
          "inputs": {
            "totalRise": 2.7,
            "targetRiser": 0.175,
            "actualTreadDepth": 0.25,
            "buildingCode": "au"
          },
          "expected": 15,
          "toleranceDecimalPlaces": 0,
          "unit": "risers",
          "confidence": "high",
          "steps": [
            {
              "label": "Actual riser height",
              "value": 7.086614173228346,
              "unit": "in"
            },
            {
              "label": "Number of treads (steps)",
              "value": 14,
              "unit": "treads"
            },
            {
              "label": "Recommended tread depth (comfort formula)",
              "value": 10.826771653543307,
              "unit": "in"
            },
            {
              "label": "Code max riser height (Australian NCC Housing Provisions)",
              "value": 7.480314960629921,
              "unit": "in"
            },
            {
              "label": "Code min going (Australian NCC Housing Provisions)",
              "value": 9.448818897637796,
              "unit": "in"
            },
            {
              "label": "Twice the rise plus the going (NCC Table 11.2.2a)",
              "value": 24.015748031496063,
              "unit": "in"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "2.6 m rise at a 190 mm target and a 260 mm run, Canadian NBC private stair",
          "inputs": {
            "totalRise": 2.6,
            "targetRiser": 0.19,
            "actualTreadDepth": 0.26,
            "buildingCode": "ca"
          },
          "expected": 14,
          "toleranceDecimalPlaces": 0,
          "unit": "risers",
          "confidence": "high",
          "steps": [
            {
              "label": "Actual riser height",
              "value": 7.311586051743532,
              "unit": "in"
            },
            {
              "label": "Number of treads (steps)",
              "value": 13,
              "unit": "treads"
            },
            {
              "label": "Recommended tread depth (comfort formula)",
              "value": 10.376827896512935,
              "unit": "in"
            },
            {
              "label": "Code max riser height (Canadian National Building Code)",
              "value": 7.874015748031496,
              "unit": "in"
            },
            {
              "label": "Code min run (Canadian National Building Code)",
              "value": 10.039370078740157,
              "unit": "in"
            }
          ],
          "basis": "cited",
          "sourceIndex": 4
        }
      ]
    },
    {
      "slug": "stair-drop-cut-calculator",
      "title": "Stair Stringer Drop Cut Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/stair-drop-cut-calculator/",
      "sources": [
        "Derived geometry, and a standard carpentry layout rule rather than a code provision: the stringer's first riser is cut short by the thickness of the tread that will sit on it, less any floor finish that goes down after the stair is set",
        "IRC R311.7.5.1 and IBC 1011.5.4 set the tolerance the result is judged against — no more than 3/8 in (9.5 mm) between the greatest and smallest riser in a flight"
      ],
      "vectors": [
        {
          "name": "25 mm treads over a 12 mm floor finish — 13 mm drop",
          "inputs": {
            "measuredRise": 2.9,
            "riserCount": 16,
            "treadThickness": 0.025,
            "starterTreadThickness": 0.025,
            "lowerFloorBuildUp": 0.012,
            "upperLandingBuildUp": 0.012
          },
          "expected": 13,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Uniform riser height for the finished flight",
              "value": 181.25,
              "unit": "mm"
            },
            {
              "label": "Total finished rise",
              "value": 2.9,
              "unit": "m"
            },
            {
              "label": "First riser as built",
              "value": 181.25,
              "unit": "mm"
            },
            {
              "label": "Second riser as built",
              "value": 181.25,
              "unit": "mm"
            },
            {
              "label": "Top riser as built",
              "value": 181.25,
              "unit": "mm"
            },
            {
              "label": "Variation this introduces across the flight",
              "value": 0,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "50 mm feature starter tread over a 20 mm floor finish — 30 mm drop",
          "inputs": {
            "measuredRise": 2.72,
            "riserCount": 15,
            "treadThickness": 0.028,
            "starterTreadThickness": 0.05,
            "lowerFloorBuildUp": 0.02,
            "upperLandingBuildUp": 0.01
          },
          "expected": 30,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "low",
          "steps": [
            {
              "label": "Uniform riser height for the finished flight",
              "value": 180.66666666666666,
              "unit": "mm"
            },
            {
              "label": "Total finished rise",
              "value": 2.71,
              "unit": "m"
            },
            {
              "label": "First riser as built",
              "value": 180.66666666666666,
              "unit": "mm"
            },
            {
              "label": "Second riser as built",
              "value": 158.66666666666669,
              "unit": "mm"
            },
            {
              "label": "Top riser as built",
              "value": 202.66666666666666,
              "unit": "mm"
            },
            {
              "label": "Variation this introduces across the flight",
              "value": 43.999999999999986,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "standing-seam-clip-count-calculator",
      "title": "Standing Seam Metal Roof Clip Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/standing-seam-clip-count-calculator/",
      "sources": [
        "Clips per panel = ceil(panel length ÷ clip spacing) + 1, the standard layout method for standing seam panel clip fastening; total clips = clips per panel × number of panels"
      ],
      "vectors": [
        {
          "name": "6m panel, 0.6m spacing, 10 panels",
          "inputs": {
            "panelLength": 6,
            "clipSpacing": 0.6,
            "numberOfPanels": 10
          },
          "expected": 110,
          "toleranceDecimalPlaces": 0,
          "unit": "clips",
          "confidence": "high",
          "steps": [
            {
              "label": "Clips per panel",
              "value": 11
            },
            {
              "label": "Whole clip bays up a panel",
              "value": 10
            },
            {
              "label": "Short bay at the top of the panel",
              "value": 0,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "8m panel, 0.75m spacing, 15 panels",
          "inputs": {
            "panelLength": 8,
            "clipSpacing": 0.75,
            "numberOfPanels": 15
          },
          "expected": 180,
          "toleranceDecimalPlaces": 0,
          "unit": "clips",
          "confidence": "high",
          "steps": [
            {
              "label": "Clips per panel",
              "value": 12
            },
            {
              "label": "Whole clip bays up a panel",
              "value": 10
            },
            {
              "label": "Short bay at the top of the panel",
              "value": 0.5,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "standing-seam-thermal-movement-calculator",
      "title": "Standing Seam Roof Thermal Movement Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/standing-seam-thermal-movement-calculator/",
      "sources": [
        "Linear thermal expansion: ΔL = L × α × ΔT, where α is the metal's coefficient of thermal expansion (commonly ~23×10⁻⁶ per °C for aluminum, ~12×10⁻⁶ per °C for steel) and ΔT is the panel's expected temperature swing"
      ],
      "vectors": [
        {
          "name": "6m aluminum panel, 60°C swing",
          "inputs": {
            "panelLength": 6,
            "thermalExpansionCoefficient": 23,
            "temperatureSwing": 60
          },
          "expected": 8.28,
          "toleranceDecimalPlaces": 1,
          "unit": "mm",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "8m steel panel, 70°C swing",
          "inputs": {
            "panelLength": 8,
            "thermalExpansionCoefficient": 12,
            "temperatureSwing": 70
          },
          "expected": 6.72,
          "toleranceDecimalPlaces": 1,
          "unit": "mm",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "static-dissipative-flooring-calculator",
      "title": "Static-Dissipative (ESD) Flooring Coverage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/static-dissipative-flooring-calculator/",
      "sources": [
        "Material needed = floor area × (1 + waste allowance), the standard coverage-with-waste method applied to specialty ESD flooring installation"
      ],
      "vectors": [
        {
          "name": "100m² floor, 5% waste",
          "inputs": {
            "floorArea": 100,
            "wastePercent": 5
          },
          "expected": 105,
          "toleranceDecimalPlaces": 0,
          "unit": "m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150m² floor, 8% waste",
          "inputs": {
            "floorArea": 150,
            "wastePercent": 8
          },
          "expected": 162,
          "toleranceDecimalPlaces": 0,
          "unit": "m²",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "static-pressure-drop-calculator",
      "title": "Duct Static Pressure Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/static-pressure-drop-calculator/",
      "sources": [
        "ACCA Manual D — total effective length method; friction rate = available static pressure ÷ (TEL/100)",
        "Residential air handlers are commonly rated at 0.5 in w.g. total external static pressure"
      ],
      "vectors": [
        {
          "name": "100 ft run, 150 ft fittings, 0.10, 0.25 components",
          "inputs": {
            "ductRun": 30.48,
            "fittingEquivalent": 45.72,
            "frictionRate": 0.1,
            "componentDrop": 0.25
          },
          "expected": 0.5,
          "toleranceDecimalPlaces": 2,
          "unit": "in w.g.",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total effective length",
              "value": 249.99999999999994,
              "unit": "ft"
            },
            {
              "label": "Duct friction loss",
              "value": 0.24999999999999997,
              "unit": "in w.g."
            },
            {
              "label": "Components",
              "value": 0.25,
              "unit": "in w.g."
            },
            {
              "label": "Pascals",
              "value": 124.54445,
              "unit": "Pa"
            },
            {
              "label": "Against a 0.5 in w.g. blower rating",
              "value": 100,
              "unit": "% of rating"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "More fittings raise the total",
          "inputs": {
            "ductRun": 30.48,
            "fittingEquivalent": 121.92,
            "frictionRate": 0.1,
            "componentDrop": 0.25
          },
          "expected": 0.75,
          "toleranceDecimalPlaces": 2,
          "unit": "in w.g.",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total effective length",
              "value": 499.99999999999994,
              "unit": "ft"
            },
            {
              "label": "Duct friction loss",
              "value": 0.49999999999999994,
              "unit": "in w.g."
            },
            {
              "label": "Components",
              "value": 0.25,
              "unit": "in w.g."
            },
            {
              "label": "Pascals",
              "value": 186.816675,
              "unit": "Pa"
            },
            {
              "label": "Against a 0.5 in w.g. blower rating",
              "value": 150,
              "unit": "% of rating"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A lower friction rate needs bigger ducts but drops pressure",
          "inputs": {
            "ductRun": 30.48,
            "fittingEquivalent": 45.72,
            "frictionRate": 0.06,
            "componentDrop": 0.25
          },
          "expected": 0.4,
          "toleranceDecimalPlaces": 2,
          "unit": "in w.g.",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total effective length",
              "value": 249.99999999999994,
              "unit": "ft"
            },
            {
              "label": "Duct friction loss",
              "value": 0.14999999999999997,
              "unit": "in w.g."
            },
            {
              "label": "Components",
              "value": 0.25,
              "unit": "in w.g."
            },
            {
              "label": "Pascals",
              "value": 99.63555999999998,
              "unit": "Pa"
            },
            {
              "label": "Against a 0.5 in w.g. blower rating",
              "value": 80,
              "unit": "% of rating"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Components alone with no duct",
          "inputs": {
            "ductRun": 0.3048,
            "fittingEquivalent": 0,
            "frictionRate": 0.1,
            "componentDrop": 0.25
          },
          "expected": 0.251,
          "toleranceDecimalPlaces": 2,
          "unit": "in w.g.",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total effective length",
              "value": 0.9999999999999999,
              "unit": "ft"
            },
            {
              "label": "Duct friction loss",
              "value": 0.0009999999999999998,
              "unit": "in w.g."
            },
            {
              "label": "Components",
              "value": 0.25,
              "unit": "in w.g."
            },
            {
              "label": "Pascals",
              "value": 62.521313899999996,
              "unit": "Pa"
            },
            {
              "label": "Against a 0.5 in w.g. blower rating",
              "value": 50.2,
              "unit": "% of rating"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "steel-angle-weight-calculator",
      "title": "Steel Angle (L-Shape) Weight Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/steel-angle-weight-calculator/",
      "sources": [
        "Simplified angle cross-sectional area = (leg1 + leg2 − thickness) × thickness, omitting fillet/toe radius area; weight per unit length = area × steel density (7850 kg/m³)"
      ],
      "vectors": [
        {
          "name": "100x100x10 equal angle",
          "inputs": {
            "leg1": 0.1,
            "leg2": 0.1,
            "thickness": 0.01
          },
          "expected": 14.92,
          "toleranceDecimalPlaces": 1,
          "unit": "kg/m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cross-sectional area",
              "value": 1900,
              "unit": "mm²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150x90x12 unequal angle",
          "inputs": {
            "leg1": 0.15,
            "leg2": 0.09,
            "thickness": 0.012
          },
          "expected": 21.48,
          "toleranceDecimalPlaces": 2,
          "unit": "kg/m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cross-sectional area",
              "value": 2736,
              "unit": "mm²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "steel-baseplate-bearing-calculator",
      "title": "Steel Column Baseplate Concrete Bearing Pressure Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/steel-baseplate-bearing-calculator/",
      "sources": [
        "ACI 318 §10.17 (bearing on concrete): allowable bearing stress = min(0.85×f'c×√(A2/A1), 1.7×f'c), where A2/A1 is the ratio of the supporting concrete area to the loaded (baseplate) area"
      ],
      "vectors": [
        {
          "name": "500kN, 0.16m² plate, f'c=25, A2/A1=4 (pass)",
          "inputs": {
            "axialLoad": 500000,
            "plateArea": 0.16,
            "concreteStrength": 25000000,
            "areaRatio": 4
          },
          "expected": 3.125,
          "toleranceDecimalPlaces": 1,
          "unit": "MPa",
          "confidence": "medium",
          "steps": [
            {
              "label": "Nominal bearing strength Bn/A1",
              "value": 42.5,
              "unit": "MPa"
            },
            {
              "label": "Design bearing strength phi*Bn/A1 (phi = 0.65)",
              "value": 27.625,
              "unit": "MPa"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2000kN, 0.09m² plate, f'c=20, A2/A1=1 (fail)",
          "inputs": {
            "axialLoad": 2000000,
            "plateArea": 0.09,
            "concreteStrength": 20000000,
            "areaRatio": 1
          },
          "expected": 22.22,
          "toleranceDecimalPlaces": 1,
          "unit": "MPa",
          "confidence": "medium",
          "steps": [
            {
              "label": "Nominal bearing strength Bn/A1",
              "value": 17,
              "unit": "MPa"
            },
            {
              "label": "Design bearing strength phi*Bn/A1 (phi = 0.65)",
              "value": 11.05,
              "unit": "MPa"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "steel-beam-camber-calculator",
      "title": "Structural Steel Beam Camber Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/steel-beam-camber-calculator/",
      "sources": [
        "Standard fabrication practice cambers a steel beam to offset a specified fraction (commonly 75-100%) of its calculated dead-load deflection, producing a level or slightly upward-arched member once dead load is applied"
      ],
      "vectors": [
        {
          "name": "12mm deflection, 100% camber",
          "inputs": {
            "deadLoadDeflection": 0.012,
            "camberFraction": 1
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "mm",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "18mm deflection, 85% camber",
          "inputs": {
            "deadLoadDeflection": 0.018,
            "camberFraction": 0.85
          },
          "expected": 15.3,
          "toleranceDecimalPlaces": 1,
          "unit": "mm",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "steel-bracing-rod-weight-calculator",
      "title": "Steel Bracing Rod Diagonal Length & Weight Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/steel-bracing-rod-weight-calculator/",
      "sources": [
        "Diagonal bracing length = √(horizontal span² + vertical height²), standard right-triangle geometry; weight = length × the rod's linear weight (from its diameter/section table)"
      ],
      "vectors": [
        {
          "name": "6m span, 4m height, 3.85 kg/m",
          "inputs": {
            "horizontalSpan": 6,
            "verticalHeight": 4,
            "weightPerMeter": 3.85
          },
          "expected": 27.76,
          "toleranceDecimalPlaces": 2,
          "unit": "kg",
          "confidence": "high",
          "steps": [
            {
              "label": "Diagonal length",
              "value": 7.211102550927978,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "8m span, 5m height, 5.55 kg/m",
          "inputs": {
            "horizontalSpan": 8,
            "verticalHeight": 5,
            "weightPerMeter": 5.55
          },
          "expected": 52.36,
          "toleranceDecimalPlaces": 2,
          "unit": "kg",
          "confidence": "high",
          "steps": [
            {
              "label": "Diagonal length",
              "value": 9.433981132056603,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "steel-channel-weight-calculator",
      "title": "Steel Channel (C-Shape) Weight Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/steel-channel-weight-calculator/",
      "sources": [
        "Simplified channel cross-sectional area = 2×(flange width × flange thickness) + (depth − 2×flange thickness) × web thickness, the same rectangular-approximation method used for I-shapes; weight per unit length = area × steel density (7850 kg/m³)"
      ],
      "vectors": [
        {
          "name": "200mm depth, 75mm flange, 8.5mm flange thk, 6mm web",
          "inputs": {
            "depth": 0.2,
            "flangeWidth": 0.075,
            "flangeThickness": 0.0085,
            "webThickness": 0.006
          },
          "expected": 18.63,
          "toleranceDecimalPlaces": 2,
          "unit": "kg/m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cross-sectional area",
              "value": 2373,
              "unit": "mm²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "250mm depth, 90mm flange, 10mm flange thk, 7mm web",
          "inputs": {
            "depth": 0.25,
            "flangeWidth": 0.09,
            "flangeThickness": 0.01,
            "webThickness": 0.007
          },
          "expected": 26.77,
          "toleranceDecimalPlaces": 2,
          "unit": "kg/m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cross-sectional area",
              "value": 3410,
              "unit": "mm²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "steel-deck-support-spacing-calculator",
      "title": "Steel Deck Support Beam Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/steel-deck-support-spacing-calculator/",
      "sources": [
        "Support beam count = ceil(building length ÷ maximum deck span) + 1, the standard method for spacing repetitive support members to keep every deck span within its rated maximum"
      ],
      "vectors": [
        {
          "name": "24m building, 3.5m max span",
          "inputs": {
            "buildingLength": 24,
            "maxDeckSpan": 3.5
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "beams",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30m building, 4m max span",
          "inputs": {
            "buildingLength": 30,
            "maxDeckSpan": 4
          },
          "expected": 9,
          "toleranceDecimalPlaces": 0,
          "unit": "beams",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "steel-girder-ltb-limit-calculator",
      "title": "Steel Girder Lateral-Torsional Buckling Limit (Lp) Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/steel-girder-ltb-limit-calculator/",
      "sources": [
        "AISC 360 Chapter F, Eq. F2-5: Lp = 1.76×ry×√(E/Fy), the limiting laterally unbraced length below which lateral-torsional buckling does not reduce a doubly-symmetric compact I-shaped member's nominal moment capacity below Mp"
      ],
      "vectors": [
        {
          "name": "ry40mm, Fy345 MPa, E200000 MPa",
          "inputs": {
            "radiusOfGyrationY": 0.04,
            "yieldStrength": 345000000,
            "elasticModulus": 200000000000
          },
          "expected": 1.695,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "ry50mm, Fy250 MPa, E200000 MPa",
          "inputs": {
            "radiusOfGyrationY": 0.05,
            "yieldStrength": 250000000,
            "elasticModulus": 200000000000
          },
          "expected": 2.489,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "steel-i-beam-weight-calculator",
      "title": "Steel I-Beam Weight-per-Length Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/steel-i-beam-weight-calculator/",
      "sources": [
        "Weight per unit length = cross-sectional area × steel density (7850 kg/m³); simplified I-shape area = 2×(flange width × flange thickness) + (depth − 2×flange thickness) × web thickness, omitting fillet area (a slight underestimate vs. published AISC tables)"
      ],
      "vectors": [
        {
          "name": "300mm deep, 150x12 flanges, 8mm web",
          "inputs": {
            "depth": 0.3,
            "flangeWidth": 0.15,
            "flangeThickness": 0.012,
            "webThickness": 0.008
          },
          "expected": 45.59,
          "toleranceDecimalPlaces": 2,
          "unit": "kg/m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cross-sectional area",
              "value": 5808,
              "unit": "mm²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "400mm deep, 180x16 flanges, 10mm web",
          "inputs": {
            "depth": 0.4,
            "flangeWidth": 0.18,
            "flangeThickness": 0.016,
            "webThickness": 0.01
          },
          "expected": 74.1,
          "toleranceDecimalPlaces": 2,
          "unit": "kg/m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Cross-sectional area",
              "value": 9440,
              "unit": "mm²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "steel-moment-connection-bolt-calculator",
      "title": "Steel Moment Connection Bolt Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/steel-moment-connection-bolt-calculator/",
      "sources": [
        "Simplified moment-connection bolt force: equivalent force = applied moment ÷ effective lever arm between bolt rows; required bolts = ceil(equivalent force ÷ per-bolt rated shear/tension capacity)"
      ],
      "vectors": [
        {
          "name": "150 kN·m, 0.4m lever arm, 50kN/bolt",
          "inputs": {
            "momentLoad": 150,
            "leverArm": 0.4,
            "perBoltCapacity": 50000
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "bolts",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent force at bolt group",
              "value": 375,
              "unit": "kN"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "200 kN·m, 0.5m lever arm, 60kN/bolt",
          "inputs": {
            "momentLoad": 200,
            "leverArm": 0.5,
            "perBoltCapacity": 60000
          },
          "expected": 7,
          "toleranceDecimalPlaces": 0,
          "unit": "bolts",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent force at bolt group",
              "value": 400,
              "unit": "kN"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "steel-plate-mass-calculator",
      "title": "Steel Plate Mass Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/steel-plate-mass-calculator/",
      "sources": [
        "Mass = volume × steel density (7850 kg/m³): Length × Width × Thickness × 7850"
      ],
      "vectors": [
        {
          "name": "2m x 1m x 10mm plate",
          "inputs": {
            "plateLength": 2,
            "plateWidth": 1,
            "thickness": 0.01
          },
          "expected": 157,
          "toleranceDecimalPlaces": 0,
          "unit": "kg",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "3m x 1.5m x 6mm plate",
          "inputs": {
            "plateLength": 3,
            "plateWidth": 1.5,
            "thickness": 0.006
          },
          "expected": 211.95,
          "toleranceDecimalPlaces": 2,
          "unit": "kg",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "steel-primer-coverage-calculator",
      "title": "Structural Steel Primer Coverage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/steel-primer-coverage-calculator/",
      "sources": [
        "Steel surface area = member perimeter × length × count; paint/primer volume = surface area ÷ manufacturer coverage rate"
      ],
      "vectors": [
        {
          "name": "900mm perimeter, 6m, 10 members, 10 m²/L",
          "inputs": {
            "memberPerimeter": 0.9,
            "memberLength": 6,
            "memberCount": 10,
            "coverageRate": 10
          },
          "expected": 5.4,
          "toleranceDecimalPlaces": 1,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total surface area",
              "value": 54,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1200mm perimeter, 8m, 8 members, 12 m²/L",
          "inputs": {
            "memberPerimeter": 1.2,
            "memberLength": 8,
            "memberCount": 8,
            "coverageRate": 12
          },
          "expected": 6.4,
          "toleranceDecimalPlaces": 1,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total surface area",
              "value": 76.8,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "steel-purlin-spacing-calculator",
      "title": "Steel Z/C Purlin Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/steel-purlin-spacing-calculator/",
      "sources": [
        "Purlin rows = ceil(roof run length ÷ maximum purlin spacing) + 1, the standard layout method for spacing intermediate roof support members"
      ],
      "vectors": [
        {
          "name": "20m run, 1.5m max spacing",
          "inputs": {
            "roofRunLength": 20,
            "maxPurlinSpacing": 1.5
          },
          "expected": 15,
          "toleranceDecimalPlaces": 0,
          "unit": "rows",
          "confidence": "high",
          "steps": [
            {
              "label": "Bays from eave to ridge",
              "value": 14
            },
            {
              "label": "Purlin row centres, eave to ridge",
              "value": 1.4285714285714286,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30m run, 1.25m max spacing",
          "inputs": {
            "roofRunLength": 30,
            "maxPurlinSpacing": 1.25
          },
          "expected": 25,
          "toleranceDecimalPlaces": 0,
          "unit": "rows",
          "confidence": "high",
          "steps": [
            {
              "label": "Bays from eave to ridge",
              "value": 24
            },
            {
              "label": "Purlin row centres, eave to ridge",
              "value": 1.25,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "steel-stair-stringer-length-calculator",
      "title": "Structural Steel Stair Stringer Length Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/steel-stair-stringer-length-calculator/",
      "sources": [
        "Stringer length = √(total rise² + total run²), standard right-triangle geometry applied to a stair stringer's diagonal slope"
      ],
      "vectors": [
        {
          "name": "3m rise, 4m run",
          "inputs": {
            "totalRise": 3,
            "totalRun": 4
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2.5m rise, 3.5m run",
          "inputs": {
            "totalRise": 2.5,
            "totalRun": 3.5
          },
          "expected": 4.301,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "steel-stringer-bolt-hole-spacing-calculator",
      "title": "Steel Stair Stringer Bolt Hole Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/steel-stringer-bolt-hole-spacing-calculator/",
      "sources": [
        "Bolt hole count = ceil(stringer length ÷ maximum hole spacing) + 1, the standard method for laying out evenly-spaced connection points along a structural member"
      ],
      "vectors": [
        {
          "name": "5m stringer, 0.45m max spacing",
          "inputs": {
            "stringerLength": 5,
            "maxHoleSpacing": 0.45
          },
          "expected": 13,
          "toleranceDecimalPlaces": 0,
          "unit": "holes",
          "confidence": "high",
          "steps": [
            {
              "label": "Bays between holes",
              "value": 12
            },
            {
              "label": "Hole pitch, as drilled",
              "value": 0.4166666666666667,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "4.3m stringer, 0.4m max spacing",
          "inputs": {
            "stringerLength": 4.3,
            "maxHoleSpacing": 0.4
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "holes",
          "confidence": "high",
          "steps": [
            {
              "label": "Bays between holes",
              "value": 11
            },
            {
              "label": "Hole pitch, as drilled",
              "value": 0.3909090909090909,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "stepped-foundation-calculator",
      "title": "Stepped Foundation Calculator (Steps, Bays and Overlaps on a Slope)",
      "url": "https://craftquantities.com/calculators/materials-quantities/stepped-foundation-calculator/",
      "sources": [
        "Approved Document A (2004 edition incorporating 2004, 2010 and 2013 amendments), paragraph 2E2 d and e with Diagram 21: foundations stepped on elevation should overlap by twice the height of the step, by the thickness of the foundation, or 300 mm, whichever is greater; for trench fill foundations the overlap should be twice the height of the step or 1 m, whichever is greater; steps should not be of greater height than the thickness of the foundation",
        "The fall a line sees across a plane sloping at gradient g is g × cos θ, where θ is the angle between the line and the direction of maximum fall; a level bay between steps of height s is s ÷ (g × cos θ) long"
      ],
      "vectors": [
        {
          "name": "The slope guide's long wall: 1.204 m of fall in 225 mm steps",
          "inputs": {
            "wallLength": 12.04,
            "gradient": 10,
            "angleToFall": 0,
            "foundationType": "strip",
            "foundationThickness": 0.225,
            "stepHeight": 0.225
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "steps",
          "confidence": "high",
          "steps": [
            {
              "label": "Gradient along the wall",
              "value": 10,
              "unit": "%"
            },
            {
              "label": "Fall along the wall",
              "value": 1.204,
              "unit": "m"
            },
            {
              "label": "Height left after the whole steps",
              "value": 78.99999999999996,
              "unit": "mm"
            },
            {
              "label": "Level bay between steps",
              "value": 2.25,
              "unit": "m"
            },
            {
              "label": "Overlap at each step (Approved Document A)",
              "value": 0.45,
              "unit": "m"
            },
            {
              "label": "Tallest step the thickness allows",
              "value": 225,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The same wall at 60 degrees to the fall keeps half the gradient",
          "inputs": {
            "wallLength": 12.04,
            "gradient": 10,
            "angleToFall": 60,
            "foundationType": "strip",
            "foundationThickness": 0.225,
            "stepHeight": 0.225
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "steps",
          "confidence": "high",
          "steps": [
            {
              "label": "Gradient along the wall",
              "value": 5.000000000000002,
              "unit": "%"
            },
            {
              "label": "Fall along the wall",
              "value": 0.6020000000000002,
              "unit": "m"
            },
            {
              "label": "Height left after the whole steps",
              "value": 152.0000000000002,
              "unit": "mm"
            },
            {
              "label": "Level bay between steps",
              "value": 4.499999999999998,
              "unit": "m"
            },
            {
              "label": "Overlap at each step (Approved Document A)",
              "value": 0.45,
              "unit": "m"
            },
            {
              "label": "Tallest step the thickness allows",
              "value": 225,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Trench fill on a 1 in 4 fall: 900 mm bays against a 1 m overlap",
          "inputs": {
            "wallLength": 10,
            "gradient": 4,
            "angleToFall": 0,
            "foundationType": "trench-fill",
            "foundationThickness": 1.2,
            "stepHeight": 0.225
          },
          "expected": 11,
          "toleranceDecimalPlaces": 0,
          "unit": "steps",
          "confidence": "high",
          "steps": [
            {
              "label": "Gradient along the wall",
              "value": 25,
              "unit": "%"
            },
            {
              "label": "Fall along the wall",
              "value": 2.5,
              "unit": "m"
            },
            {
              "label": "Height left after the whole steps",
              "value": 24.99999999999991,
              "unit": "mm"
            },
            {
              "label": "Level bay between steps",
              "value": 0.9,
              "unit": "m"
            },
            {
              "label": "Overlap at each step (Approved Document A)",
              "value": 1,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Along the contours there is nothing to step",
          "inputs": {
            "wallLength": 12.04,
            "gradient": 10,
            "angleToFall": 90,
            "foundationType": "strip",
            "foundationThickness": 0.225,
            "stepHeight": 0.225
          },
          "expected": 0,
          "toleranceDecimalPlaces": 0,
          "unit": "steps",
          "confidence": "high",
          "steps": [
            {
              "label": "Gradient along the wall",
              "value": 6.123233995736766e-16,
              "unit": "%"
            },
            {
              "label": "Fall along the wall",
              "value": 7.372373730867066e-17,
              "unit": "m"
            },
            {
              "label": "Height left after the whole steps",
              "value": 7.372373730867066e-14,
              "unit": "mm"
            },
            {
              "label": "Level bay between steps",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Overlap at each step (Approved Document A)",
              "value": 0.45,
              "unit": "m"
            },
            {
              "label": "Tallest step the thickness allows",
              "value": 225,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "stockpile-volume-calculator",
      "title": "Stockpile Volume Calculator from Base and Angle of Repose",
      "url": "https://craftquantities.com/calculators/materials-quantities/stockpile-volume-calculator/",
      "sources": [
        "A freely tipped pile forms a cone whose side stands at the material's ANGLE OF REPOSE, so its height is the base radius times the tangent of that angle and its volume is πr²h/3. Measuring the circumference of the toe and deriving the rest is the standard field method, because the apex is the one point on a pile nobody can reach",
        "Angles of repose are quoted as bands rather than values: dry sand roughly 30 to 35 degrees, rounded gravel 30 to 38, angular crushed stone 38 to 45, wood chip 40 to 48. Moisture moves a material within its band, and how the pile was placed moves it again",
        "The result is LOOSE volume — the material as it sits in the pile, bulked. It is neither the bank volume it occupied in the ground nor the compacted volume it will occupy in place, and the three differ by a substantial margin for most materials"
      ],
      "vectors": [
        {
          "name": "a 30 m circumference pile of crushed stone, upper end",
          "inputs": {
            "baseCircumference": 30,
            "material": "crushed-stone",
            "flatToppedWidth": 0
          },
          "expected": 149.09,
          "toleranceDecimalPlaces": 0,
          "unit": "yd³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Lower end of the range",
              "value": 116.48069666352248,
              "unit": "yd³"
            },
            {
              "label": "Upper end of the range",
              "value": 149.0884930064958,
              "unit": "yd³"
            },
            {
              "label": "Width of the range",
              "value": 27.994163219307843,
              "unit": "%"
            },
            {
              "label": "Base diameter, from the circumference",
              "value": 31.329713207066014,
              "unit": "ft"
            },
            {
              "label": "Derived height, shallowest angle",
              "value": 12.238727305629173,
              "unit": "ft"
            },
            {
              "label": "Derived height, steepest angle",
              "value": 15.664856603533003,
              "unit": "ft"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "the same footprint in dry sand holds much less",
          "inputs": {
            "baseCircumference": 30,
            "material": "dry-sand",
            "flatToppedWidth": 0
          },
          "expected": 104.39,
          "toleranceDecimalPlaces": 0,
          "unit": "yd³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Lower end of the range",
              "value": 86.07628157037603,
              "unit": "yd³"
            },
            {
              "label": "Upper end of the range",
              "value": 104.392886663474,
              "unit": "yd³"
            },
            {
              "label": "Width of the range",
              "value": 21.27950320219433,
              "unit": "%"
            },
            {
              "label": "Base diameter, from the circumference",
              "value": 31.329713207066014,
              "unit": "ft"
            },
            {
              "label": "Derived height, shallowest angle",
              "value": 9.044109176866668,
              "unit": "ft"
            },
            {
              "label": "Derived height, steepest angle",
              "value": 10.968650678767961,
              "unit": "ft"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "levelling the top takes real volume out",
          "inputs": {
            "baseCircumference": 30,
            "material": "crushed-stone",
            "flatToppedWidth": 3
          },
          "expected": 144.47,
          "toleranceDecimalPlaces": 0,
          "unit": "yd³",
          "confidence": "low",
          "steps": [
            {
              "label": "Lower end of the range",
              "value": 112.86906395485921,
              "unit": "yd³"
            },
            {
              "label": "Upper end of the range",
              "value": 144.4658139424875,
              "unit": "yd³"
            },
            {
              "label": "Width of the range",
              "value": 27.994163219307865,
              "unit": "%"
            },
            {
              "label": "Base diameter, from the circumference",
              "value": 31.329713207066014,
              "unit": "ft"
            },
            {
              "label": "Derived height, shallowest angle",
              "value": 8.393817726363833,
              "unit": "ft"
            },
            {
              "label": "Derived height, steepest angle",
              "value": 10.74359676101332,
              "unit": "ft"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "stone-column-replacement-ratio-calculator",
      "title": "Vibro Stone Column Area Replacement Ratio Calculator",
      "url": "https://craftquantities.com/calculators/heavy-civil/stone-column-replacement-ratio-calculator/",
      "sources": [
        "Area replacement ratio (as) = stone column cross-sectional area / tributary soil area per column; for a triangular grid, tributary area = (sqrt(3)/2) x spacing²"
      ],
      "vectors": [
        {
          "name": "0.8m columns, 2.0m spacing",
          "inputs": {
            "columnDiameter": 0.8,
            "spacing": 2
          },
          "expected": 0.1451,
          "toleranceDecimalPlaces": 2,
          "unit": "(as)",
          "confidence": "high",
          "steps": [
            {
              "label": "Column cross-sectional area",
              "value": 0.5026548245743669,
              "unit": "m²"
            },
            {
              "label": "Tributary area per column",
              "value": 3.4641016151377544,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1.0m columns, 1.8m spacing",
          "inputs": {
            "columnDiameter": 1,
            "spacing": 1.8
          },
          "expected": 0.28,
          "toleranceDecimalPlaces": 2,
          "unit": "(as)",
          "confidence": "high",
          "steps": [
            {
              "label": "Column cross-sectional area",
              "value": 0.7853981633974483,
              "unit": "m²"
            },
            {
              "label": "Tributary area per column",
              "value": 2.8059223082615814,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "stone-slab-weight-calculator",
      "title": "Stone Slab Weight Calculator — Worktops, Flags and Panels",
      "url": "https://craftquantities.com/calculators/materials-quantities/stone-slab-weight-calculator/",
      "sources": [
        "Weight is the slab's volume times the material's density, with density given as the band each material spans: granite roughly 2600 to 2800 kg/m³, marble 2600 to 2850, quartzite 2600 to 2750, engineered quartz 2350 to 2500, slate 2700 to 2900",
        "AREAL DENSITY — thickness times density, in kilograms per square metre — is the figure a support is designed against, because it does not change with how the slab was cut. A 30 mm granite worktop is about 80 kg/m² at any size",
        "No manual-handling limit is quoted here. Those are set in regulation, depend on posture, lift height, reach and frequency, and reproducing one number from them would turn a conditional guideline into an unconditional threshold"
      ],
      "vectors": [
        {
          "name": "a 2.4 x 0.65 m granite worktop at 30 mm, upper end",
          "inputs": {
            "slabLength": 2.4,
            "slabWidth": 0.65,
            "thickness": 0.03,
            "material": "granite",
            "peopleCarrying": 2
          },
          "expected": 288.89,
          "toleranceDecimalPlaces": 0,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Lower end of the band",
              "value": 268.25848062655905,
              "unit": "lb"
            },
            {
              "label": "Upper end of the band",
              "value": 288.89374836706355,
              "unit": "lb"
            },
            {
              "label": "Load on the support",
              "value": 17.204556064291822,
              "unit": "lb/ft²"
            },
            {
              "label": "Share each of 2 carries, at best",
              "value": 144.44687418353178,
              "unit": "lb"
            },
            {
              "label": "Slab face area",
              "value": 16.791700250067166,
              "unit": "ft²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "the same worktop in engineered quartz is lighter",
          "inputs": {
            "slabLength": 2.4,
            "slabWidth": 0.65,
            "thickness": 0.03,
            "material": "engineered-quartz",
            "peopleCarrying": 2
          },
          "expected": 257.94,
          "toleranceDecimalPlaces": 0,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Lower end of the band",
              "value": 242.46439595092835,
              "unit": "lb"
            },
            {
              "label": "Upper end of the band",
              "value": 257.94084675630677,
              "unit": "lb"
            },
            {
              "label": "Load on the support",
              "value": 15.361210771689128,
              "unit": "lb/ft²"
            },
            {
              "label": "Share each of 2 carries, at best",
              "value": 128.97042337815338,
              "unit": "lb"
            },
            {
              "label": "Slab face area",
              "value": 16.791700250067166,
              "unit": "ft²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "a 20 mm top weighs two thirds of a 30 mm one",
          "inputs": {
            "slabLength": 2.4,
            "slabWidth": 0.65,
            "thickness": 0.02,
            "material": "granite",
            "peopleCarrying": 2
          },
          "expected": 192.6,
          "toleranceDecimalPlaces": 0,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Lower end of the band",
              "value": 178.8389870843727,
              "unit": "lb"
            },
            {
              "label": "Upper end of the band",
              "value": 192.59583224470904,
              "unit": "lb"
            },
            {
              "label": "Load on the support",
              "value": 11.469704042861215,
              "unit": "lb/ft²"
            },
            {
              "label": "Share each of 2 carries, at best",
              "value": 96.29791612235452,
              "unit": "lb"
            },
            {
              "label": "Slab face area",
              "value": 16.791700250067166,
              "unit": "ft²"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "stone-to-pounds-calculator",
      "title": "Stone to Pounds Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/stone-to-pounds-calculator/",
      "sources": [
        "1 stone = 14 avoirdupois pounds (exact), UK statutory definition",
        "International yard and pound agreement (1959): 1 lb = 0.45359237 kg exactly"
      ],
      "vectors": [
        {
          "name": "12 st converts correctly",
          "inputs": {
            "stone": 12
          },
          "expected": 168,
          "toleranceDecimalPlaces": 6,
          "unit": "lb",
          "confidence": "high",
          "steps": [
            {
              "label": "Same weight in kilograms",
              "value": 76.20351816,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "stone": 120
          },
          "expected": 1680,
          "toleranceDecimalPlaces": 6,
          "unit": "lb",
          "confidence": "high",
          "steps": [
            {
              "label": "Same weight in kilograms",
              "value": 762.0351816,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "stone-veneer-corner-unit-calculator",
      "title": "Manufactured Stone Veneer Corner Unit Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/stone-veneer-corner-unit-calculator/",
      "sources": [
        "Corner unit count = ceil((number of corners × wall height) ÷ average linear coverage per corner unit), since alternating long/short corner pieces average a consistent linear coverage per unit along the corner's height"
      ],
      "vectors": [
        {
          "name": "4 corners, 3m wall, 0.2m coverage",
          "inputs": {
            "cornerCount": 4,
            "wallHeight": 3,
            "unitLinearCoverage": 0.2
          },
          "expected": 60,
          "toleranceDecimalPlaces": 0,
          "unit": "corner units",
          "confidence": "high",
          "steps": [
            {
              "label": "Total corner height to cover",
              "value": 12,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "6 corners, 2.7m wall, 0.2m coverage",
          "inputs": {
            "cornerCount": 6,
            "wallHeight": 2.7,
            "unitLinearCoverage": 0.2
          },
          "expected": 81,
          "toleranceDecimalPlaces": 0,
          "unit": "corner units",
          "confidence": "high",
          "steps": [
            {
              "label": "Total corner height to cover",
              "value": 16.200000000000003,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "stone-veneer-mortar-calculator",
      "title": "Manufactured Stone Veneer Mortar Coverage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/stone-veneer-mortar-calculator/",
      "sources": [
        "Mortar volume = wall area × average setting-bed thickness, the standard method for a scratch coat and mortar bed applied beneath adhered manufactured stone veneer"
      ],
      "vectors": [
        {
          "name": "40m² wall, 25mm average thickness",
          "inputs": {
            "wallArea": 40,
            "averageThickness": 0.025
          },
          "expected": 1000,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "55m² wall, 20mm average thickness",
          "inputs": {
            "wallArea": 55,
            "averageThickness": 0.02
          },
          "expected": 1100,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "stone-veneer-weep-screed-calculator",
      "title": "Stone Veneer Weep Screed Linear Footage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/stone-veneer-weep-screed-calculator/",
      "sources": [
        "Total weep screed = wall perimeter × (1 + waste allowance), since a continuous weep screed runs along the base of the veneer wall to drain moisture and terminate the water-resistive barrier"
      ],
      "vectors": [
        {
          "name": "45m perimeter, 5% waste",
          "inputs": {
            "wallPerimeter": 45,
            "wastePercent": 5
          },
          "expected": 47.25,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "60m perimeter, 8% waste",
          "inputs": {
            "wallPerimeter": 60,
            "wastePercent": 8
          },
          "expected": 64.8,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "storefront-mullion-count-calculator",
      "title": "Storefront Mullion Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/storefront-mullion-count-calculator/",
      "sources": [
        "Interior mullions needed = ceil(total opening width ÷ maximum lite width) − 1, dividing the opening into the minimum number of equal lites that each stay within the maximum practical/rated glass width"
      ],
      "vectors": [
        {
          "name": "12m opening, 1.4m max lite",
          "inputs": {
            "totalWidth": 12,
            "maxLiteWidth": 1.4
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "mullions",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15m opening, 1.4m max lite",
          "inputs": {
            "totalWidth": 15,
            "maxLiteWidth": 1.4
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "mullions",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "storefront-sill-flashing-calculator",
      "title": "Storefront Sill Flashing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/storefront-sill-flashing-calculator/",
      "sources": [
        "Total sill flashing = sill length × (1 + waste allowance)"
      ],
      "vectors": [
        {
          "name": "25m sill, 5% waste",
          "inputs": {
            "sillLength": 25,
            "wastePercent": 5
          },
          "expected": 26.25,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "35m sill, 8% waste",
          "inputs": {
            "sillLength": 35,
            "wastePercent": 8
          },
          "expected": 37.8,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "storefront-track-calculator",
      "title": "Storefront Aluminum Framing Linear Footage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/storefront-track-calculator/",
      "sources": [
        "Total track length = total head + sill + jamb perimeter run × (1 + waste allowance)"
      ],
      "vectors": [
        {
          "name": "20m run, 5% waste",
          "inputs": {
            "perimeterRun": 20,
            "wastePercent": 5
          },
          "expected": 21,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30m run, 8% waste",
          "inputs": {
            "perimeterRun": 30,
            "wastePercent": 8
          },
          "expected": 32.4,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "storm-drain-slope-calculator",
      "title": "Storm Drain Pipe Slope Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/storm-drain-slope-calculator/",
      "sources": [
        "Slope percentage = ((upstream invert elevation − downstream invert elevation) ÷ horizontal distance) × 100, the standard method for checking a gravity drainage pipe's slope against minimum/maximum design requirements"
      ],
      "vectors": [
        {
          "name": "1m drop over 50m",
          "inputs": {
            "upstreamInvert": 100.5,
            "downstreamInvert": 99.5,
            "horizontalDistance": 50
          },
          "expected": 2,
          "toleranceDecimalPlaces": 1,
          "unit": "%",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1.8m drop over 60m",
          "inputs": {
            "upstreamInvert": 95.8,
            "downstreamInvert": 94,
            "horizontalDistance": 60
          },
          "expected": 3,
          "toleranceDecimalPlaces": 1,
          "unit": "%",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "structural-bolt-torque-calculator",
      "title": "High-Strength Structural Bolt Torque Calculator (ASTM F3125)",
      "url": "https://craftquantities.com/calculators/materials-quantities/structural-bolt-torque-calculator/",
      "sources": [
        "RCSC Specification for Structural Joints Using High-Strength Bolts / ASTM F3125: T = K × D × P, where K is the nut factor (~0.20 for plain, as-received hardware), D is bolt diameter, and P is the required minimum pretension from the RCSC table for the bolt's grade and size"
      ],
      "vectors": [
        {
          "name": "K=0.2, 19mm dia, 140kN pretension",
          "inputs": {
            "nutFactor": 0.2,
            "diameter": 0.019,
            "pretension": 140000
          },
          "expected": 532,
          "toleranceDecimalPlaces": 0,
          "unit": "N·m",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "K=0.18, 25mm dia, 200kN pretension",
          "inputs": {
            "nutFactor": 0.18,
            "diameter": 0.025,
            "pretension": 200000
          },
          "expected": 900,
          "toleranceDecimalPlaces": 0,
          "unit": "N·m",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "structural-column-pour-calculator",
      "title": "Structural Column Pour Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/structural-column-pour-calculator/",
      "sources": [
        "Concrete volume per column = width x depth x height; multiplied by the number of identical columns"
      ],
      "vectors": [
        {
          "name": "0.4x0.4x3m, 6 columns, 5% waste",
          "inputs": {
            "columnWidth": 0.4,
            "columnDepth": 0.4,
            "columnHeight": 3,
            "columnCount": 6,
            "wasteFactorPercent": 5
          },
          "expected": 3.024,
          "toleranceDecimalPlaces": 3,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume per column",
              "value": 0.4800000000000001,
              "unit": "m³"
            },
            {
              "label": "Base volume (no waste)",
              "value": 2.880000000000001,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "0.3x0.5x3.5m, 4 columns, 8% waste",
          "inputs": {
            "columnWidth": 0.3,
            "columnDepth": 0.5,
            "columnHeight": 3.5,
            "columnCount": 4,
            "wasteFactorPercent": 8
          },
          "expected": 2.268,
          "toleranceDecimalPlaces": 3,
          "unit": "m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Volume per column",
              "value": 0.525,
              "unit": "m³"
            },
            {
              "label": "Base volume (no waste)",
              "value": 2.1,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "structural-glass-fin-spacing-calculator",
      "title": "Structural Glass Fin Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/structural-glass-fin-spacing-calculator/",
      "sources": [
        "Glass fin count = ceil(wall width ÷ maximum fin spacing) + 1, the standard layout method for spacing structural glass fins supporting a frameless glazed wall"
      ],
      "vectors": [
        {
          "name": "12m wall, 1.4m max spacing",
          "inputs": {
            "wallWidth": 12,
            "maxFinSpacing": 1.4
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "glass fins",
          "confidence": "high",
          "steps": [
            {
              "label": "Bays between fins",
              "value": 9
            },
            {
              "label": "Fin centres across the wall",
              "value": 1.3333333333333333,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15m wall, 1.4m max spacing",
          "inputs": {
            "wallWidth": 15,
            "maxFinSpacing": 1.4
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "glass fins",
          "confidence": "high",
          "steps": [
            {
              "label": "Bays between fins",
              "value": 11
            },
            {
              "label": "Fin centres across the wall",
              "value": 1.3636363636363635,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "structural-steel-cubic-yards-to-tons-calculator",
      "title": "Structural Steel Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/structural-steel-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 6.6 short tons per cubic yard",
        "Density varies with moisture, grading and compaction — the supplier's ticket weight governs"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 66,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 6.6,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 660,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 6.6,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "structural-steel-tonnage-calculator",
      "title": "Structural Steel Tonnage Aggregator",
      "url": "https://craftquantities.com/calculators/materials-quantities/structural-steel-tonnage-calculator/",
      "sources": [
        "Total mass = total linear length × weight per unit length; converted to metric tons (1 tonne = 1000 kg)"
      ],
      "vectors": [
        {
          "name": "500m, 45kg/m",
          "inputs": {
            "totalLength": 500,
            "weightPerMeter": 45
          },
          "expected": 22.5,
          "toleranceDecimalPlaces": 1,
          "unit": "metric tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Total mass",
              "value": 22500,
              "unit": "kg"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "800m, 30kg/m",
          "inputs": {
            "totalLength": 800,
            "weightPerMeter": 30
          },
          "expected": 24,
          "toleranceDecimalPlaces": 0,
          "unit": "metric tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Total mass",
              "value": 24000,
              "unit": "kg"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "structural-steel-tons-to-cubic-yards-calculator",
      "title": "Structural Steel Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/structural-steel-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 6.6 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 1.5151515151515151,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.15151515151515152,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 15.151515151515152,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.15151515151515152,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "structural-steel-weld-shear-calculator",
      "title": "Fillet Weld Shear Capacity Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/structural-steel-weld-shear-calculator/",
      "sources": [
        "AISC 360 §J2.4 (Table J2.5): nominal weld strength Rn = 0.60×FEXX×Awe, where the effective throat Awe uses te = 0.707×leg size for an equal-leg fillet weld — consistent with AWS D1.1 Table 2.3"
      ],
      "vectors": [
        {
          "name": "8mm leg, E70XX, 200mm weld",
          "inputs": {
            "legSize": 0.008,
            "electrodeStrength": "483",
            "weldLength": 0.2
          },
          "expected": 327.8,
          "toleranceDecimalPlaces": -1,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Effective throat thickness",
              "value": 5.656,
              "unit": "mm"
            },
            {
              "label": "Capacity per mm of weld",
              "value": 1.6391088,
              "unit": "kN/mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "10mm leg, E70XX, 300mm weld",
          "inputs": {
            "legSize": 0.01,
            "electrodeStrength": "483",
            "weldLength": 0.3
          },
          "expected": 614.7,
          "toleranceDecimalPlaces": -1,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Effective throat thickness",
              "value": 7.069999999999999,
              "unit": "mm"
            },
            {
              "label": "Capacity per mm of weld",
              "value": 2.048886,
              "unit": "kN/mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "stucco-3coat-volume-calculator",
      "title": "Traditional 3-Coat Stucco Plaster Volume & Mass Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/stucco-3coat-volume-calculator/",
      "sources": [
        "3-coat stucco system volume = wall area × combined coat thickness (scratch + brown + finish); mass = volume × stucco mix density (commonly ~1800 kg/m³ for a portland cement stucco mix)"
      ],
      "vectors": [
        {
          "name": "50m² wall, 10/10/3mm coats, 1800 kg/m³",
          "inputs": {
            "wallArea": 50,
            "scratchThickness": 0.01,
            "brownThickness": 0.01,
            "finishThickness": 0.003,
            "stuccoDensity": 1800
          },
          "expected": 2070,
          "toleranceDecimalPlaces": 0,
          "unit": "kg",
          "confidence": "high",
          "steps": [
            {
              "label": "Total plaster volume",
              "value": 1.15,
              "unit": "m³"
            },
            {
              "label": "Combined coat thickness",
              "value": 23,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "70m² wall, 10/8/3mm coats, 1800 kg/m³",
          "inputs": {
            "wallArea": 70,
            "scratchThickness": 0.01,
            "brownThickness": 0.008,
            "finishThickness": 0.003,
            "stuccoDensity": 1800
          },
          "expected": 2646,
          "toleranceDecimalPlaces": 0,
          "unit": "kg",
          "confidence": "high",
          "steps": [
            {
              "label": "Total plaster volume",
              "value": 1.4700000000000002,
              "unit": "m³"
            },
            {
              "label": "Combined coat thickness",
              "value": 21,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "stucco-calculator",
      "title": "Stucco Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/stucco-calculator/",
      "sources": [
        "An 80 lb bag of stucco mix commonly covers approximately 100 sq ft at standard application thickness — always confirm against your specific product's coverage chart"
      ],
      "vectors": [
        {
          "name": "40m perimeter, 3m height, 2 doors, 8 windows",
          "inputs": {
            "wallLength": 40,
            "wallHeight": 3,
            "doorCount": 2,
            "windowCount": 8
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "bags",
          "confidence": "medium",
          "steps": [
            {
              "label": "Net wall area",
              "value": 1129.1342027128499,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "50m perimeter, 2.8m height, 2 doors, 10 windows",
          "inputs": {
            "wallLength": 50,
            "wallHeight": 2.8,
            "doorCount": 2,
            "windowCount": 10
          },
          "expected": 14,
          "toleranceDecimalPlaces": 0,
          "unit": "bags",
          "confidence": "medium",
          "steps": [
            {
              "label": "Net wall area",
              "value": 1314.273461880257,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "stucco-control-joint-calculator",
      "title": "Stucco Vertical Control Joint Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/stucco-control-joint-calculator/",
      "sources": [
        "Control joints needed = ceil(wall height ÷ maximum vertical spacing) − 1, keeping stucco panel dimensions within code-recommended limits (ASTM C1063 caps a stucco panel at 144 sq ft with no dimension over 18 ft, and 3.7 m — about 12 ft — is what that AREA cap allows across a 12 ft high wall, not the 18 ft dimension limit, which is 5.49 m in either dimension) to control shrinkage cracking"
      ],
      "vectors": [
        {
          "name": "6m wall, 3.7m max spacing",
          "inputs": {
            "wallHeight": 6,
            "maxSpacing": 3.7
          },
          "expected": 1,
          "toleranceDecimalPlaces": 0,
          "unit": "control joints",
          "confidence": "medium",
          "steps": [
            {
              "label": "Stucco panels up the wall",
              "value": 2
            },
            {
              "label": "Panel height between joints",
              "value": 3,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "9m wall, 3.7m max spacing",
          "inputs": {
            "wallHeight": 9,
            "maxSpacing": 3.7
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "control joints",
          "confidence": "medium",
          "steps": [
            {
              "label": "Stucco panels up the wall",
              "value": 3
            },
            {
              "label": "Panel height between joints",
              "value": 3,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "stucco-expansion-joint-calculator",
      "title": "Stucco/EIFS Expansion Joint Layout Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/stucco-expansion-joint-calculator/",
      "sources": [
        "Expansion joints needed = ceil(run length ÷ maximum spacing) − 1, keeping every panel within the manufacturer's maximum unbroken run (commonly around 9 m / 30 ft for control/expansion joints in cement-based EIFS/stucco systems)"
      ],
      "vectors": [
        {
          "name": "24m run, 9m max spacing",
          "inputs": {
            "runLength": 24,
            "maxSpacing": 9
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "expansion joints",
          "confidence": "medium",
          "steps": [
            {
              "label": "Panels along the run",
              "value": 3
            },
            {
              "label": "Panel length between joints",
              "value": 8,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "36m run, 11m max spacing",
          "inputs": {
            "runLength": 36,
            "maxSpacing": 11
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "expansion joints",
          "confidence": "medium",
          "steps": [
            {
              "label": "Panels along the run",
              "value": 4
            },
            {
              "label": "Panel length between joints",
              "value": 9,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "stucco-lath-calculator",
      "title": "Stucco Lath Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/stucco-lath-calculator/",
      "sources": [
        "Standard expanded metal lath sheet is 27 in x 96 in (18 sq ft); sheet count = area / 18, rounded up with a waste allowance"
      ],
      "vectors": [
        {
          "name": "40m² wall area",
          "inputs": {
            "wallArea": 40
          },
          "expected": 27,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets",
          "confidence": "high",
          "steps": [
            {
              "label": "Area to cover (with overlap allowance)",
              "value": 473.6120583352278,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "80m² wall area",
          "inputs": {
            "wallArea": 80
          },
          "expected": 53,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets",
          "confidence": "high",
          "steps": [
            {
              "label": "Area to cover (with overlap allowance)",
              "value": 947.2241166704556,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "stud-bore-notch-limit-calculator",
      "title": "Stud Boring and Notching Limit Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/stud-bore-notch-limit-calculator/",
      "sources": [
        "International Residential Code R602.6, drilling and notching of studs: notches limited to 25% of the stud width in an exterior wall or bearing partition and 40% in a non-bearing partition; bored holes limited to 40% of the stud width, or 60% where the stud is doubled in a bearing wall, with the hole edge no nearer than 5/8 in (16 mm) to the edge of the stud",
        "NFPA 70 (National Electrical Code) 300.4(A)(1): where the edge of a bored hole is less than 1-1/4 in (32 mm) from the nearest edge of the wood member, a steel plate not less than 1/16 in (1.6 mm) thick is required; notched members are protected the same way",
        "Adoption varies. Local amendments to the IRC change these percentages in some jurisdictions, and engineered or finger-jointed studs are governed by the manufacturer's evaluation report instead"
      ],
      "vectors": [
        {
          "name": "2x4 bearing wall, single stud, bored hole",
          "inputs": {
            "studWidth": "0.0889",
            "wallType": "bearing",
            "studCondition": "single",
            "cutType": "bore",
            "plannedSize": 0.0222
          },
          "expected": 35.56,
          "toleranceDecimalPlaces": 3,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Largest bore this stud allows",
              "value": 35.56,
              "unit": "mm"
            },
            {
              "label": "Deepest notch this stud allows",
              "value": 22.225,
              "unit": "mm"
            },
            {
              "label": "Cover left to the nearest face",
              "value": 33.35,
              "unit": "mm"
            },
            {
              "label": "Minimum clearance to the stud edge",
              "value": 15.875,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "2x6 non-bearing partition, notch",
          "inputs": {
            "studWidth": "0.1397",
            "wallType": "nonbearing",
            "studCondition": "single",
            "cutType": "notch",
            "plannedSize": 0.03
          },
          "expected": 55.88,
          "toleranceDecimalPlaces": 3,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Largest bore this stud allows",
              "value": 83.82,
              "unit": "mm"
            },
            {
              "label": "Deepest notch this stud allows",
              "value": 55.88,
              "unit": "mm"
            },
            {
              "label": "Cover left to the nearest face",
              "value": 0,
              "unit": "mm"
            },
            {
              "label": "Minimum clearance to the stud edge",
              "value": 15.875,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "2x6 bearing wall, doubled stud, bored hole",
          "inputs": {
            "studWidth": "0.1397",
            "wallType": "bearing",
            "studCondition": "doubled",
            "cutType": "bore",
            "plannedSize": 0.06
          },
          "expected": 83.82,
          "toleranceDecimalPlaces": 3,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Largest bore this stud allows",
              "value": 83.82,
              "unit": "mm"
            },
            {
              "label": "Deepest notch this stud allows",
              "value": 34.925,
              "unit": "mm"
            },
            {
              "label": "Cover left to the nearest face",
              "value": 39.849999999999994,
              "unit": "mm"
            },
            {
              "label": "Minimum clearance to the stud edge",
              "value": 15.875,
              "unit": "mm"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "stud-calculator",
      "title": "Stud Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/stud-calculator/",
      "sources": [
        "IRC R602.3 — stud spacing and size for load-bearing and non-load-bearing walls",
        "AS 1684.2 (AU) and BS 8103 (UK) give equivalent stud spacing rules for timber-framed construction"
      ],
      "vectors": [
        {
          "name": "6 m wall at 16 in, 1 opening, 2 corners",
          "inputs": {
            "wallLength": 6,
            "spacingIn": "16",
            "openings": 1,
            "corners": 2
          },
          "expected": 23,
          "toleranceDecimalPlaces": 0,
          "unit": "studs",
          "confidence": "medium",
          "steps": [
            {
              "label": "Field studs",
              "value": 16,
              "unit": "studs"
            },
            {
              "label": "Opening framing",
              "value": 3,
              "unit": "studs"
            },
            {
              "label": "Corner framing",
              "value": 4,
              "unit": "studs"
            },
            {
              "label": "Whole bays at the centres chosen",
              "value": 14
            },
            {
              "label": "Short bay where the wall ends",
              "value": 0.31040000000000045,
              "unit": "m"
            },
            {
              "label": "Plate material (single bottom, double top)",
              "value": 18,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Same wall at 24 in centres",
          "inputs": {
            "wallLength": 6,
            "spacingIn": "24",
            "openings": 1,
            "corners": 2
          },
          "expected": 18,
          "toleranceDecimalPlaces": 0,
          "unit": "studs",
          "confidence": "medium",
          "steps": [
            {
              "label": "Field studs",
              "value": 11,
              "unit": "studs"
            },
            {
              "label": "Opening framing",
              "value": 3,
              "unit": "studs"
            },
            {
              "label": "Corner framing",
              "value": 4,
              "unit": "studs"
            },
            {
              "label": "Whole bays at the centres chosen",
              "value": 9
            },
            {
              "label": "Short bay where the wall ends",
              "value": 0.5136000000000003,
              "unit": "m"
            },
            {
              "label": "Plate material (single bottom, double top)",
              "value": 18,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "No openings or corners",
          "inputs": {
            "wallLength": 6,
            "spacingIn": "16",
            "openings": 0,
            "corners": 0
          },
          "expected": 16,
          "toleranceDecimalPlaces": 0,
          "unit": "studs",
          "confidence": "medium",
          "steps": [
            {
              "label": "Field studs",
              "value": 16,
              "unit": "studs"
            },
            {
              "label": "Opening framing",
              "value": 0,
              "unit": "studs"
            },
            {
              "label": "Corner framing",
              "value": 0,
              "unit": "studs"
            },
            {
              "label": "Whole bays at the centres chosen",
              "value": 14
            },
            {
              "label": "Short bay where the wall ends",
              "value": 0.31040000000000045,
              "unit": "m"
            },
            {
              "label": "Plate material (single bottom, double top)",
              "value": 18,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Doubling the wall roughly doubles the field studs",
          "inputs": {
            "wallLength": 12,
            "spacingIn": "16",
            "openings": 0,
            "corners": 0
          },
          "expected": 31,
          "toleranceDecimalPlaces": 0,
          "unit": "studs",
          "confidence": "medium",
          "steps": [
            {
              "label": "Field studs",
              "value": 31,
              "unit": "studs"
            },
            {
              "label": "Opening framing",
              "value": 0,
              "unit": "studs"
            },
            {
              "label": "Corner framing",
              "value": 0,
              "unit": "studs"
            },
            {
              "label": "Whole bays at the centres chosen",
              "value": 29
            },
            {
              "label": "Short bay where the wall ends",
              "value": 0.21440000000000126,
              "unit": "m"
            },
            {
              "label": "Plate material (single bottom, double top)",
              "value": 36,
              "unit": "m"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "studs-to-linear-feet-16-oc-calculator",
      "title": "Studs to Linear Feet Calculator (16 in OC)",
      "url": "https://craftquantities.com/calculators/renovation-construction/studs-to-linear-feet-16-oc-calculator/",
      "sources": [
        "16 in on centre = 1.333 ft per stud; the inverse of 0.75 studs per foot"
      ],
      "vectors": [
        {
          "name": "31 studs frames the 40 ft wall they were counted for",
          "inputs": {
            "studs": 31
          },
          "expected": 40,
          "toleranceDecimalPlaces": 1,
          "unit": "ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Bays between studs",
              "value": 30,
              "unit": "bays"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30 studs",
          "inputs": {
            "studs": 30
          },
          "expected": 38.6667,
          "toleranceDecimalPlaces": 1,
          "unit": "ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Bays between studs",
              "value": 29,
              "unit": "bays"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Two studs make one bay",
          "inputs": {
            "studs": 2
          },
          "expected": 1.3333,
          "toleranceDecimalPlaces": 1,
          "unit": "ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Bays between studs",
              "value": 1,
              "unit": "bays"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "subgrade-excavation-truck-calculator",
      "title": "Road Subgrade Excavation Truck Fleet Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/subgrade-excavation-truck-calculator/",
      "sources": [
        "Truck loads = ceil(total excavated volume ÷ truck bed capacity), the standard method for estimating haul truck trips for bulk excavation material"
      ],
      "vectors": [
        {
          "name": "200m³ excavated, 12m³ truck",
          "inputs": {
            "totalVolume": 200000,
            "truckCapacity": 12000
          },
          "expected": 17,
          "toleranceDecimalPlaces": 0,
          "unit": "truck loads",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "350m³ excavated, 12m³ truck",
          "inputs": {
            "totalVolume": 350000,
            "truckCapacity": 12000
          },
          "expected": 30,
          "toleranceDecimalPlaces": 0,
          "unit": "truck loads",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "sump-discharge-pipe-calculator",
      "title": "Sump Pump Discharge Pipe Sizing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/sump-discharge-pipe-calculator/",
      "sources": [
        "Minimum pipe diameter = √(4×flow rate ÷ (π×maximum velocity)), derived from the pipe flow area equation, keeping discharge velocity within a safe range to avoid excessive friction loss and water hammer"
      ],
      "vectors": [
        {
          "name": "150 L/min, 1.5 m/s max velocity",
          "inputs": {
            "flowRate": 150,
            "maxVelocity": 1.5
          },
          "expected": 46.07,
          "toleranceDecimalPlaces": 1,
          "unit": "mm",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "200 L/min, 1.5 m/s max velocity",
          "inputs": {
            "flowRate": 200,
            "maxVelocity": 1.5
          },
          "expected": 53.19,
          "toleranceDecimalPlaces": 1,
          "unit": "mm",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "sump-pit-catch-basin-calculator",
      "title": "Sump Pit & Catch Basin Concrete Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/sump-pit-catch-basin-calculator/",
      "sources": [
        "Concrete volume = outer block volume minus the hollow interior void (an open-top box with walls and a base of uniform thickness)"
      ],
      "vectors": [
        {
          "name": "1.2x1.2x1.0m, 0.15m walls, 5% waste",
          "inputs": {
            "outerLength": 1.2,
            "outerWidth": 1.2,
            "outerHeight": 1,
            "wallThickness": 0.15,
            "wasteFactorPercent": 5
          },
          "expected": 0.789075,
          "toleranceDecimalPlaces": 6,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Outer block volume",
              "value": 1.44,
              "unit": "m³"
            },
            {
              "label": "Interior void volume",
              "value": 0.6884999999999999,
              "unit": "m³"
            },
            {
              "label": "Base volume (no waste)",
              "value": 0.7515000000000001,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1.5x1.0x1.2m, 0.2m walls, 8% waste",
          "inputs": {
            "outerLength": 1.5,
            "outerWidth": 1,
            "outerHeight": 1.2,
            "wallThickness": 0.2,
            "wasteFactorPercent": 8
          },
          "expected": 1.2312,
          "toleranceDecimalPlaces": 4,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Outer block volume",
              "value": 1.7999999999999998,
              "unit": "m³"
            },
            {
              "label": "Interior void volume",
              "value": 0.66,
              "unit": "m³"
            },
            {
              "label": "Base volume (no waste)",
              "value": 1.1399999999999997,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "sump-pump-gpm-calculator",
      "title": "Sump Pump GPM Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/sump-pump-gpm-calculator/",
      "sources": [
        "Basin volume = pi x radius² x fillable depth, converted to US gallons at 1728 ÷ 231 = 7.4805 per cubic foot (a cubic foot is 1,728 cubic inches and a US gallon 231 exactly); required pump GPM = basin volume in gallons / target fill time in minutes"
      ],
      "vectors": [
        {
          "name": "18in basin, 12in fillable depth, 2min fill",
          "inputs": {
            "basinDiameter": 0.457,
            "fillableDepth": 0.3,
            "fillTimeMinutes": 2
          },
          "expected": 6.4998,
          "toleranceDecimalPlaces": 4,
          "unit": "GPM (minimum)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Basin volume at fillable depth",
              "value": 12.999612490300768,
              "unit": "gal"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "0.6m basin, 0.4m fillable depth, 1.5min fill",
          "inputs": {
            "basinDiameter": 0.6,
            "fillableDepth": 0.4,
            "fillTimeMinutes": 1.5
          },
          "expected": 19.9181,
          "toleranceDecimalPlaces": 4,
          "unit": "GPM (minimum)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Basin volume at fillable depth",
              "value": 29.87715524299551,
              "unit": "gal"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "surface-bonding-cement-calculator",
      "title": "Surface Bonding Cement and Parge Coat Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/surface-bonding-cement-calculator/",
      "sources": [
        "QUIKRETE, QUIKWALL Surface Bonding Cement (No. 1230-1231) data sheet: alkali resistant fiberglass reinforced portland cement for dry-stack concrete block walls; each 50 lb (22.7 kg) bag covers approximately 50 ft² (4.65 m²) at 1/8\" (3.2 mm) thickness; applied to both sides of dry-stacked block at a minimum of 1/8\" (3.2 mm); meets ASTM C887; dry-stack construction to ASTM C946",
        "SAKRETE Surface Bonding Cement data sheet (Rev. 04/16): a 50 lb bag covers 35 - 40 ft² (3.25 – 3.7 m²) at 1/8\" (3.2 mm) thick; applied a minimum of 1/8\" (3.2 mm) to 1/2\" (13 mm) thick; \"To determine coverage: Multiply Length (feet) x Width (feet) x Thickness (inches) and divide by 12. Then divide by the yield\"; \"Yield and water are approximate\"",
        "QUIKRETE, Heavy Duty Masonry Coating data sheet: a portland cement coating for damp-proofing and resurfacing masonry; a 40 lb bag yields 0.46 cu ft (13 L) of mix and covers approximately 180 ft² (16.7 m²) at 1/32\" (0.8 mm)"
      ],
      "vectors": [
        {
          "name": "QUIKWALL on a dry-stacked wall, 20 m² a face, both faces at 3.2 mm",
          "inputs": {
            "wallArea": 20,
            "faces": "2",
            "coatThickness": 0.0032,
            "bagCoverageArea": 4.65,
            "bagCoverageThickness": 0.0032,
            "wastePercent": 0
          },
          "expected": 9,
          "toleranceDecimalPlaces": 0,
          "unit": "bags",
          "confidence": "high",
          "steps": [
            {
              "label": "Coat to place, every face counted",
              "value": 4.520277340350539,
              "unit": "ft³"
            },
            {
              "label": "One bag's yield",
              "value": 0.5254822408157503,
              "unit": "ft³"
            },
            {
              "label": "Face one bag covers at the coat entered",
              "value": 4.65,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Sakrete at the low end of its 35-40 sq ft, 400 sq ft of wall one face at 1/8 in",
          "inputs": {
            "wallArea": 37.161216,
            "faces": "1",
            "coatThickness": 0.003175,
            "bagCoverageArea": 3.2516064,
            "bagCoverageThickness": 0.003175,
            "wastePercent": 0
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "bags",
          "confidence": "high",
          "steps": [
            {
              "label": "Coat to place, every face counted",
              "value": 4.166666666666667,
              "unit": "ft³"
            },
            {
              "label": "One bag's yield",
              "value": 0.3645833333333333,
              "unit": "ft³"
            },
            {
              "label": "Face one bag covers at the coat entered",
              "value": 3.2516064,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Heavy Duty Masonry Coating, 1,000 sq ft one face at 1/16 in from a bag covering 180 sq ft at 1/32 in",
          "inputs": {
            "wallArea": 92.90304,
            "faces": "1",
            "coatThickness": 0.0015875,
            "bagCoverageArea": 16.7225472,
            "bagCoverageThickness": 0.00079375,
            "wastePercent": 0
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "bags",
          "confidence": "medium",
          "steps": [
            {
              "label": "Coat to place, every face counted",
              "value": 5.208333333333333,
              "unit": "ft³"
            },
            {
              "label": "One bag's yield",
              "value": 0.46875,
              "unit": "ft³"
            },
            {
              "label": "Face one bag covers at the coat entered",
              "value": 8.3612736,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "surface-temperature-factor-frsi-calculator",
      "title": "Surface Temperature Factor (fRsi) Calculator (BS EN ISO 13788, BRE IP 1/06)",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/surface-temperature-factor-frsi-calculator/",
      "sources": [
        "BS EN ISO 13788:2012, 3.1.2: fRsi = (θsi − θe) ÷ (θi − θe), calculated with an internal surface resistance Rsi; for a plane element fRsi = 1 − U × Rsi",
        "BS EN ISO 13788:2012, 4.4.1: Rsi = 0.25 m²K/W for condensation or mould growth on opaque surfaces, representing corners, furniture, curtains or suspended ceilings; for windows and doors the values of Table 2 (0.10 up, 0.13 horizontal, 0.17 down)",
        "BRE Information Paper IP 1/06, Assessing the effects of thermal bridging at junctions and around openings — critical temperature factors: storage 0.30; offices and retail 0.50; dwellings, residential buildings and schools 0.75; sports halls, kitchens and canteens 0.80; swimming pools, laundries and breweries 0.90"
      ],
      "vectors": [
        {
          "name": "The curtain-wall guide's frame at 3.5 with a film conductance of 8 (Rsi 0.125)",
          "inputs": {
            "method": "u-value",
            "uValue": 3.5,
            "rsi": 0.125,
            "insideTemp": 20,
            "outsideTemp": 0,
            "surfaceTemp": 15,
            "buildingType": "office"
          },
          "expected": 0.5625,
          "toleranceDecimalPlaces": 4,
          "unit": "ratio",
          "confidence": "high",
          "steps": [
            {
              "label": "Surface temperature at these air temperatures",
              "value": 11.25,
              "unit": "°C"
            },
            {
              "label": "Critical factor for this building type (BRE IP 1/06)",
              "value": 0.5
            },
            {
              "label": "Surface temperature the critical factor corresponds to",
              "value": 10,
              "unit": "°C"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The same guide's glass at 1.4",
          "inputs": {
            "method": "u-value",
            "uValue": 1.4,
            "rsi": 0.125,
            "insideTemp": 20,
            "outsideTemp": 0,
            "surfaceTemp": 15,
            "buildingType": "office"
          },
          "expected": 0.825,
          "toleranceDecimalPlaces": 4,
          "unit": "ratio",
          "confidence": "high",
          "steps": [
            {
              "label": "Surface temperature at these air temperatures",
              "value": 16.5,
              "unit": "°C"
            },
            {
              "label": "Critical factor for this building type (BRE IP 1/06)",
              "value": 0.5
            },
            {
              "label": "Surface temperature the critical factor corresponds to",
              "value": 10,
              "unit": "°C"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "An opaque element at 3.5 with the mould-assessment Rsi of 0.25",
          "inputs": {
            "method": "u-value",
            "uValue": 3.5,
            "rsi": 0.25,
            "insideTemp": 20,
            "outsideTemp": 0,
            "surfaceTemp": 15,
            "buildingType": "dwelling"
          },
          "expected": 0.125,
          "toleranceDecimalPlaces": 4,
          "unit": "ratio",
          "confidence": "high",
          "steps": [
            {
              "label": "Surface temperature at these air temperatures",
              "value": 2.5,
              "unit": "°C"
            },
            {
              "label": "Critical factor for this building type (BRE IP 1/06)",
              "value": 0.75
            },
            {
              "label": "Surface temperature the critical factor corresponds to",
              "value": 15,
              "unit": "°C"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Measured: 15 °C on the surface with 20 °C inside and 0 °C outside",
          "inputs": {
            "method": "temperatures",
            "uValue": 0.3,
            "rsi": 0.25,
            "insideTemp": 20,
            "outsideTemp": 0,
            "surfaceTemp": 15,
            "buildingType": "dwelling"
          },
          "expected": 0.75,
          "toleranceDecimalPlaces": 4,
          "unit": "ratio",
          "confidence": "high",
          "steps": [
            {
              "label": "Surface temperature entered",
              "value": 15,
              "unit": "°C"
            },
            {
              "label": "Critical factor for this building type (BRE IP 1/06)",
              "value": 0.75
            },
            {
              "label": "Surface temperature the critical factor corresponds to",
              "value": 15,
              "unit": "°C"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Measured on a mild day: 14.2 °C on the surface, 21 °C inside, 5 °C outside",
          "inputs": {
            "method": "temperatures",
            "uValue": 0.3,
            "rsi": 0.25,
            "insideTemp": 21,
            "outsideTemp": 5,
            "surfaceTemp": 14.2,
            "buildingType": "dwelling"
          },
          "expected": 0.575,
          "toleranceDecimalPlaces": 4,
          "unit": "ratio",
          "confidence": "high",
          "steps": [
            {
              "label": "Surface temperature entered",
              "value": 14.2,
              "unit": "°C"
            },
            {
              "label": "Critical factor for this building type (BRE IP 1/06)",
              "value": 0.75
            },
            {
              "label": "Surface temperature the critical factor corresponds to",
              "value": 17,
              "unit": "°C"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A store: 5 °C on the surface with 12 °C inside and 2 °C outside, on the storage threshold",
          "inputs": {
            "method": "temperatures",
            "uValue": 0.3,
            "rsi": 0.25,
            "insideTemp": 12,
            "outsideTemp": 2,
            "surfaceTemp": 5,
            "buildingType": "storage"
          },
          "expected": 0.3,
          "toleranceDecimalPlaces": 4,
          "unit": "ratio",
          "confidence": "high",
          "steps": [
            {
              "label": "Surface temperature entered",
              "value": 5,
              "unit": "°C"
            },
            {
              "label": "Critical factor for this building type (BRE IP 1/06)",
              "value": 0.3
            },
            {
              "label": "Surface temperature the critical factor corresponds to",
              "value": 5,
              "unit": "°C"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "A kitchen wall at 0.8 with Rsi 0.25, on the kitchens' threshold",
          "inputs": {
            "method": "u-value",
            "uValue": 0.8,
            "rsi": 0.25,
            "insideTemp": 20,
            "outsideTemp": 0,
            "surfaceTemp": 15,
            "buildingType": "sports-kitchen"
          },
          "expected": 0.8,
          "toleranceDecimalPlaces": 4,
          "unit": "ratio",
          "confidence": "high",
          "steps": [
            {
              "label": "Surface temperature at these air temperatures",
              "value": 16,
              "unit": "°C"
            },
            {
              "label": "Critical factor for this building type (BRE IP 1/06)",
              "value": 0.8
            },
            {
              "label": "Surface temperature the critical factor corresponds to",
              "value": 16,
              "unit": "°C"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "A pool hall wall at 0.4 with Rsi 0.25, on the pools' threshold",
          "inputs": {
            "method": "u-value",
            "uValue": 0.4,
            "rsi": 0.25,
            "insideTemp": 28,
            "outsideTemp": 0,
            "surfaceTemp": 15,
            "buildingType": "pool-laundry"
          },
          "expected": 0.9,
          "toleranceDecimalPlaces": 4,
          "unit": "ratio",
          "confidence": "high",
          "steps": [
            {
              "label": "Surface temperature at these air temperatures",
              "value": 25.2,
              "unit": "°C"
            },
            {
              "label": "Critical factor for this building type (BRE IP 1/06)",
              "value": 0.9
            },
            {
              "label": "Surface temperature the critical factor corresponds to",
              "value": 25.2,
              "unit": "°C"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "suspended-ceiling-wire-hanger-calculator",
      "title": "Suspended Ceiling Wire Hanger Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/suspended-ceiling-wire-hanger-calculator/",
      "sources": [
        "Hanger wire count = ceil(ceiling area ÷ maximum hanger grid spacing area) — suspended ceiling grids are typically hung on a 4 ft (1.2 m) o.c. grid in both directions per standard suspended-ceiling installation practice"
      ],
      "vectors": [
        {
          "name": "20m² ceiling, 1.2m grid",
          "inputs": {
            "ceilingArea": 20,
            "gridSpacing": 1.2
          },
          "expected": 14,
          "toleranceDecimalPlaces": 0,
          "unit": "hangers",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30m² ceiling, 1.2m grid",
          "inputs": {
            "ceilingArea": 30,
            "gridSpacing": 1.2
          },
          "expected": 21,
          "toleranceDecimalPlaces": 0,
          "unit": "hangers",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "tank-volume-calculator",
      "title": "Tank Volume Calculator (Litres and Gallons at Any Depth)",
      "url": "https://craftquantities.com/calculators/materials-quantities/tank-volume-calculator/",
      "sources": [
        "Neutrium, Volume and wetted area of partially filled horizontal vessels: the barrel as a circular segment, L(R² cos⁻¹((R − h)/R) − (R − h)√(2Rh − h²)); a hemispherical head πh²(3R − h)/6; a semi-ellipsoidal head D³C(π/12)(3(h/D)² − 2(h/D)³) with C = 1/2 for the ASME 2:1 head, whose depth is a quarter of the diameter, and C = 0.49951 + 0.10462 t/Do + 2.3227 (t/Do)² for a DIN 28013 head; torispherical heads, shallower than semi-ellipsoidal ones, with C = 0.30939 + 1.7197 (Rk − 0.06 Do)/Di − 0.16116 t/Do + 0.98997 (t/Do)² (ASME) and C = 0.37802 + 0.05073 t/Do + 1.3762 (t/Do)² (DIN 28011), where t is the wall thickness and Rk the knuckle radius (after Wiencke 2009, Doane 2007, Ludwig 1997)",
        "Neutrium, Volume and wetted area of partially filled vertical vessels: the cylindrical body (π/4)D²h; a semi-ellipsoidal bottom head D³C(π/24)(3(h/z)² − (h/z)³) with z the dish depth and C = 0.5 for the ASME 2:1 head; a hemispherical head (πh²/3)(3R − h)",
        "Wolfram MathWorld, Conical Frustum: V = πh(R₁² + R₁R₂ + R₂²)/3, applied from the outlet up to the level reached in a cone-bottom tank",
        "Wolfram MathWorld, Ellipse: the area of an ellipse with semi-axes a and b is πab, and the change of coordinates x′ = (b/a)x turns the ellipse into a circle of radius b — so every slice across an elliptical section is the circle's slice stretched by a/b, and a part-filled ellipse holds the circle's segment times width over height",
        "NIST Special Publication 811, Appendix B.8: gallon (U.S.) = 3.785 412 E−03 m³, and gallon [Canadian and U.K. (Imperial)] = 4.546 09 E−03 m³ — the two gallons the rows below state together with litres and cubic metres",
        "Derived on this page: a tank with straight vertical sides holds its plan area times the depth (the box, and the upright ellipse at πab), and a flat-sided oval is a rectangle between two half-circles of the smaller dimension, filled piece by piece with the circular segment above; the tests check both by integrating the width of each horizontal slice"
      ],
      "vectors": [
        {
          "name": "a 1.8 m upright water tank, 2 m high, with 0.6 m of water",
          "inputs": {
            "tankShape": "upright-cylinder",
            "ucDiameter": 1.8,
            "ucHeight": 2,
            "ucEnds": "flat",
            "liquidDepth": 0.6
          },
          "expected": 1526.814,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Capacity when full",
              "value": 5089.380098815465,
              "unit": "L"
            },
            {
              "label": "Space left above the liquid",
              "value": 3562.566069170826,
              "unit": "L"
            },
            {
              "label": "Liquid above the lowest draw-off",
              "value": 1526.8140296446395,
              "unit": "L"
            },
            {
              "label": "Depth as a share of the inside height",
              "value": 30,
              "unit": "%"
            },
            {
              "label": "Contents as a share of capacity",
              "value": 30,
              "unit": "%"
            },
            {
              "label": "Inside height, bottom to top",
              "value": 2,
              "unit": "m"
            },
            {
              "label": "Contents in litres (L)",
              "value": 1526.8140296446395,
              "unit": "L"
            },
            {
              "label": "Contents in cubic metres (m³)",
              "value": 1.5268140296446395,
              "unit": "m³"
            },
            {
              "label": "Contents in US gallons (gal)",
              "value": 403.34159578043926,
              "unit": "gal"
            },
            {
              "label": "Contents in imperial gallons (imp gal)",
              "value": 335.85213439343244,
              "unit": "imp gal"
            },
            {
              "label": "Capacity in litres (L)",
              "value": 5089.380098815465,
              "unit": "L"
            },
            {
              "label": "Capacity in cubic metres (m³)",
              "value": 5.089380098815465,
              "unit": "m³"
            },
            {
              "label": "Capacity in US gallons (gal)",
              "value": 1344.4719859347977,
              "unit": "gal"
            },
            {
              "label": "Capacity in imperial gallons (imp gal)",
              "value": 1119.507114644775,
              "unit": "imp gal"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "an upright capsule, 1.6 m across with a 2 m barrel, full",
          "inputs": {
            "tankShape": "upright-cylinder",
            "ucDiameter": 1.6,
            "ucHeight": 2,
            "ucEnds": "hemispherical",
            "liquidDepth": 3.6
          },
          "expected": 6165.9,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Capacity when full",
              "value": 6165.899181445568,
              "unit": "L"
            },
            {
              "label": "Space left above the liquid",
              "value": 0,
              "unit": "L"
            },
            {
              "label": "Liquid above the lowest draw-off",
              "value": 6165.899181445568,
              "unit": "L"
            },
            {
              "label": "Depth as a share of the inside height",
              "value": 100,
              "unit": "%"
            },
            {
              "label": "Contents as a share of capacity",
              "value": 100,
              "unit": "%"
            },
            {
              "label": "Inside height, bottom to top",
              "value": 3.6,
              "unit": "m"
            },
            {
              "label": "Contents in litres (L)",
              "value": 6165.899181445568,
              "unit": "L"
            },
            {
              "label": "Contents in cubic metres (m³)",
              "value": 6.1658991814455675,
              "unit": "m³"
            },
            {
              "label": "Contents in US gallons (gal)",
              "value": 1628.858241395903,
              "unit": "gal"
            },
            {
              "label": "Contents in imperial gallons (imp gal)",
              "value": 1356.3082080305421,
              "unit": "imp gal"
            },
            {
              "label": "Capacity in litres (L)",
              "value": 6165.899181445568,
              "unit": "L"
            },
            {
              "label": "Capacity in cubic metres (m³)",
              "value": 6.1658991814455675,
              "unit": "m³"
            },
            {
              "label": "Capacity in US gallons (gal)",
              "value": 1628.858241395903,
              "unit": "gal"
            },
            {
              "label": "Capacity in imperial gallons (imp gal)",
              "value": 1356.3082080305421,
              "unit": "imp gal"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "a 2:1 dished bottom head, 1.2 m across, filled to its rim holds πD³/24",
          "inputs": {
            "tankShape": "upright-cylinder",
            "ucDiameter": 1.2,
            "ucHeight": 1,
            "ucEnds": "dished",
            "liquidDepth": 0.3
          },
          "expected": 226.195,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Capacity when full",
              "value": 1583.3626974092556,
              "unit": "L"
            },
            {
              "label": "Space left above the liquid",
              "value": 1357.1680263507906,
              "unit": "L"
            },
            {
              "label": "Liquid above the lowest draw-off",
              "value": 226.19467105846505,
              "unit": "L"
            },
            {
              "label": "Depth as a share of the inside height",
              "value": 18.749999999999996,
              "unit": "%"
            },
            {
              "label": "Contents as a share of capacity",
              "value": 14.285714285714283,
              "unit": "%"
            },
            {
              "label": "Inside height, bottom to top",
              "value": 1.6,
              "unit": "m"
            },
            {
              "label": "Contents in litres (L)",
              "value": 226.19467105846505,
              "unit": "L"
            },
            {
              "label": "Contents in cubic metres (m³)",
              "value": 0.22619467105846505,
              "unit": "m³"
            },
            {
              "label": "Contents in US gallons (gal)",
              "value": 59.75431048599099,
              "unit": "gal"
            },
            {
              "label": "Contents in imperial gallons (imp gal)",
              "value": 49.75587176198998,
              "unit": "imp gal"
            },
            {
              "label": "Capacity in litres (L)",
              "value": 1583.3626974092556,
              "unit": "L"
            },
            {
              "label": "Capacity in cubic metres (m³)",
              "value": 1.5833626974092556,
              "unit": "m³"
            },
            {
              "label": "Capacity in US gallons (gal)",
              "value": 418.28017340193696,
              "unit": "gal"
            },
            {
              "label": "Capacity in imperial gallons (imp gal)",
              "value": 348.2911023339299,
              "unit": "imp gal"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "a lying 1.2 m cylinder, 2.5 m long, at a quarter of its depth holds under a fifth",
          "inputs": {
            "tankShape": "lying-cylinder",
            "lcDiameter": 1.2,
            "lcLength": 2.5,
            "lcEnds": "flat",
            "liquidDepth": 0.3
          },
          "expected": 552.767,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Capacity when full",
              "value": 2827.4333882308138,
              "unit": "L"
            },
            {
              "label": "Space left above the liquid",
              "value": 2274.667023856873,
              "unit": "L"
            },
            {
              "label": "Liquid above the lowest draw-off",
              "value": 552.7663643739406,
              "unit": "L"
            },
            {
              "label": "Depth as a share of the inside height",
              "value": 25,
              "unit": "%"
            },
            {
              "label": "Contents as a share of capacity",
              "value": 19.550110947788536,
              "unit": "%"
            },
            {
              "label": "Inside height, bottom to top",
              "value": 1.2,
              "unit": "m"
            },
            {
              "label": "Contents in litres (L)",
              "value": 552.7663643739406,
              "unit": "L"
            },
            {
              "label": "Contents in cubic metres (m³)",
              "value": 0.5527663643739407,
              "unit": "m³"
            },
            {
              "label": "Contents in US gallons (gal)",
              "value": 146.025424951216,
              "unit": "gal"
            },
            {
              "label": "Contents in imperial gallons (imp gal)",
              "value": 121.59160165635537,
              "unit": "imp gal"
            },
            {
              "label": "Capacity in litres (L)",
              "value": 2827.4333882308138,
              "unit": "L"
            },
            {
              "label": "Capacity in cubic metres (m³)",
              "value": 2.827433388230814,
              "unit": "m³"
            },
            {
              "label": "Capacity in US gallons (gal)",
              "value": 746.9288810748875,
              "unit": "gal"
            },
            {
              "label": "Capacity in imperial gallons (imp gal)",
              "value": 621.9483970248749,
              "unit": "imp gal"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "the same tank at half its depth holds exactly half",
          "inputs": {
            "tankShape": "lying-cylinder",
            "lcDiameter": 1.2,
            "lcLength": 2.5,
            "lcEnds": "flat",
            "liquidDepth": 0.6
          },
          "expected": 1413.717,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Capacity when full",
              "value": 2827.4333882308138,
              "unit": "L"
            },
            {
              "label": "Space left above the liquid",
              "value": 1413.7166941154069,
              "unit": "L"
            },
            {
              "label": "Liquid above the lowest draw-off",
              "value": 1413.7166941154069,
              "unit": "L"
            },
            {
              "label": "Depth as a share of the inside height",
              "value": 50,
              "unit": "%"
            },
            {
              "label": "Contents as a share of capacity",
              "value": 50,
              "unit": "%"
            },
            {
              "label": "Inside height, bottom to top",
              "value": 1.2,
              "unit": "m"
            },
            {
              "label": "Contents in litres (L)",
              "value": 1413.7166941154069,
              "unit": "L"
            },
            {
              "label": "Contents in cubic metres (m³)",
              "value": 1.413716694115407,
              "unit": "m³"
            },
            {
              "label": "Contents in US gallons (gal)",
              "value": 373.46444053744375,
              "unit": "gal"
            },
            {
              "label": "Contents in imperial gallons (imp gal)",
              "value": 310.97419851243745,
              "unit": "imp gal"
            },
            {
              "label": "Capacity in litres (L)",
              "value": 2827.4333882308138,
              "unit": "L"
            },
            {
              "label": "Capacity in cubic metres (m³)",
              "value": 2.827433388230814,
              "unit": "m³"
            },
            {
              "label": "Capacity in US gallons (gal)",
              "value": 746.9288810748875,
              "unit": "gal"
            },
            {
              "label": "Capacity in imperial gallons (imp gal)",
              "value": 621.9483970248749,
              "unit": "imp gal"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "the same tank full",
          "inputs": {
            "tankShape": "lying-cylinder",
            "lcDiameter": 1.2,
            "lcLength": 2.5,
            "lcEnds": "flat",
            "liquidDepth": 1.2
          },
          "expected": 2827.433,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Capacity when full",
              "value": 2827.4333882308138,
              "unit": "L"
            },
            {
              "label": "Space left above the liquid",
              "value": 0,
              "unit": "L"
            },
            {
              "label": "Liquid above the lowest draw-off",
              "value": 2827.4333882308138,
              "unit": "L"
            },
            {
              "label": "Depth as a share of the inside height",
              "value": 100,
              "unit": "%"
            },
            {
              "label": "Contents as a share of capacity",
              "value": 100,
              "unit": "%"
            },
            {
              "label": "Inside height, bottom to top",
              "value": 1.2,
              "unit": "m"
            },
            {
              "label": "Contents in litres (L)",
              "value": 2827.4333882308138,
              "unit": "L"
            },
            {
              "label": "Contents in cubic metres (m³)",
              "value": 2.827433388230814,
              "unit": "m³"
            },
            {
              "label": "Contents in US gallons (gal)",
              "value": 746.9288810748875,
              "unit": "gal"
            },
            {
              "label": "Contents in imperial gallons (imp gal)",
              "value": 621.9483970248749,
              "unit": "imp gal"
            },
            {
              "label": "Capacity in litres (L)",
              "value": 2827.4333882308138,
              "unit": "L"
            },
            {
              "label": "Capacity in cubic metres (m³)",
              "value": 2.827433388230814,
              "unit": "m³"
            },
            {
              "label": "Capacity in US gallons (gal)",
              "value": 746.9288810748875,
              "unit": "gal"
            },
            {
              "label": "Capacity in imperial gallons (imp gal)",
              "value": 621.9483970248749,
              "unit": "imp gal"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a lying tank with 2:1 dished ends, a third full by depth",
          "inputs": {
            "tankShape": "lying-cylinder",
            "lcDiameter": 1.2,
            "lcLength": 2.5,
            "lcEnds": "dished",
            "liquidDepth": 0.4
          },
          "expected": 942.307,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Capacity when full",
              "value": 3279.822730347744,
              "unit": "L"
            },
            {
              "label": "Space left above the liquid",
              "value": 2337.5158414816465,
              "unit": "L"
            },
            {
              "label": "Liquid above the lowest draw-off",
              "value": 942.3068888660972,
              "unit": "L"
            },
            {
              "label": "Depth as a share of the inside height",
              "value": 33.333333333333336,
              "unit": "%"
            },
            {
              "label": "Contents as a share of capacity",
              "value": 28.7304213165871,
              "unit": "%"
            },
            {
              "label": "Inside height, bottom to top",
              "value": 1.2,
              "unit": "m"
            },
            {
              "label": "Contents in litres (L)",
              "value": 942.3068888660972,
              "unit": "L"
            },
            {
              "label": "Contents in cubic metres (m³)",
              "value": 0.9423068888660973,
              "unit": "m³"
            },
            {
              "label": "Contents in US gallons (gal)",
              "value": 248.93114478297858,
              "unit": "gal"
            },
            {
              "label": "Contents in imperial gallons (imp gal)",
              "value": 207.27853801092743,
              "unit": "imp gal"
            },
            {
              "label": "Capacity in litres (L)",
              "value": 3279.822730347744,
              "unit": "L"
            },
            {
              "label": "Capacity in cubic metres (m³)",
              "value": 3.279822730347744,
              "unit": "m³"
            },
            {
              "label": "Capacity in US gallons (gal)",
              "value": 866.4375020468694,
              "unit": "gal"
            },
            {
              "label": "Capacity in imperial gallons (imp gal)",
              "value": 721.4601405488548,
              "unit": "imp gal"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a lying capsule at half depth: half the barrel and half a sphere",
          "inputs": {
            "tankShape": "lying-cylinder",
            "lcDiameter": 1.2,
            "lcLength": 2.5,
            "lcEnds": "hemispherical",
            "liquidDepth": 0.6
          },
          "expected": 1866.106,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Capacity when full",
              "value": 3732.212072464674,
              "unit": "L"
            },
            {
              "label": "Space left above the liquid",
              "value": 1866.106036232337,
              "unit": "L"
            },
            {
              "label": "Liquid above the lowest draw-off",
              "value": 1866.106036232337,
              "unit": "L"
            },
            {
              "label": "Depth as a share of the inside height",
              "value": 50,
              "unit": "%"
            },
            {
              "label": "Contents as a share of capacity",
              "value": 50,
              "unit": "%"
            },
            {
              "label": "Inside height, bottom to top",
              "value": 1.2,
              "unit": "m"
            },
            {
              "label": "Contents in litres (L)",
              "value": 1866.106036232337,
              "unit": "L"
            },
            {
              "label": "Contents in cubic metres (m³)",
              "value": 1.866106036232337,
              "unit": "m³"
            },
            {
              "label": "Contents in US gallons (gal)",
              "value": 492.97306150942575,
              "unit": "gal"
            },
            {
              "label": "Contents in imperial gallons (imp gal)",
              "value": 410.4859420364174,
              "unit": "imp gal"
            },
            {
              "label": "Capacity in litres (L)",
              "value": 3732.212072464674,
              "unit": "L"
            },
            {
              "label": "Capacity in cubic metres (m³)",
              "value": 3.732212072464674,
              "unit": "m³"
            },
            {
              "label": "Capacity in US gallons (gal)",
              "value": 985.9461230188515,
              "unit": "gal"
            },
            {
              "label": "Capacity in imperial gallons (imp gal)",
              "value": 820.9718840728348,
              "unit": "imp gal"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a 1.2 by 1 m box tank holding 0.6 m",
          "inputs": {
            "tankShape": "rectangular",
            "rectLength": 1.2,
            "rectWidth": 1,
            "rectHeight": 1,
            "liquidDepth": 0.6
          },
          "expected": 720,
          "toleranceDecimalPlaces": 6,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Capacity when full",
              "value": 1200,
              "unit": "L"
            },
            {
              "label": "Space left above the liquid",
              "value": 480,
              "unit": "L"
            },
            {
              "label": "Liquid above the lowest draw-off",
              "value": 720,
              "unit": "L"
            },
            {
              "label": "Depth as a share of the inside height",
              "value": 60,
              "unit": "%"
            },
            {
              "label": "Contents as a share of capacity",
              "value": 60,
              "unit": "%"
            },
            {
              "label": "Inside height, bottom to top",
              "value": 1,
              "unit": "m"
            },
            {
              "label": "Contents in litres (L)",
              "value": 720,
              "unit": "L"
            },
            {
              "label": "Contents in cubic metres (m³)",
              "value": 0.72,
              "unit": "m³"
            },
            {
              "label": "Contents in US gallons (gal)",
              "value": 190.20387769786686,
              "unit": "gal"
            },
            {
              "label": "Contents in imperial gallons (imp gal)",
              "value": 158.37785877534319,
              "unit": "imp gal"
            },
            {
              "label": "Capacity in litres (L)",
              "value": 1200,
              "unit": "L"
            },
            {
              "label": "Capacity in cubic metres (m³)",
              "value": 1.2,
              "unit": "m³"
            },
            {
              "label": "Capacity in US gallons (gal)",
              "value": 317.0064628297781,
              "unit": "gal"
            },
            {
              "label": "Capacity in imperial gallons (imp gal)",
              "value": 263.96309795890534,
              "unit": "imp gal"
            }
          ],
          "basis": "cited",
          "sourceIndex": 5
        },
        {
          "name": "an elliptical oval on its side, 1.6 by 1 m section, 2 m long, at 0.6 m",
          "inputs": {
            "tankShape": "lying-oval",
            "loWidth": 1.6,
            "loHeight": 1,
            "loLength": 2,
            "liquidDepth": 0.6
          },
          "expected": 1574.491,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Capacity when full",
              "value": 2513.2741228718346,
              "unit": "L"
            },
            {
              "label": "Space left above the liquid",
              "value": 938.7833812655292,
              "unit": "L"
            },
            {
              "label": "Liquid above the lowest draw-off",
              "value": 1574.4907416063054,
              "unit": "L"
            },
            {
              "label": "Depth as a share of the inside height",
              "value": 60,
              "unit": "%"
            },
            {
              "label": "Contents as a share of capacity",
              "value": 62.646996094766905,
              "unit": "%"
            },
            {
              "label": "Inside height, bottom to top",
              "value": 1,
              "unit": "m"
            },
            {
              "label": "Contents in litres (L)",
              "value": 1574.4907416063054,
              "unit": "L"
            },
            {
              "label": "Contents in cubic metres (m³)",
              "value": 1.5744907416063054,
              "unit": "m³"
            },
            {
              "label": "Contents in US gallons (gal)",
              "value": 415.93645062904085,
              "unit": "gal"
            },
            {
              "label": "Contents in imperial gallons (imp gal)",
              "value": 346.33954488501223,
              "unit": "imp gal"
            },
            {
              "label": "Capacity in litres (L)",
              "value": 2513.2741228718346,
              "unit": "L"
            },
            {
              "label": "Capacity in cubic metres (m³)",
              "value": 2.5132741228718345,
              "unit": "m³"
            },
            {
              "label": "Capacity in US gallons (gal)",
              "value": 663.9367831776779,
              "unit": "gal"
            },
            {
              "label": "Capacity in imperial gallons (imp gal)",
              "value": 552.8430195776666,
              "unit": "imp gal"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "an elliptical oval standing up, 1.6 by 1 m plan, at 0.6 m",
          "inputs": {
            "tankShape": "upright-oval",
            "uoLength": 1.6,
            "uoWidth": 1,
            "uoHeight": 1.5,
            "liquidDepth": 0.6
          },
          "expected": 753.982,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Capacity when full",
              "value": 1884.9555921538758,
              "unit": "L"
            },
            {
              "label": "Space left above the liquid",
              "value": 1130.9733552923256,
              "unit": "L"
            },
            {
              "label": "Liquid above the lowest draw-off",
              "value": 753.9822368615503,
              "unit": "L"
            },
            {
              "label": "Depth as a share of the inside height",
              "value": 40,
              "unit": "%"
            },
            {
              "label": "Contents as a share of capacity",
              "value": 40,
              "unit": "%"
            },
            {
              "label": "Inside height, bottom to top",
              "value": 1.5,
              "unit": "m"
            },
            {
              "label": "Contents in litres (L)",
              "value": 753.9822368615503,
              "unit": "L"
            },
            {
              "label": "Contents in cubic metres (m³)",
              "value": 0.7539822368615503,
              "unit": "m³"
            },
            {
              "label": "Contents in US gallons (gal)",
              "value": 199.18103495330334,
              "unit": "gal"
            },
            {
              "label": "Contents in imperial gallons (imp gal)",
              "value": 165.85290587329996,
              "unit": "imp gal"
            },
            {
              "label": "Capacity in litres (L)",
              "value": 1884.9555921538758,
              "unit": "L"
            },
            {
              "label": "Capacity in cubic metres (m³)",
              "value": 1.8849555921538759,
              "unit": "m³"
            },
            {
              "label": "Capacity in US gallons (gal)",
              "value": 497.95258738325833,
              "unit": "gal"
            },
            {
              "label": "Capacity in imperial gallons (imp gal)",
              "value": 414.63226468324996,
              "unit": "imp gal"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "a flat-sided tank, 27 by 44 by 60 in (686 by 1118 by 1524 mm), full",
          "inputs": {
            "tankShape": "obround",
            "obWidth": 0.6858,
            "obHeight": 1.1176,
            "obLength": 1.524,
            "liquidDepth": 1.1176
          },
          "expected": 1014.2497,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Capacity when full",
              "value": 1014.2497250074034,
              "unit": "L"
            },
            {
              "label": "Space left above the liquid",
              "value": 0,
              "unit": "L"
            },
            {
              "label": "Liquid above the lowest draw-off",
              "value": 1014.2497250074034,
              "unit": "L"
            },
            {
              "label": "Depth as a share of the inside height",
              "value": 100,
              "unit": "%"
            },
            {
              "label": "Contents as a share of capacity",
              "value": 100,
              "unit": "%"
            },
            {
              "label": "Inside height, bottom to top",
              "value": 1.1176,
              "unit": "m"
            },
            {
              "label": "Contents in litres (L)",
              "value": 1014.2497250074034,
              "unit": "L"
            },
            {
              "label": "Contents in cubic metres (m³)",
              "value": 1.0142497250074034,
              "unit": "m³"
            },
            {
              "label": "Contents in US gallons (gal)",
              "value": 267.9364314588934,
              "unit": "gal"
            },
            {
              "label": "Contents in imperial gallons (imp gal)",
              "value": 223.103749597435,
              "unit": "imp gal"
            },
            {
              "label": "Capacity in litres (L)",
              "value": 1014.2497250074034,
              "unit": "L"
            },
            {
              "label": "Capacity in cubic metres (m³)",
              "value": 1.0142497250074034,
              "unit": "m³"
            },
            {
              "label": "Capacity in US gallons (gal)",
              "value": 267.9364314588934,
              "unit": "gal"
            },
            {
              "label": "Capacity in imperial gallons (imp gal)",
              "value": 223.103749597435,
              "unit": "imp gal"
            }
          ],
          "basis": "cited",
          "sourceIndex": 5
        },
        {
          "name": "a cone-bottom tank filled only into its cone",
          "inputs": {
            "tankShape": "cone-bottom",
            "cbDiameter": 1.5,
            "cbHeight": 1.5,
            "cbConeHeight": 0.6,
            "cbOutlet": 0.1,
            "liquidDepth": 0.6
          },
          "expected": 378.562,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Capacity when full",
              "value": 3029.280716223958,
              "unit": "L"
            },
            {
              "label": "Space left above the liquid",
              "value": 2650.718801466388,
              "unit": "L"
            },
            {
              "label": "Liquid above the lowest draw-off",
              "value": 378.56191475757004,
              "unit": "L"
            },
            {
              "label": "Depth as a share of the inside height",
              "value": 28.57142857142857,
              "unit": "%"
            },
            {
              "label": "Contents as a share of capacity",
              "value": 12.496759139227379,
              "unit": "%"
            },
            {
              "label": "Inside height, bottom to top",
              "value": 2.1,
              "unit": "m"
            },
            {
              "label": "Contents in litres (L)",
              "value": 378.56191475757004,
              "unit": "L"
            },
            {
              "label": "Contents in cubic metres (m³)",
              "value": 0.37856191475757006,
              "unit": "m³"
            },
            {
              "label": "Contents in US gallons (gal)",
              "value": 100.00547796613772,
              "unit": "gal"
            },
            {
              "label": "Contents in imperial gallons (imp gal)",
              "value": 83.27197982388603,
              "unit": "imp gal"
            },
            {
              "label": "Capacity in litres (L)",
              "value": 3029.280716223958,
              "unit": "L"
            },
            {
              "label": "Capacity in cubic metres (m³)",
              "value": 3.029280716223958,
              "unit": "m³"
            },
            {
              "label": "Capacity in US gallons (gal)",
              "value": 800.2513039738448,
              "unit": "gal"
            },
            {
              "label": "Capacity in imperial gallons (imp gal)",
              "value": 666.3486020347062,
              "unit": "imp gal"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "the same cone-bottom tank full",
          "inputs": {
            "tankShape": "cone-bottom",
            "cbDiameter": 1.5,
            "cbHeight": 1.5,
            "cbConeHeight": 0.6,
            "cbOutlet": 0.1,
            "liquidDepth": 2.1
          },
          "expected": 3029.281,
          "toleranceDecimalPlaces": 2,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Capacity when full",
              "value": 3029.280716223958,
              "unit": "L"
            },
            {
              "label": "Space left above the liquid",
              "value": 0,
              "unit": "L"
            },
            {
              "label": "Liquid above the lowest draw-off",
              "value": 3029.280716223958,
              "unit": "L"
            },
            {
              "label": "Depth as a share of the inside height",
              "value": 100,
              "unit": "%"
            },
            {
              "label": "Contents as a share of capacity",
              "value": 100,
              "unit": "%"
            },
            {
              "label": "Inside height, bottom to top",
              "value": 2.1,
              "unit": "m"
            },
            {
              "label": "Contents in litres (L)",
              "value": 3029.280716223958,
              "unit": "L"
            },
            {
              "label": "Contents in cubic metres (m³)",
              "value": 3.029280716223958,
              "unit": "m³"
            },
            {
              "label": "Contents in US gallons (gal)",
              "value": 800.2513039738448,
              "unit": "gal"
            },
            {
              "label": "Contents in imperial gallons (imp gal)",
              "value": 666.3486020347062,
              "unit": "imp gal"
            },
            {
              "label": "Capacity in litres (L)",
              "value": 3029.280716223958,
              "unit": "L"
            },
            {
              "label": "Capacity in cubic metres (m³)",
              "value": 3.029280716223958,
              "unit": "m³"
            },
            {
              "label": "Capacity in US gallons (gal)",
              "value": 800.2513039738448,
              "unit": "gal"
            },
            {
              "label": "Capacity in imperial gallons (imp gal)",
              "value": 666.3486020347062,
              "unit": "imp gal"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "tankless-water-heater-calculator",
      "title": "Tankless Water Heater Sizing Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/tankless-water-heater-calculator/",
      "sources": [
        "Q = ṁ · c · ΔT. For water: kW = L/min × ΔT × 0.0698 (from 4.186 kJ/kg·K)",
        "Typical fixture flows: shower 7-11 L/min, basin 4-6, kitchen sink 6-9 — WaterSense and UK Water Regulations fittings data"
      ],
      "vectors": [
        {
          "name": "12 L/min from 10 to 42 °C",
          "inputs": {
            "flowRate": 12,
            "incomingTempC": 10,
            "outletTempC": 42
          },
          "expected": 26.79,
          "toleranceDecimalPlaces": 2,
          "unit": "kW",
          "confidence": "high",
          "steps": [
            {
              "label": "Temperature rise",
              "value": 32,
              "unit": "K"
            },
            {
              "label": "BTU/h",
              "value": 91412.63920815151,
              "unit": "BTU/h"
            },
            {
              "label": "Flow in US GPM",
              "value": 3.170064628297781,
              "unit": "GPM"
            },
            {
              "label": "Flow in gallons per hour",
              "value": 190.20387769786686,
              "unit": "GPH"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Colder mains needs more power",
          "inputs": {
            "flowRate": 12,
            "incomingTempC": 4,
            "outletTempC": 42
          },
          "expected": 31.81,
          "toleranceDecimalPlaces": 1,
          "unit": "kW",
          "confidence": "high",
          "steps": [
            {
              "label": "Temperature rise",
              "value": 38,
              "unit": "K"
            },
            {
              "label": "BTU/h",
              "value": 108552.50905967993,
              "unit": "BTU/h"
            },
            {
              "label": "Flow in US GPM",
              "value": 3.170064628297781,
              "unit": "GPM"
            },
            {
              "label": "Flow in gallons per hour",
              "value": 190.20387769786686,
              "unit": "GPH"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Half the flow, half the power",
          "inputs": {
            "flowRate": 6,
            "incomingTempC": 10,
            "outletTempC": 42
          },
          "expected": 13.4,
          "toleranceDecimalPlaces": 1,
          "unit": "kW",
          "confidence": "high",
          "steps": [
            {
              "label": "Temperature rise",
              "value": 32,
              "unit": "K"
            },
            {
              "label": "BTU/h",
              "value": 45706.319604075754,
              "unit": "BTU/h"
            },
            {
              "label": "Flow in US GPM",
              "value": 1.5850323141488905,
              "unit": "GPM"
            },
            {
              "label": "Flow in gallons per hour",
              "value": 95.10193884893343,
              "unit": "GPH"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "No rise needs no power",
          "inputs": {
            "flowRate": 12,
            "incomingTempC": 42,
            "outletTempC": 42
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "kW",
          "confidence": "high",
          "steps": [
            {
              "label": "Temperature rise",
              "value": 0,
              "unit": "K"
            },
            {
              "label": "BTU/h",
              "value": 0,
              "unit": "BTU/h"
            },
            {
              "label": "Flow in US GPM",
              "value": 3.170064628297781,
              "unit": "GPM"
            },
            {
              "label": "Flow in gallons per hour",
              "value": 190.20387769786686,
              "unit": "GPH"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "tapered-insulation-slope-calculator",
      "title": "Tapered Roof Insulation Slope Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/tapered-insulation-slope-calculator/",
      "sources": [
        "Thickness rise = run length × target slope ratio; maximum insulation thickness = minimum thickness + rise, the standard method for sizing a tapered insulation system that creates positive roof drainage toward a low point",
        "Rise across one tapered board = board width x slope ratio, which is why a four-foot board at a quarter inch per foot rises exactly one inch and at an eighth per foot exactly half",
        "Courses = run length / board width, rounded up; the tapered boards carry (thickest board - starter thickness) / rise-per-board courses before the sequence restarts on flat fill, and the fill under the high end is the total thickness less the thickest board made"
      ],
      "vectors": [
        {
          "name": "12m run, 2% slope, 50mm min",
          "inputs": {
            "runLength": 12,
            "slopeRatio": 0.02,
            "minThickness": 0.05
          },
          "expected": 290,
          "toleranceDecimalPlaces": 0,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Thickness rise across the run",
              "value": 240,
              "unit": "mm"
            },
            {
              "label": "Board courses from the drain to the high point",
              "value": null
            },
            {
              "label": "Rise across one board",
              "value": null,
              "unit": "mm"
            },
            {
              "label": "Width of the last course",
              "value": null,
              "unit": "mm"
            },
            {
              "label": "Courses before the taper restarts on fill",
              "value": 0
            },
            {
              "label": "Flat fill under the high end",
              "value": null,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "15m run, 2.0833% slope, 40mm min",
          "inputs": {
            "runLength": 15,
            "slopeRatio": 0.020833,
            "minThickness": 0.04
          },
          "expected": 352.5,
          "toleranceDecimalPlaces": -1,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Thickness rise across the run",
              "value": 312.495,
              "unit": "mm"
            },
            {
              "label": "Board courses from the drain to the high point",
              "value": null
            },
            {
              "label": "Rise across one board",
              "value": null,
              "unit": "mm"
            },
            {
              "label": "Width of the last course",
              "value": null,
              "unit": "mm"
            },
            {
              "label": "Courses before the taper restarts on fill",
              "value": 0
            },
            {
              "label": "Flat fill under the high end",
              "value": null,
              "unit": "mm"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "temp-fence-panel-count-calculator",
      "title": "Temporary Construction Fence Panel Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/temp-fence-panel-count-calculator/",
      "sources": [
        "Panel count = ceil(Perimeter Length ÷ Standard Panel Width) — standard temporary chain-link fence panels are commonly manufactured in 3.5m (11.5ft) or similar standard widths."
      ],
      "vectors": [
        {
          "name": "120m perimeter, 3.5m panels",
          "inputs": {
            "perimeterLength": 120,
            "panelWidth": 3.5
          },
          "expected": 35,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "200m perimeter, 3.66m panels",
          "inputs": {
            "perimeterLength": 200,
            "panelWidth": 3.66
          },
          "expected": 55,
          "toleranceDecimalPlaces": 0,
          "unit": "panels",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "temp-fence-wind-ballast-calculator",
      "title": "Temporary Fence Wind Load Overturning Ballast Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/temp-fence-wind-ballast-calculator/",
      "sources": [
        "Overturning moment = Wind Force × Height to Center of Pressure (mid-height for a uniform panel) = (Wind Pressure × Panel Area) × (Panel Height ÷ 2); Required ballast mass = Overturning Moment ÷ (9.81 × Ballast Arm Distance from the Tip Point) — a standard moment-equilibrium check for a free-standing panel resisting overturning (rotation about its base edge), distinct from this site's existing wind-UPLIFT ballast calculator (solar-mount-ballast-calculator), which resists a different failure mode (vertical lift-off, not sideways tip-over)."
      ],
      "vectors": [
        {
          "name": "2m x 3.5m panel, 500Pa wind, 0.3m ballast arm",
          "inputs": {
            "fenceHeight": 2,
            "fenceWidth": 3.5,
            "windPressure": 500,
            "ballastArm": 0.3
          },
          "expected": 1189.26,
          "toleranceDecimalPlaces": -1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total wind force on panel",
              "value": 3500,
              "unit": "N"
            },
            {
              "label": "Overturning moment",
              "value": 3500,
              "unit": "N·m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1.8m x 3.5m panel, 600Pa wind, 0.35m ballast arm",
          "inputs": {
            "fenceHeight": 1.8,
            "fenceWidth": 3.5,
            "windPressure": 600,
            "ballastArm": 0.35
          },
          "expected": 990.83,
          "toleranceDecimalPlaces": -1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total wind force on panel",
              "value": 3780,
              "unit": "N"
            },
            {
              "label": "Overturning moment",
              "value": 3402,
              "unit": "N·m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "temp-ramp-slope-calculator",
      "title": "Temporary Access Ramp Slope Compliance Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/temp-ramp-slope-calculator/",
      "sources": [
        "Slope percentage = (Rise ÷ Horizontal Run) × 100; run:rise ratio = Run ÷ Rise. The widely-referenced maximum ramp slope for accessible routes (per ADA Standards for Accessible Design / ANSI A117.1) is 1:12 (a rise of 1 inch for every 12 inches of run, ≈8.33%) — commonly used as a practical benchmark for temporary construction site ramps even when full ADA compliance isn't the specific driver, since it represents a widely-recognized safe/walkable maximum grade."
      ],
      "vectors": [
        {
          "name": "0.5m rise, 6m run (compliant, 12:1)",
          "inputs": {
            "rampRise": 0.5,
            "rampRun": 6
          },
          "expected": 8.33,
          "toleranceDecimalPlaces": 1,
          "unit": "%",
          "confidence": "high",
          "steps": [
            {
              "label": "Run-to-rise ratio",
              "value": 12,
              "unit": ":1 (target ≥12:1)"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "0.75m rise, 8m run (non-compliant, 10.67:1)",
          "inputs": {
            "rampRise": 0.75,
            "rampRun": 8
          },
          "expected": 9.375,
          "toleranceDecimalPlaces": 1,
          "unit": "%",
          "confidence": "low",
          "steps": [
            {
              "label": "Run-to-rise ratio",
              "value": 10.666666666666666,
              "unit": ":1 (target ≥12:1)"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "temperature-conversion-calculator",
      "title": "Temperature Conversion Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/temperature-conversion-calculator/",
      "sources": [
        "°C = (°F - 32) x 5/9; °F = °C x 9/5 + 32"
      ],
      "vectors": [
        {
          "name": "70°F to Celsius",
          "inputs": {
            "temperatureValue": 70,
            "fromUnit": "F"
          },
          "expected": 21.111,
          "toleranceDecimalPlaces": 0.1,
          "unit": "°C",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "25°C to Fahrenheit",
          "inputs": {
            "temperatureValue": 25,
            "fromUnit": "C"
          },
          "expected": 77,
          "toleranceDecimalPlaces": 0.1,
          "unit": "°F",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "temporary-needle-prop-load-calculator",
      "title": "Needle and Prop Load Calculator (Temporary Masonry Support)",
      "url": "https://craftquantities.com/calculators/materials-quantities/temporary-needle-prop-load-calculator/",
      "sources": [
        "Statics of a propped needle: the masonry above the opening is taken as a full rectangle of wall (height above opening × thickness × unit weight), any floor bearing on the wall is added as a line load, and the result is shared between needles on their spacing as a tributary width",
        "BS 5975, Code of practice for temporary works procedures and the permissible stress design of falsework — needling and propping is temporary works and requires a designer, a design brief and a check before any load is transferred",
        "The full rectangle above the opening is the CONSERVATIVE assumption and is used deliberately. Arching action in masonry can carry part of that weight around the opening, but it cannot be relied on where the wall is short above the opening, where another opening is nearby, or where the mortar is poor",
        "Masonry unit weight is entered by the user. The default of 2000 kg/m³ (about 125 pcf) sits inside the range normally taken for clay brickwork and dense concrete blockwork; lightweight blockwork is far lower and must be entered as such"
      ],
      "vectors": [
        {
          "name": "2.4 m of 215 mm brickwork over a 3 m opening with a domestic floor on it",
          "inputs": {
            "masonryHeightAbove": 2.4,
            "wallThickness": 0.215,
            "masonryDensity": 2000,
            "openingWidth": 3,
            "needleSpacing": 0.9,
            "floorPressure": 3000,
            "floorTributaryWidth": 2.5,
            "allowableBearingPressure": 100000
          },
          "expected": 15.858417,
          "toleranceDecimalPlaces": 3,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Load carried by each prop",
              "value": 7.92920826,
              "unit": "kN"
            },
            {
              "label": "Needles across the opening",
              "value": 4,
              "unit": "needles"
            },
            {
              "label": "Combined line load along the wall",
              "value": 17.620462800000002,
              "unit": "kN/m"
            },
            {
              "label": "Masonry share of that line load",
              "value": 10.120462799999999,
              "unit": "kN/m"
            },
            {
              "label": "Floor share of that line load",
              "value": 7.5,
              "unit": "kN/m"
            },
            {
              "label": "Sole plate bearing area required beneath each prop",
              "value": 0.07929208260000001,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "3 m of single-leaf blockwork, no floor bearing, needles at 1.2 m",
          "inputs": {
            "masonryHeightAbove": 3,
            "wallThickness": 0.1,
            "masonryDensity": 1900,
            "openingWidth": 4,
            "needleSpacing": 1.2,
            "floorPressure": 0,
            "floorTributaryWidth": 0,
            "allowableBearingPressure": 150000
          },
          "expected": 6.707751,
          "toleranceDecimalPlaces": 3,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Load carried by each prop",
              "value": 3.3538743,
              "unit": "kN"
            },
            {
              "label": "Needles across the opening",
              "value": 4,
              "unit": "needles"
            },
            {
              "label": "Combined line load along the wall",
              "value": 5.589790500000001,
              "unit": "kN/m"
            },
            {
              "label": "Masonry share of that line load",
              "value": 5.589790500000001,
              "unit": "kN/m"
            },
            {
              "label": "Floor share of that line load",
              "value": 0,
              "unit": "kN/m"
            },
            {
              "label": "Sole plate bearing area required beneath each prop",
              "value": 0.022359162000000002,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Shallow masonry, heavy floor — the floor dominates the line load",
          "inputs": {
            "masonryHeightAbove": 0.3,
            "wallThickness": 0.075,
            "masonryDensity": 1000,
            "openingWidth": 2,
            "needleSpacing": 0.6,
            "floorPressure": 5000,
            "floorTributaryWidth": 3,
            "allowableBearingPressure": 100000
          },
          "expected": 9.132394,
          "toleranceDecimalPlaces": 3,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Load carried by each prop",
              "value": 4.5661948875,
              "unit": "kN"
            },
            {
              "label": "Needles across the opening",
              "value": 4,
              "unit": "needles"
            },
            {
              "label": "Combined line load along the wall",
              "value": 15.220649625,
              "unit": "kN/m"
            },
            {
              "label": "Masonry share of that line load",
              "value": 0.220649625,
              "unit": "kN/m"
            },
            {
              "label": "Floor share of that line load",
              "value": 15,
              "unit": "kN/m"
            },
            {
              "label": "Sole plate bearing area required beneath each prop",
              "value": 0.045661948875,
              "unit": "m²"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "termination-bar-fastener-calculator",
      "title": "Roof Membrane Termination Bar Fastener Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/termination-bar-fastener-calculator/",
      "sources": [
        "Fastener count = ceil(termination bar length ÷ fastener spacing) + 1, the standard fastening layout method for a continuous termination bar securing a membrane edge"
      ],
      "vectors": [
        {
          "name": "50m bar, 0.3m spacing",
          "inputs": {
            "barLength": 50,
            "fastenerSpacing": 0.3
          },
          "expected": 168,
          "toleranceDecimalPlaces": 0,
          "unit": "fasteners",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "70m bar, 0.3m spacing",
          "inputs": {
            "barLength": 70,
            "fastenerSpacing": 0.3
          },
          "expected": 235,
          "toleranceDecimalPlaces": 0,
          "unit": "fasteners",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "terrazzo-divider-strip-calculator",
      "title": "Terrazzo Divider Strip Linear Footage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/terrazzo-divider-strip-calculator/",
      "sources": [
        "Total divider strip length = total pattern layout length × (1 + waste allowance), accounting for offcuts at pattern intersections and edges"
      ],
      "vectors": [
        {
          "name": "50m pattern, 5% waste",
          "inputs": {
            "patternLength": 50,
            "wastePercent": 5
          },
          "expected": 52.5,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "75m pattern, 8% waste",
          "inputs": {
            "patternLength": 75,
            "wastePercent": 8
          },
          "expected": 81,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "terrazzo-resin-aggregate-mix-calculator",
      "title": "Epoxy Terrazzo Resin-to-Aggregate Mix Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/terrazzo-resin-aggregate-mix-calculator/",
      "sources": [
        "Epoxy terrazzo mixes are typically specified by a resin:aggregate ratio by weight (commonly around 1:3.5 to 1:4); total mix mass = pour volume × blended mix density, split proportionally by the ratio"
      ],
      "vectors": [
        {
          "name": "20m² pour, 10mm thick, 2000 kg/m³, 1:3.5 ratio",
          "inputs": {
            "pourArea": 20,
            "pourThickness": 0.01,
            "mixDensity": 2000,
            "aggregateToResinRatio": 3.5
          },
          "expected": 311.11,
          "toleranceDecimalPlaces": -1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Resin needed",
              "value": 88.88888888888889,
              "unit": "kg"
            },
            {
              "label": "Total mix mass",
              "value": 400,
              "unit": "kg"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "25m² pour, 12mm thick, 2000 kg/m³, 1:4 ratio",
          "inputs": {
            "pourArea": 25,
            "pourThickness": 0.012,
            "mixDensity": 2000,
            "aggregateToResinRatio": 4
          },
          "expected": 480,
          "toleranceDecimalPlaces": -1,
          "unit": "kg",
          "confidence": "medium",
          "steps": [
            {
              "label": "Resin needed",
              "value": 120,
              "unit": "kg"
            },
            {
              "label": "Total mix mass",
              "value": 600,
              "unit": "kg"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "terzaghi-bearing-capacity-calculator",
      "title": "Shallow Foundation Bearing Capacity Calculator (Vesic Factors)",
      "url": "https://craftquantities.com/calculators/materials-quantities/terzaghi-bearing-capacity-calculator/",
      "sources": [
        "General bearing capacity equation: qu = c×Nc + q×Nq + 0.5×γ×B×Nγ, with the Prandtl–Reissner factors Nq = e^(π·tanφ)·tan²(45+φ/2) and Nc = (Nq−1)·cotφ (Nc = 5.14 at φ=0), and Vesic's Nγ = 2(Nq+1)·tanφ",
        "These are the factors Meyerhof, Hansen and Vesic use, not Terzaghi's own 1943 factors. Terzaghi's run higher — roughly 10–22% across this calculator's friction-angle range — so a capacity from this page is the more conservative of the two"
      ],
      "vectors": [
        {
          "name": "c=10kPa, φ=30°, q=20kPa, γ=18, B=2m",
          "inputs": {
            "cohesion": 10000,
            "frictionAngle": 30,
            "surchargePressure": 20000,
            "soilUnitWeight": 18,
            "footingWidth": 2
          },
          "expected": 1072.6,
          "toleranceDecimalPlaces": -1,
          "unit": "kN/m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Nc",
              "value": 30.139627791519086
            },
            {
              "label": "Nq",
              "value": 18.401122218708668
            },
            {
              "label": "Nγ",
              "value": 22.402486271104557
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "c=5kPa, φ=25°, q=15kPa, γ=17, B=1.5m",
          "inputs": {
            "cohesion": 5000,
            "frictionAngle": 25,
            "surchargePressure": 15000,
            "soilUnitWeight": 17,
            "footingWidth": 1.5
          },
          "expected": 402.3,
          "toleranceDecimalPlaces": -1,
          "unit": "kN/m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Nc",
              "value": 20.720531219083686
            },
            {
              "label": "Nq",
              "value": 10.66214238849845
            },
            {
              "label": "Nγ",
              "value": 10.876292612501707
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "theater-sightline-riser-calculator",
      "title": "Theater/Auditorium Sightline Riser Height Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/theater-sightline-riser-calculator/",
      "sources": [
        "Standard theater/auditorium sightline ('C-value') method: for a patron's eye at height H above a focal point (stage floor/screen bottom) at horizontal distance D1, the next row back (at distance D2 = D1 + row spacing) needs eye height H2 = D2×(H+C)/D1 to clear the head of the person in front by a vertical clearance C; required riser height = H2 − H. This is the standard method used in theater/auditorium design references (e.g. Neufert Architects' Data) for a single row-to-row sightline check."
      ],
      "vectors": [
        {
          "name": "10m to focal point, 1m row spacing, 1.1m eye height, 0.12m clearance",
          "inputs": {
            "distanceToFocalPoint": 10,
            "rowSpacing": 1,
            "eyeHeightAboveFocal": 1.1,
            "clearanceValue": 0.12
          },
          "expected": 0.242,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Required eye height at next row",
              "value": 1.342,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "8m to focal point, 0.9m row spacing, 1.0m eye height, 0.1m clearance",
          "inputs": {
            "distanceToFocalPoint": 8,
            "rowSpacing": 0.9,
            "eyeHeightAboveFocal": 1,
            "clearanceValue": 0.1
          },
          "expected": 0.224,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Required eye height at next row",
              "value": 1.2237500000000001,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "thermal-break-clip-calculator",
      "title": "Thermal Break Clip Spacing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/thermal-break-clip-calculator/",
      "sources": [
        "Clip grid count = (rows = ceil(wall height ÷ vertical spacing) + 1) × (clips per row = ceil(wall width ÷ horizontal spacing) + 1), the standard method for laying out a two-way fastening grid"
      ],
      "vectors": [
        {
          "name": "3m x 10m wall, 0.61m grid",
          "inputs": {
            "wallHeight": 3,
            "verticalSpacing": 0.61,
            "wallWidth": 10,
            "horizontalSpacing": 0.61
          },
          "expected": 108,
          "toleranceDecimalPlaces": 0,
          "unit": "clips",
          "confidence": "high",
          "steps": [
            {
              "label": "Rows",
              "value": 6
            },
            {
              "label": "Clips per row",
              "value": 18
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "3.5m x 12m wall, 0.61m grid",
          "inputs": {
            "wallHeight": 3.5,
            "verticalSpacing": 0.61,
            "wallWidth": 12,
            "horizontalSpacing": 0.61
          },
          "expected": 147,
          "toleranceDecimalPlaces": 0,
          "unit": "clips",
          "confidence": "high",
          "steps": [
            {
              "label": "Rows",
              "value": 7
            },
            {
              "label": "Clips per row",
              "value": 21
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "thermal-bridge-heat-loss-calculator",
      "title": "Thermal Bridge Heat Loss Calculator (ψ and χ Values)",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/thermal-bridge-heat-loss-calculator/",
      "sources": [
        "BS EN ISO 14683, Thermal bridges in building construction — Linear thermal transmittance; BS EN ISO 10211, Heat flows and surface temperatures — Detailed calculations: the heat loss of the bridges is Σψ × L + Σχ",
        "BRE BR 497, Conventions for calculating linear thermal transmittance and temperature factors",
        "ANSI/ASHRAE/IES Standard 90.1-2022, Section 5.5.5 and Appendix A Table A10.1: linear (ψ, Btu/h·ft·°F) and point (χ, Btu/h·°F) thermal bridges"
      ],
      "vectors": [
        {
          "name": "Two junctions and fifty brackets",
          "inputs": {
            "area": 100,
            "baseU": 0.2,
            "psi1": 0.05,
            "length1": 40,
            "psi2": 0.1,
            "length2": 20,
            "psi3": 0,
            "length3": 0,
            "psi4": 0,
            "length4": 0,
            "chi1": 0.03,
            "count1": 50,
            "chi2": 0,
            "count2": 0
          },
          "expected": 5.5,
          "toleranceDecimalPlaces": 4,
          "unit": "W/K",
          "confidence": "high",
          "steps": [
            {
              "label": "From the junctions (ψ × length)",
              "value": 4,
              "unit": "W/K"
            },
            {
              "label": "From the point bridges (χ × count)",
              "value": 1.5,
              "unit": "W/K"
            },
            {
              "label": "Added to the U-value by the bridges",
              "value": 0.055,
              "unit": "W/m²K"
            },
            {
              "label": "Effective U-value with the bridges",
              "value": 0.255,
              "unit": "W/m²K"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Clips alone: 120 at χ 0.04",
          "inputs": {
            "area": 80,
            "baseU": 0,
            "psi1": 0,
            "length1": 0,
            "psi2": 0,
            "length2": 0,
            "psi3": 0,
            "length3": 0,
            "psi4": 0,
            "length4": 0,
            "chi1": 0.04,
            "count1": 120,
            "chi2": 0,
            "count2": 0
          },
          "expected": 4.8,
          "toleranceDecimalPlaces": 4,
          "unit": "W/K",
          "confidence": "high",
          "steps": [
            {
              "label": "From the junctions (ψ × length)",
              "value": 0,
              "unit": "W/K"
            },
            {
              "label": "From the point bridges (χ × count)",
              "value": 4.8,
              "unit": "W/K"
            },
            {
              "label": "Added to the U-value by the bridges",
              "value": 0.06,
              "unit": "W/m²K"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A slab edge alone: ψ 0.3 along 25 m",
          "inputs": {
            "area": 60,
            "baseU": 0.25,
            "psi1": 0.3,
            "length1": 25,
            "psi2": 0,
            "length2": 0,
            "psi3": 0,
            "length3": 0,
            "psi4": 0,
            "length4": 0,
            "chi1": 0,
            "count1": 0,
            "chi2": 0,
            "count2": 0
          },
          "expected": 7.5,
          "toleranceDecimalPlaces": 4,
          "unit": "W/K",
          "confidence": "high",
          "steps": [
            {
              "label": "From the junctions (ψ × length)",
              "value": 7.5,
              "unit": "W/K"
            },
            {
              "label": "From the point bridges (χ × count)",
              "value": 0,
              "unit": "W/K"
            },
            {
              "label": "Added to the U-value by the bridges",
              "value": 0.125,
              "unit": "W/m²K"
            },
            {
              "label": "Effective U-value with the bridges",
              "value": 0.375,
              "unit": "W/m²K"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "thermal-bridging-calculator",
      "title": "Thermal Bridging Effective R-Value Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/thermal-bridging-calculator/",
      "sources": [
        "Parallel path method: effective R-value = 1 / ((framing fraction / framing R-value) + ((1 - framing fraction) / cavity R-value)) — the standard simplified method for estimating whole-wall R-value impact from framing"
      ],
      "vectors": [
        {
          "name": "R13 cavity, R4.4 framing, 25% framing factor (2x4 wall)",
          "inputs": {
            "cavityRValue": 13,
            "framingRValue": 4.4,
            "framingFactor": 0.25
          },
          "expected": 8.733,
          "toleranceDecimalPlaces": 3,
          "unit": "R (effective)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Nominal cavity-only R-value",
              "value": 13,
              "unit": "R"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "R19 cavity, R6.2 framing, 22% framing factor (2x6 wall)",
          "inputs": {
            "cavityRValue": 19,
            "framingRValue": 6.2,
            "framingFactor": 0.22
          },
          "expected": 13.066,
          "toleranceDecimalPlaces": 3,
          "unit": "R (effective)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Nominal cavity-only R-value",
              "value": 19,
              "unit": "R"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "therms-to-kwh-calculator",
      "title": "Therms to kWh Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/therms-to-kwh-calculator/",
      "sources": [
        "1 therm = 100,000 BTU (IT) by definition; 1 BTU (IT) = 1055.05585262 J (NIST SP 811, Appendix B)",
        "NIST SP 811 — 1 kWh = 3.6 MJ exactly"
      ],
      "vectors": [
        {
          "name": "50 therms is 1465 kWh",
          "inputs": {
            "therms": 50
          },
          "expected": 1465.3554,
          "toleranceDecimalPlaces": 3,
          "unit": "kWh",
          "confidence": "high",
          "steps": [
            {
              "label": "Therms entered",
              "value": 50,
              "unit": "therms"
            },
            {
              "label": "Kilowatt-hours",
              "value": 1465.3553508610999,
              "unit": "kWh"
            },
            {
              "label": "Megajoules",
              "value": 5275.279263099959,
              "unit": "MJ"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "1 therm is 29.31 kWh",
          "inputs": {
            "therms": 1
          },
          "expected": 29.307107,
          "toleranceDecimalPlaces": 5,
          "unit": "kWh",
          "confidence": "high",
          "steps": [
            {
              "label": "Therms entered",
              "value": 1,
              "unit": "therms"
            },
            {
              "label": "Kilowatt-hours",
              "value": 29.307107017222,
              "unit": "kWh"
            },
            {
              "label": "Megajoules",
              "value": 105.5055852619992,
              "unit": "MJ"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "10 therms is 293.1 kWh",
          "inputs": {
            "therms": 10
          },
          "expected": 293.07107,
          "toleranceDecimalPlaces": 4,
          "unit": "kWh",
          "confidence": "high",
          "steps": [
            {
              "label": "Therms entered",
              "value": 10,
              "unit": "therms"
            },
            {
              "label": "Kilowatt-hours",
              "value": 293.07107017222,
              "unit": "kWh"
            },
            {
              "label": "Megajoules",
              "value": 1055.055852619992,
              "unit": "MJ"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "100 therms is 2930.7 kWh",
          "inputs": {
            "therms": 100
          },
          "expected": 2930.7107,
          "toleranceDecimalPlaces": 3,
          "unit": "kWh",
          "confidence": "high",
          "steps": [
            {
              "label": "Therms entered",
              "value": 100,
              "unit": "therms"
            },
            {
              "label": "Kilowatt-hours",
              "value": 2930.7107017221997,
              "unit": "kWh"
            },
            {
              "label": "Megajoules",
              "value": 10550.558526199919,
              "unit": "MJ"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "thinset-mortar-calculator",
      "title": "Thinset & Tile Adhesive Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/thinset-mortar-calculator/",
      "sources": [
        "Coverage by notch size — CUSTOM Building Products VersaBond: data sheet TDS-119 (published 12/12/2023) gives 85-95 sq ft (7.9-8.8 m²) per 50 lb (22.68 kg) bag on a 1/4 in square notch, 2.6-2.9 kg/m²; the product page's coverage table gives 42-47 sq ft (3.9-4.4 m²) on a 1/2 in square notch, 5.2-5.8 kg/m²",
        "ARDEX S27, S28 and X7 data sheets: about 1.0, 1.1 and 1.3 kg of powder per m² per mm of adhesive bed, with S27 covering about 6.4 m² per 20 kg bag at the 3 mm bed a 6 mm square notch leaves. The table here is about 0.5 kg/m² per mm of notch: on ARDEX's line and a little above VersaBond's table, so it errs toward a spare bag. Larger tiles take larger notches and consume substantially more",
        "TCNA requires 80% mortar coverage for dry interior and 95% for wet areas and exterior — back-buttering is usually needed to achieve it on large formats and in wet areas"
      ],
      "vectors": [
        {
          "name": "12 m² at 10 mm notch, 20 kg bags",
          "inputs": {
            "area": 12,
            "notch": "10mm",
            "backButter": "no",
            "bagSize": 20
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "bags",
          "confidence": "medium",
          "steps": [
            {
              "label": "Adhesive required",
              "value": 60,
              "unit": "kg"
            },
            {
              "label": "Coverage rate",
              "value": 5,
              "unit": "kg/m²"
            },
            {
              "label": "Bag size",
              "value": 20,
              "unit": "kg"
            },
            {
              "label": "Surplus in the last bag",
              "value": 0,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Back-buttering adds a bag",
          "inputs": {
            "area": 12,
            "notch": "10mm",
            "backButter": "yes",
            "bagSize": 20
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "bags",
          "confidence": "medium",
          "steps": [
            {
              "label": "Adhesive required",
              "value": 78,
              "unit": "kg"
            },
            {
              "label": "Coverage rate",
              "value": 6.5,
              "unit": "kg/m²"
            },
            {
              "label": "Bag size",
              "value": 20,
              "unit": "kg"
            },
            {
              "label": "Surplus in the last bag",
              "value": 2,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A larger notch uses more",
          "inputs": {
            "area": 12,
            "notch": "20mm",
            "backButter": "no",
            "bagSize": 20
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "bags",
          "confidence": "medium",
          "steps": [
            {
              "label": "Adhesive required",
              "value": 108,
              "unit": "kg"
            },
            {
              "label": "Coverage rate",
              "value": 9,
              "unit": "kg/m²"
            },
            {
              "label": "Bag size",
              "value": 20,
              "unit": "kg"
            },
            {
              "label": "Surplus in the last bag",
              "value": 12,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A small mosaic job",
          "inputs": {
            "area": 3,
            "notch": "6mm",
            "backButter": "no",
            "bagSize": 20
          },
          "expected": 1,
          "toleranceDecimalPlaces": 0,
          "unit": "bags",
          "confidence": "medium",
          "steps": [
            {
              "label": "Adhesive required",
              "value": 9,
              "unit": "kg"
            },
            {
              "label": "Coverage rate",
              "value": 3,
              "unit": "kg/m²"
            },
            {
              "label": "Bag size",
              "value": 20,
              "unit": "kg"
            },
            {
              "label": "Surplus in the last bag",
              "value": 11,
              "unit": "kg"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "three-phase-power-calculator",
      "title": "Three-Phase Power Calculator",
      "url": "https://craftquantities.com/calculators/electrical/three-phase-power-calculator/",
      "sources": [
        "Standard three-phase power formula: P = sqrt(3) x V x I x power factor"
      ],
      "vectors": [
        {
          "name": "480V, 50A, 0.85 PF",
          "inputs": {
            "voltage": 480,
            "currentAmps": 50,
            "powerFactor": 0.85
          },
          "expected": 35.334,
          "toleranceDecimalPlaces": 3,
          "unit": "kW",
          "confidence": "high",
          "steps": [
            {
              "label": "Apparent power",
              "value": 41.56921938165305,
              "unit": "kVA"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "208V, 30A, 0.9 PF",
          "inputs": {
            "voltage": 208,
            "currentAmps": 30,
            "powerFactor": 0.9
          },
          "expected": 9.727,
          "toleranceDecimalPlaces": 3,
          "unit": "kW",
          "confidence": "high",
          "steps": [
            {
              "label": "Apparent power",
              "value": 10.807997039229793,
              "unit": "kVA"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "tile-adhesive-calculator",
      "title": "Tile Adhesive Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/tile-adhesive-calculator/",
      "sources": [
        "ARDEX S27, S28 and X7 data sheets: about 1.0, 1.1 and 1.3 kg of powder per m² per mm of adhesive bed; S27 covers about 6.4 m² per 20 kg bag at a 3 mm bed, the bed a 6 mm square notch leaves (about 3.1 kg/m²)",
        "CUSTOM Building Products VersaBond: data sheet TDS-119 (published 12/12/2023) gives 85-95 sq ft (7.9-8.8 m²) per 50 lb (22.68 kg) bag on a 1/4 in square notch, 2.6-2.9 kg/m²; the product page's coverage table gives 42-47 sq ft (3.9-4.4 m²) on a 1/2 in square notch, 5.2-5.8 kg/m². The rates here sit on ARDEX's line and a little above VersaBond's, so they err toward a spare bag",
        "A square-notch trowel leaves ridges covering roughly half the surface at full notch depth, so the mean bed is about half the notch: 6 mm works out at about 3 kg/m² and 10 mm at about 5 kg/m², the same per-notch rates as the site's thinset-mortar calculator",
        "Back-buttering and solid-bed work apply adhesive twice or fill the ridges completely, which is why the method is a multiplier on the combed figure rather than a separate rate"
      ],
      "vectors": [
        {
          "name": "20 m² on a 6 mm notch, combed bed, 10% waste",
          "inputs": {
            "tileArea": 20,
            "notchMm": "6",
            "method": "thinbed",
            "wastePercent": 10
          },
          "expected": 145.51,
          "toleranceDecimalPlaces": 1,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Mean bed depth",
              "value": 0.11811023622047245,
              "unit": "in"
            },
            {
              "label": "Consumption rate",
              "value": 0.6144484308675651,
              "unit": "lb/sq ft"
            },
            {
              "label": "Before waste",
              "value": 132.27735731092653,
              "unit": "lb"
            },
            {
              "label": "50 lb bags",
              "value": 3,
              "unit": "bags"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "the same area solid-bedded on a 10 mm notch",
          "inputs": {
            "tileArea": 20,
            "notchMm": "10",
            "method": "solid",
            "wastePercent": 10
          },
          "expected": 485.02,
          "toleranceDecimalPlaces": 1,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Mean bed depth",
              "value": 0.3937007874015748,
              "unit": "in"
            },
            {
              "label": "Consumption rate",
              "value": 2.0481614362252167,
              "unit": "lb/sq ft"
            },
            {
              "label": "Before waste",
              "value": 440.92452436975515,
              "unit": "lb"
            },
            {
              "label": "50 lb bags",
              "value": 10,
              "unit": "bags"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "mosaic on a 3 mm notch with no waste allowance",
          "inputs": {
            "tileArea": 5,
            "notchMm": "3",
            "method": "thinbed",
            "wastePercent": 0
          },
          "expected": 16.53,
          "toleranceDecimalPlaces": 1,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Mean bed depth",
              "value": 0.05905511811023623,
              "unit": "in"
            },
            {
              "label": "Consumption rate",
              "value": 0.30722421543378253,
              "unit": "lb/sq ft"
            },
            {
              "label": "Before waste",
              "value": 16.534669663865817,
              "unit": "lb"
            },
            {
              "label": "50 lb bags",
              "value": 1,
              "unit": "bags"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "large format on a 12 mm notch, back-buttered, no waste",
          "inputs": {
            "tileArea": 10,
            "notchMm": "12",
            "method": "buttered",
            "wastePercent": 0
          },
          "expected": 186.29,
          "toleranceDecimalPlaces": 1,
          "unit": "lb",
          "confidence": "medium",
          "steps": [
            {
              "label": "Mean bed depth",
              "value": 0.30708661417322836,
              "unit": "in"
            },
            {
              "label": "Consumption rate",
              "value": 1.7306964136103085,
              "unit": "lb/sq ft"
            },
            {
              "label": "Before waste",
              "value": 186.29061154622158,
              "unit": "lb"
            },
            {
              "label": "50 lb bags",
              "value": 4,
              "unit": "bags"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "tile-edge-profile-calculator",
      "title": "Tile Edge Profile (Trim Strip) Linear Footage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/tile-edge-profile-calculator/",
      "sources": [
        "Total edge profile = total exposed tile edge length × (1 + waste allowance), the standard method for estimating tile trim/edge profile strips"
      ],
      "vectors": [
        {
          "name": "30m exposed edge, 8% waste",
          "inputs": {
            "exposedEdgeLength": 30,
            "wastePercent": 8
          },
          "expected": 32.4,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "45m exposed edge, 10% waste",
          "inputs": {
            "exposedEdgeLength": 45,
            "wastePercent": 10
          },
          "expected": 49.5,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "tile-grout-calculator",
      "title": "Tile & Grout Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/tile-grout-calculator/",
      "sources": [
        "Tile count = area / tile coverage, with a waste factor for cuts; grout coverage depends on tile size, joint width, and grout depth",
        "A commonly-cited grout coverage rule of thumb: larger tiles and narrower joints need proportionally less grout per square foot"
      ],
      "vectors": [
        {
          "name": "4x3m area, 12x12in tile, 10% waste",
          "inputs": {
            "areaLength": 4,
            "areaWidth": 3,
            "tileSizeIn": 12,
            "wasteFactorPercent": 10
          },
          "expected": 143,
          "toleranceDecimalPlaces": -1,
          "unit": "tiles",
          "confidence": "medium",
          "steps": [
            {
              "label": "Area to tile",
              "value": 129.16692500051667,
              "unit": "sq ft"
            },
            {
              "label": "Estimated grout bags (rough)",
              "value": 2,
              "unit": "bags"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "5x4m area, 18x18in tile, 15% waste",
          "inputs": {
            "areaLength": 5,
            "areaWidth": 4,
            "tileSizeIn": 18,
            "wasteFactorPercent": 15
          },
          "expected": 111,
          "toleranceDecimalPlaces": -1,
          "unit": "tiles",
          "confidence": "medium",
          "steps": [
            {
              "label": "Area to tile",
              "value": 215.27820833419443,
              "unit": "sq ft"
            },
            {
              "label": "Estimated grout bags (rough)",
              "value": 3,
              "unit": "bags"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "tile-layout-calculator",
      "title": "Tile Layout Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/tile-layout-calculator/",
      "sources": [
        "Tile count = (floor area / area per tile) x (1 + waste factor), rounded up"
      ],
      "vectors": [
        {
          "name": "20m² area, 12x12in tile, 10% waste",
          "inputs": {
            "floorArea": 20,
            "tileLength": 0.3048,
            "tileWidth": 0.3048,
            "wasteFactorPercent": 10
          },
          "expected": 237,
          "toleranceDecimalPlaces": 0,
          "unit": "tiles",
          "confidence": "high",
          "steps": [
            {
              "label": "Area per tile",
              "value": 1,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "10m² area, 16x16in tile, 10% waste",
          "inputs": {
            "floorArea": 10,
            "tileLength": 0.4064,
            "tileWidth": 0.4064,
            "wasteFactorPercent": 10
          },
          "expected": 67,
          "toleranceDecimalPlaces": 0,
          "unit": "tiles",
          "confidence": "high",
          "steps": [
            {
              "label": "Area per tile",
              "value": 1.7777777777777777,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "tile-levelling-clip-calculator",
      "title": "Tile Levelling Clip and Wedge Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/tile-levelling-clip-calculator/",
      "sources": [
        "Joint geometry: each tile contributes (length + width) of shared joint, and there are 1 ÷ (length × width) tiles in a unit of area, so joint length per unit area is (L + W) ÷ (L × W)",
        "Levelling systems place a clip at intervals along every joint, typically 200 to 400 mm apart depending on tile size and how flat the substrate is",
        "Clips are consumed — the stem snaps off in the adhesive — while wedges are withdrawn and reused, so the two are bought in very different numbers"
      ],
      "vectors": [
        {
          "name": "20 m² of 600 × 600 tiles at 300 mm spacing, 10% allowance",
          "inputs": {
            "area": 20,
            "tileLength": 0.6,
            "tileWidth": 0.6,
            "spacing": 0.3,
            "wedgeReuse": 8,
            "wastePercent": 10
          },
          "expected": 245,
          "toleranceDecimalPlaces": 0,
          "unit": "clips",
          "confidence": "medium",
          "steps": [
            {
              "label": "Joint length",
              "value": 218.72265966754156,
              "unit": "ft"
            },
            {
              "label": "Clips before the allowance",
              "value": 223,
              "unit": "clips"
            },
            {
              "label": "Allowance at 10%",
              "value": 22,
              "unit": "clips"
            },
            {
              "label": "Boxes of 100",
              "value": 3,
              "unit": "boxes"
            },
            {
              "label": "Wedges, reused 8×",
              "value": 31,
              "unit": "wedges"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Planks have far more joint: 20 m² of 1,200 × 200, no allowance",
          "inputs": {
            "area": 20,
            "tileLength": 1.2,
            "tileWidth": 0.2,
            "spacing": 0.3,
            "wedgeReuse": 8,
            "wastePercent": 0
          },
          "expected": 389,
          "toleranceDecimalPlaces": 0,
          "unit": "clips",
          "confidence": "medium",
          "steps": [
            {
              "label": "Joint length",
              "value": 382.76465441819767,
              "unit": "ft"
            },
            {
              "label": "Clips before the allowance",
              "value": 389,
              "unit": "clips"
            },
            {
              "label": "Allowance at 0%",
              "value": 0,
              "unit": "clips"
            },
            {
              "label": "Boxes of 100",
              "value": 4,
              "unit": "boxes"
            },
            {
              "label": "Wedges, reused 8×",
              "value": 49,
              "unit": "wedges"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Halving the spacing doubles the order",
          "inputs": {
            "area": 20,
            "tileLength": 0.6,
            "tileWidth": 0.6,
            "spacing": 0.15,
            "wedgeReuse": 8,
            "wastePercent": 0
          },
          "expected": 445,
          "toleranceDecimalPlaces": 0,
          "unit": "clips",
          "confidence": "medium",
          "steps": [
            {
              "label": "Joint length",
              "value": 218.72265966754156,
              "unit": "ft"
            },
            {
              "label": "Clips before the allowance",
              "value": 445,
              "unit": "clips"
            },
            {
              "label": "Allowance at 0%",
              "value": 0,
              "unit": "clips"
            },
            {
              "label": "Boxes of 100",
              "value": 5,
              "unit": "boxes"
            },
            {
              "label": "Wedges, reused 8×",
              "value": 56,
              "unit": "wedges"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "tile-spacer-count-calculator",
      "title": "Ceramic/Porcelain Tile Spacer Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/tile-spacer-count-calculator/",
      "sources": [
        "Spacer count = tile count × spacers-per-tile factor. Since adjacent tiles share spacers at shared corners/edges, a commonly-used retail estimating factor is roughly 2.5 spacers per tile rather than 4 (one per corner) to account for sharing"
      ],
      "vectors": [
        {
          "name": "20m² area, 12x12in tile, 2.5 spacers/tile, 10% waste",
          "inputs": {
            "tileArea": 20,
            "tileLength": 0.3048,
            "tileWidth": 0.3048,
            "spacersPerTile": 2.5,
            "wastePercent": 10
          },
          "expected": 593,
          "toleranceDecimalPlaces": -1,
          "unit": "spacers",
          "confidence": "medium",
          "steps": [
            {
              "label": "Tile count",
              "value": 237
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30m² area, 60x30cm tile, 2.5 spacers/tile, 10% waste",
          "inputs": {
            "tileArea": 30,
            "tileLength": 0.6,
            "tileWidth": 0.3,
            "spacersPerTile": 2.5,
            "wastePercent": 10
          },
          "expected": 460,
          "toleranceDecimalPlaces": -1,
          "unit": "spacers",
          "confidence": "medium",
          "steps": [
            {
              "label": "Tile count",
              "value": 184
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "tiled-stair-calculator",
      "title": "Tiled Stair Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/tiled-stair-calculator/",
      "sources": [
        "Geometry: a flight's tread area is the step count times the width times the going, and its riser area the step count times the width times the rise",
        "Nosings are supplied in fixed stock lengths and each step needs one continuous piece, so the count is how many steps a stock length yields — not the total length divided by it",
        "Every tread and riser on a flight is a cut piece, which is why a stair carries a higher waste allowance than a floor of the same area"
      ],
      "vectors": [
        {
          "name": "13 steps, 900 mm wide, 250 going, 190 rise, 20% allowance",
          "inputs": {
            "steps": 13,
            "width": 0.9,
            "going": 0.25,
            "rise": 0.19,
            "nosingStock": 2.4,
            "wastePercent": 20
          },
          "expected": 66.5,
          "toleranceDecimalPlaces": 0,
          "unit": "sq ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Tread tile",
              "value": 31.484437968875937,
              "unit": "sq ft"
            },
            {
              "label": "Riser tile",
              "value": 23.928172856345714,
              "unit": "sq ft"
            },
            {
              "label": "Allowance at 20%",
              "value": 11.082522165044333,
              "unit": "sq ft"
            },
            {
              "label": "Pieces to cut",
              "value": 26,
              "unit": "pieces"
            },
            {
              "label": "Nosings, 2 per stock length",
              "value": 7,
              "unit": "lengths"
            },
            {
              "label": "Nosing offcut, unusable",
              "value": 16.732283464566926,
              "unit": "ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Open risers take only the treads",
          "inputs": {
            "steps": 13,
            "width": 0.9,
            "going": 0.25,
            "rise": 0,
            "nosingStock": 2.4,
            "wastePercent": 0
          },
          "expected": 31.48,
          "toleranceDecimalPlaces": 0,
          "unit": "sq ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Tread tile",
              "value": 31.484437968875937,
              "unit": "sq ft"
            },
            {
              "label": "Riser tile",
              "value": 0,
              "unit": "sq ft"
            },
            {
              "label": "Allowance at 0%",
              "value": 0,
              "unit": "sq ft"
            },
            {
              "label": "Pieces to cut",
              "value": 13,
              "unit": "pieces"
            },
            {
              "label": "Nosings, 2 per stock length",
              "value": 7,
              "unit": "lengths"
            },
            {
              "label": "Nosing offcut, unusable",
              "value": 16.732283464566926,
              "unit": "ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A narrow flight, 800 mm wide, is a smaller area and the same piece count",
          "inputs": {
            "steps": 13,
            "width": 0.8,
            "going": 0.25,
            "rise": 0.19,
            "nosingStock": 2.4,
            "wastePercent": 0
          },
          "expected": 49.25,
          "toleranceDecimalPlaces": 0,
          "unit": "sq ft",
          "confidence": "high",
          "steps": [
            {
              "label": "Tread tile",
              "value": 27.986167083445277,
              "unit": "sq ft"
            },
            {
              "label": "Riser tile",
              "value": 21.26948698341841,
              "unit": "sq ft"
            },
            {
              "label": "Allowance at 0%",
              "value": 0,
              "unit": "sq ft"
            },
            {
              "label": "Pieces to cut",
              "value": 26,
              "unit": "pieces"
            },
            {
              "label": "Nosings, 3 per stock length",
              "value": 5,
              "unit": "lengths"
            },
            {
              "label": "Nosing offcut, unusable",
              "value": 5.249343832020996,
              "unit": "ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "timber-beam-bending-stress-calculator",
      "title": "Timber Beam Bending Stress Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/timber-beam-bending-stress-calculator/",
      "sources": [
        "Rectangular section bending stress: fb = 6M/(b×d²), the standard flexure formula (fb = Mc/I) applied to a rectangular cross-section"
      ],
      "vectors": [
        {
          "name": "15 kN·m moment, 100x300mm section",
          "inputs": {
            "moment": 15,
            "beamWidth": 0.1,
            "beamDepth": 0.3
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "MPa",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "25 kN·m moment, 150x350mm section",
          "inputs": {
            "moment": 25,
            "beamWidth": 0.15,
            "beamDepth": 0.35
          },
          "expected": 8.16,
          "toleranceDecimalPlaces": 2,
          "unit": "MPa",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "timber-char-depth-calculator",
      "title": "Mass Timber Char Depth & Residual Section Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/timber-char-depth-calculator/",
      "sources": [
        "EN 1995-1-2 (Eurocode 5, Part 1-2: Structural fire design) reduced cross-section method: char depth is the product's notional charring rate times the fire-resistance period, with a zero-strength layer deducted in addition. Both the rate and the layer are entered here from the standard governing your design — this page publishes neither",
        "The National Design Specification for Wood Construction, Chapter 16, gives the equivalent char provisions used in US practice; its charring model and its allowance differ from the Eurocode one, so take both figures from a single document rather than mixing the two",
        "Sanding removes material from the same surface the char depth is measured inward from, so any thickness taken off comes straight out of the residual section — the arithmetic on this page is that subtraction and nothing more"
      ],
      "vectors": [
        {
          "name": "240 mm glulam width, 60 minutes at 0.7 mm/min, 7 mm zero-strength layer, two faces",
          "inputs": {
            "fireResistancePeriod": 60,
            "charringRate": 0.7,
            "zeroStrengthLayer": 0.007,
            "memberDimension": 0.24,
            "exposedFaces": "2",
            "requiredResidualDimension": 0.12
          },
          "expected": 142,
          "toleranceDecimalPlaces": 3,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Notional char depth",
              "value": 42,
              "unit": "mm"
            },
            {
              "label": "Effective loss per exposed face",
              "value": 49,
              "unit": "mm"
            },
            {
              "label": "Surface removable before the residual reaches the required minimum",
              "value": 22,
              "unit": "mm"
            },
            {
              "label": "Proportion of the original dimension surviving",
              "value": 59.166666666666664,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "400 mm depth, 90 minutes at 0.8 mm/min, 7 mm zero-strength layer, one face",
          "inputs": {
            "fireResistancePeriod": 90,
            "charringRate": 0.8,
            "zeroStrengthLayer": 0.007,
            "memberDimension": 0.4,
            "exposedFaces": "1",
            "requiredResidualDimension": 0.12
          },
          "expected": 321,
          "toleranceDecimalPlaces": 3,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Notional char depth",
              "value": 72,
              "unit": "mm"
            },
            {
              "label": "Effective loss per exposed face",
              "value": 79,
              "unit": "mm"
            },
            {
              "label": "Surface removable before the residual reaches the required minimum",
              "value": 201,
              "unit": "mm"
            },
            {
              "label": "Proportion of the original dimension surviving",
              "value": 80.25,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "timber-column-buckling-calculator",
      "title": "Timber Column Euler Buckling Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/timber-column-buckling-calculator/",
      "sources": [
        "Euler's critical buckling load formula: Pcr = π²EI/(KL)², where K is the effective length factor for the column's end conditions"
      ],
      "vectors": [
        {
          "name": "E=11000MPa, I=100e6mm⁴, K=1.0, L=3m",
          "inputs": {
            "elasticModulus": 11000000000,
            "momentOfInertia": 100,
            "effectiveLengthFactor": "1.0",
            "unbraceLength": 3
          },
          "expected": 1206.28,
          "toleranceDecimalPlaces": -1,
          "unit": "kN",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "E=11000MPa, I=80e6mm⁴, K=2.0, L=2.5m",
          "inputs": {
            "elasticModulus": 11000000000,
            "momentOfInertia": 80,
            "effectiveLengthFactor": "2.0",
            "unbraceLength": 2.5
          },
          "expected": 347.41,
          "toleranceDecimalPlaces": -1,
          "unit": "kN",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "timber-cross-grain-shrinkage-calculator",
      "title": "Timber Cross-Grain Shrinkage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/timber-cross-grain-shrinkage-calculator/",
      "sources": [
        "USDA Forest Products Laboratory, Wood Handbook: Wood as an Engineering Material (General Technical Report FPL-GTR-190), Chapter 4 — the dimensional change coefficient method, in which the change in a dimension equals the dimension multiplied by the coefficient and by the change in moisture content, valid below the fibre saturation point",
        "EN 1995-1-1 (Eurocode 5) service classes — service class 1 describes an environment in which the average moisture content of most softwoods will not exceed 12 per cent, and service class 2 one in which it will not exceed 20 per cent; those are the end points this calculation runs to",
        "EN 335, Durability of wood and wood-based products — Use classes, which describe the exposure a detail will actually see and therefore the moisture the timber in it will reach",
        "RULE OF THUMB, stated as one: platform-framed shortening is estimated by summing the depth of horizontally grained timber at each floor — sole plate, rim board or joist depth, and top plates — because those pieces shrink across their depth while the studs between them barely move at all"
      ],
      "vectors": [
        {
          "name": "300 mm of cross-grain timber drying from 19 to 10 per cent, three levels",
          "inputs": {
            "crossGrainDepth": 0.3,
            "moistureAtFixing": 19,
            "serviceMoisture": 10,
            "shrinkageCoefficient": 0.0026,
            "floorLevels": 3
          },
          "expected": 7.02,
          "toleranceDecimalPlaces": 3,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Accumulated movement over all floor levels",
              "value": 21.060000000000002,
              "unit": "mm"
            },
            {
              "label": "Depth remaining once the movement has happened",
              "value": 292.97999999999996,
              "unit": "mm"
            },
            {
              "label": "Movement for a single point of moisture change",
              "value": 0.78,
              "unit": "mm"
            },
            {
              "label": "Change in moisture content",
              "value": 9,
              "unit": "%"
            },
            {
              "label": "Proportion of the depth lost",
              "value": 2.34,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "A single 200 mm member drying from 24 to 12 per cent at a coefficient of 0.0030",
          "inputs": {
            "crossGrainDepth": 0.2,
            "moistureAtFixing": 24,
            "serviceMoisture": 12,
            "shrinkageCoefficient": 0.003,
            "floorLevels": 1
          },
          "expected": 7.2,
          "toleranceDecimalPlaces": 3,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Accumulated movement over all floor levels",
              "value": 7.200000000000001,
              "unit": "mm"
            },
            {
              "label": "Depth remaining once the movement has happened",
              "value": 192.8,
              "unit": "mm"
            },
            {
              "label": "Movement for a single point of moisture change",
              "value": 0.6000000000000001,
              "unit": "mm"
            },
            {
              "label": "Change in moisture content",
              "value": 12,
              "unit": "%"
            },
            {
              "label": "Proportion of the depth lost",
              "value": 3.6000000000000005,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Kiln-dried stock wetting from 8 to 16 per cent — the detail grows",
          "inputs": {
            "crossGrainDepth": 0.25,
            "moistureAtFixing": 8,
            "serviceMoisture": 16,
            "shrinkageCoefficient": 0.0025,
            "floorLevels": 2
          },
          "expected": -5,
          "toleranceDecimalPlaces": 3,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Accumulated movement over all floor levels",
              "value": -10,
              "unit": "mm"
            },
            {
              "label": "Depth remaining once the movement has happened",
              "value": 255,
              "unit": "mm"
            },
            {
              "label": "Movement for a single point of moisture change",
              "value": 0.625,
              "unit": "mm"
            },
            {
              "label": "Change in moisture content",
              "value": -8,
              "unit": "%"
            },
            {
              "label": "Proportion of the depth lost",
              "value": -2,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "timber-fastener-withdrawal-calculator",
      "title": "Timber Fastener Withdrawal Capacity Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/timber-fastener-withdrawal-calculator/",
      "sources": [
        "ANSI/AWC NDS, National Design Specification for Wood Construction, Chapter 12 — reference withdrawal design values W in pounds per inch of penetration: W = 1380·G^2.5·D for nails and spikes, W = 2850·G²·D for wood screws, and W = 1800·G^1.5·D^0.75 for lag screws, with D the shank diameter in inches and G the assigned specific gravity",
        "ANSI/AWC NDS — the end grain factor Ceg of 0.75 applied to lag screws loaded in withdrawal from end grain, and the rule that withdrawal design values are not permitted for nails and spikes driven into end grain",
        "ANSI/AWC NDS assigned specific gravities for common structural species combinations — Douglas Fir-Larch 0.50, Southern Pine 0.55, Hem-Fir 0.43, Spruce-Pine-Fir 0.42 — entered here as a value rather than picked from a built-in table, because the assignment belongs to the species combination and grading agency on the stamp",
        "EN 1995-1-1 Section 8 and EN 14592, Timber fasteners — the European route to the same quantity works from characteristic density and the withdrawal parameter declared for the specific screw, so a screw covered by a European Technical Assessment is designed on its declared value and not on the equations above"
      ],
      "vectors": [
        {
          "name": "Lag screw, 12 mm shank, 75 mm thread penetration, G = 0.50, six of them",
          "inputs": {
            "fastenerType": "lag_screw",
            "shankDiameter": 0.012,
            "penetration": 0.075,
            "specificGravity": 0.5,
            "grainOrientation": "side",
            "wetServiceFactor": 1,
            "fastenerCount": 6
          },
          "expected": 28.5794,
          "toleranceDecimalPlaces": 2,
          "unit": "kN",
          "confidence": "high",
          "steps": [
            {
              "label": "Withdrawal capacity of one fastener",
              "value": 4763.236240464738,
              "unit": "N"
            },
            {
              "label": "Withdrawal resistance per unit of penetration",
              "value": 63509.81653952985,
              "unit": "N/m"
            },
            {
              "label": "Fasteners in the group",
              "value": 6,
              "unit": "fasteners"
            },
            {
              "label": "Combined reduction applied for grain direction and moisture",
              "value": 1,
              "unit": "factor"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Same lag screws into end grain — the NDS 0.75 factor",
          "inputs": {
            "fastenerType": "lag_screw",
            "shankDiameter": 0.012,
            "penetration": 0.075,
            "specificGravity": 0.5,
            "grainOrientation": "end",
            "wetServiceFactor": 1,
            "fastenerCount": 6
          },
          "expected": 21.4346,
          "toleranceDecimalPlaces": 2,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Withdrawal capacity of one fastener",
              "value": 3572.4271803485535,
              "unit": "N"
            },
            {
              "label": "Withdrawal resistance per unit of penetration",
              "value": 47632.362404647385,
              "unit": "N/m"
            },
            {
              "label": "Fasteners in the group",
              "value": 6,
              "unit": "fasteners"
            },
            {
              "label": "Combined reduction applied for grain direction and moisture",
              "value": 0.75,
              "unit": "factor"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Twelve 4 mm nails, 40 mm penetration into G = 0.42 softwood",
          "inputs": {
            "fastenerType": "nail",
            "shankDiameter": 0.004,
            "penetration": 0.04,
            "specificGravity": 0.42,
            "grainOrientation": "side",
            "wetServiceFactor": 1,
            "fastenerCount": 12
          },
          "expected": 2.0884,
          "toleranceDecimalPlaces": 3,
          "unit": "kN",
          "confidence": "high",
          "steps": [
            {
              "label": "Withdrawal capacity of one fastener",
              "value": 174.03687557558777,
              "unit": "N"
            },
            {
              "label": "Withdrawal resistance per unit of penetration",
              "value": 4350.921889389694,
              "unit": "N/m"
            },
            {
              "label": "Fasteners in the group",
              "value": 12,
              "unit": "fasteners"
            },
            {
              "label": "Combined reduction applied for grain direction and moisture",
              "value": 1,
              "unit": "factor"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "The same nails into end grain — no withdrawal value at all",
          "inputs": {
            "fastenerType": "nail",
            "shankDiameter": 0.004,
            "penetration": 0.04,
            "specificGravity": 0.42,
            "grainOrientation": "end",
            "wetServiceFactor": 1,
            "fastenerCount": 12
          },
          "expected": 0,
          "toleranceDecimalPlaces": 3,
          "unit": "kN",
          "confidence": "medium",
          "steps": [
            {
              "label": "Withdrawal capacity of one fastener",
              "value": 0,
              "unit": "N"
            },
            {
              "label": "Withdrawal resistance per unit of penetration",
              "value": 0,
              "unit": "N/m"
            },
            {
              "label": "Fasteners in the group",
              "value": 12,
              "unit": "fasteners"
            },
            {
              "label": "Combined reduction applied for grain direction and moisture",
              "value": 0,
              "unit": "factor"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "One wood screw, 5 mm shank, 50 mm thread penetration, G = 0.55",
          "inputs": {
            "fastenerType": "wood_screw",
            "shankDiameter": 0.005,
            "penetration": 0.05,
            "specificGravity": 0.55,
            "grainOrientation": "side",
            "wetServiceFactor": 1,
            "fastenerCount": 1
          },
          "expected": 1.48604,
          "toleranceDecimalPlaces": 3,
          "unit": "kN",
          "confidence": "high",
          "steps": [
            {
              "label": "Withdrawal capacity of one fastener",
              "value": 1486.035657843194,
              "unit": "N"
            },
            {
              "label": "Withdrawal resistance per unit of penetration",
              "value": 29720.71315686388,
              "unit": "N/m"
            },
            {
              "label": "Fasteners in the group",
              "value": 1,
              "unit": "fasteners"
            },
            {
              "label": "Combined reduction applied for grain direction and moisture",
              "value": 1,
              "unit": "factor"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "timber-louver-shading-calculator",
      "title": "Exterior Timber Louver Solar Shading Angle Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/timber-louver-shading-calculator/",
      "sources": [
        "For blades stood on edge in a horizontal overhead canopy — a brise-soleil over glazing or a deck — the spacing that blocks sun above a target altitude is: spacing = blade depth ÷ tan(cutoff angle). The division is what identifies the device: raising the cutoff angle CLOSES this array up, because high sun comes down through the gaps between blades. A vertical screen of horizontal blades on a façade is the other geometry and multiplies instead — spacing = depth × tan(cutoff) — and at a 60° cutoff the two answers differ threefold"
      ],
      "vectors": [
        {
          "name": "0.15m louver depth, 45° cutoff",
          "inputs": {
            "louverDepth": 0.15,
            "cutoffAngle": 45
          },
          "expected": 0.15,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "0.2m louver depth, 60° cutoff",
          "inputs": {
            "louverDepth": 0.2,
            "cutoffAngle": 60
          },
          "expected": 0.1155,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "timber-notch-reduction-calculator",
      "title": "Timber Beam Notch Reduction Factor Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/timber-notch-reduction-calculator/",
      "sources": [
        "NDS (National Design Specification) 3.4.3: for a beam notched on the tension side at the end of the member, actual shear stress is amplified relative to net depth by the factor (full depth ÷ net depth)²"
      ],
      "vectors": [
        {
          "name": "300mm depth, 50mm notch",
          "inputs": {
            "fullDepth": 0.3,
            "notchDepth": 0.05
          },
          "expected": 1.44,
          "toleranceDecimalPlaces": 1,
          "unit": "×",
          "confidence": "high",
          "steps": [
            {
              "label": "Net depth after notch",
              "value": 250,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "250mm depth, 60mm notch",
          "inputs": {
            "fullDepth": 0.25,
            "notchDepth": 0.06
          },
          "expected": 1.7313,
          "toleranceDecimalPlaces": 1,
          "unit": "×",
          "confidence": "high",
          "steps": [
            {
              "label": "Net depth after notch",
              "value": 190,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "timber-shear-connector-count-calculator",
      "title": "Timber Shear Connector Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/timber-shear-connector-count-calculator/",
      "sources": [
        "NDS timber connector design values (split rings, shear plates) are species- and size-specific tables (NDS Chapter 12) rather than a single formula — this calculator divides your total required joint load by your own connector's rated capacity from that table or the manufacturer's data"
      ],
      "vectors": [
        {
          "name": "50kN load, 8kN/connector",
          "inputs": {
            "totalLoad": 50000,
            "perConnectorCapacity": 8000
          },
          "expected": 7,
          "toleranceDecimalPlaces": 0,
          "unit": "connector units",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "120kN load, 15kN/connector",
          "inputs": {
            "totalLoad": 120000,
            "perConnectorCapacity": 15000
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "connector units",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "toe-board-compliance-calculator",
      "title": "Guardrail Toe Board Height and Quantity Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/toe-board-compliance-calculator/",
      "sources": [
        "Per OSHA 29 CFR 1926.502(j) (verified against the regulatory text): toeboards must be 'a minimum of 3 1/2 inches (9 cm) in vertical height,' capable of withstanding 'a force of at least 50 pounds (222 N) applied in any downward or outward direction,' with 'not more than 1/4 inch (0.6 cm) clearance above the walking/working surface.' Board count = ceil(Perimeter Length ÷ Standard Board Stock Length)."
      ],
      "vectors": [
        {
          "name": "60m perimeter, 3.66m stock, 0.0889m height, 0.005m gap (pass)",
          "inputs": {
            "perimeterLength": 60,
            "boardStockLength": 3.66,
            "toeBoardHeight": 0.0889,
            "gapAboveSurface": 0.005
          },
          "expected": 17,
          "toleranceDecimalPlaces": 0,
          "unit": "board lengths",
          "confidence": "medium",
          "steps": [
            {
              "label": "Toe board height",
              "value": 3.5000000000000004,
              "unit": "in (OSHA min 3.5in)"
            },
            {
              "label": "Gap above surface",
              "value": 0.1968503937007874,
              "unit": "in (OSHA max 0.25in)"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "90m perimeter, 3.05m stock, 0.10m height, 0.003m gap (pass)",
          "inputs": {
            "perimeterLength": 90,
            "boardStockLength": 3.05,
            "toeBoardHeight": 0.1,
            "gapAboveSurface": 0.003
          },
          "expected": 30,
          "toleranceDecimalPlaces": 0,
          "unit": "board lengths",
          "confidence": "medium",
          "steps": [
            {
              "label": "Toe board height",
              "value": 3.9370078740157486,
              "unit": "in (OSHA min 3.5in)"
            },
            {
              "label": "Gap above surface",
              "value": 0.11811023622047245,
              "unit": "in (OSHA max 0.25in)"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "toilet-water-usage-calculator",
      "title": "Low-Flow Toilet Savings Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/toilet-water-usage-calculator/",
      "sources": [
        "Annual volume saved = (old flush volume − new flush volume) × flushes per day per person × household size × 365; WaterSense-certified toilets use 1.28 gal (≈4.85 L) or less per flush, vs 1.6 gal (6 L) standard or 3.5+ gal (13+ L) pre-1994 fixtures"
      ],
      "vectors": [
        {
          "name": "13.2 L (3.5 gal) to 4.8 L, 5 flushes/day, 3 people, 1.32/m³",
          "inputs": {
            "oldFlushVolume": 13.2,
            "newFlushVolume": 4.8,
            "flushesPerDayPerPerson": 5,
            "household": 3,
            "ratePerM3": 1.32
          },
          "expected": 60.71,
          "toleranceDecimalPlaces": 1,
          "unit": "currency/year",
          "confidence": "medium",
          "steps": [
            {
              "label": "Water saved per year",
              "value": 45989.99999999999,
              "unit": "L"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "6 L (1.6 gal) to 4.8 L, 4 flushes/day, 4 people, 1.585/m³ (≈$6/1,000 gal)",
          "inputs": {
            "oldFlushVolume": 6,
            "newFlushVolume": 4.8,
            "flushesPerDayPerPerson": 4,
            "household": 4,
            "ratePerM3": 1.585
          },
          "expected": 11.11,
          "toleranceDecimalPlaces": 1,
          "unit": "currency/year",
          "confidence": "medium",
          "steps": [
            {
              "label": "Water saved per year",
              "value": 7008.000000000001,
              "unit": "L"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "tonnes-to-tons-calculator",
      "title": "Metric Tonnes to Short Tons Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/tonnes-to-tons-calculator/",
      "sources": [
        "1 metric tonne = 1,000 kg = 2,204.62262 lb = 1.10231131 short tons"
      ],
      "vectors": [
        {
          "name": "10 tonnes converts correctly",
          "inputs": {
            "tonnes": 10
          },
          "expected": 11.0231131,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.10231131,
              "unit": "short tons per tonnes"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tonnes": 100
          },
          "expected": 110.23113099999999,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.10231131,
              "unit": "short tons per tonnes"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "tons-btu-kw-conversion-calculator",
      "title": "Refrigeration Tons, BTU/h and kW Converter",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/tons-btu-kw-conversion-calculator/",
      "sources": [
        "NIST Special Publication 811, Guide for the Use of the International System of Units, Appendix B.8: British thermal unit (International Table) per hour to watt, 2.930 711 E−01; ton of refrigeration (12 000 Btu_IT/h) to watt, 3.516 853 E+03; ton, short (2000 lb), the mass unit, to kilogram 9.071 847 E+02",
        "NIST Special Publication 811, footnotes: the Fifth International Conference on the Properties of Steam (London, 1956) defined the International Table calorie as 4.1868 J, so the International Table Btu is exactly 1.055 055 852 62 kJ; the thermochemical Btu rests on the thermochemical calorie of exactly 4.184 J"
      ],
      "vectors": [
        {
          "name": "Three tons is 36,000 BTU/h, by definition",
          "inputs": {
            "capacity": 3,
            "fromUnit": "tons",
            "tonsAnswerIn": "btuh"
          },
          "expected": 36000,
          "toleranceDecimalPlaces": 6,
          "unit": "BTU/h",
          "confidence": "high",
          "steps": [
            {
              "label": "In refrigeration tons",
              "value": 3,
              "unit": "refrigeration tons"
            },
            {
              "label": "In BTU per hour (BTU/h)",
              "value": 36000,
              "unit": "BTU/h"
            },
            {
              "label": "In kilowatts (kW)",
              "value": 10.55055852619992,
              "unit": "kW"
            },
            {
              "label": "In watts (W)",
              "value": 10550.55852619992,
              "unit": "W"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Three tons is 10.55 kW",
          "inputs": {
            "capacity": 3,
            "fromUnit": "tons",
            "tonsAnswerIn": "kw"
          },
          "expected": 10.5505585,
          "toleranceDecimalPlaces": 6,
          "unit": "kW",
          "confidence": "high",
          "steps": [
            {
              "label": "In refrigeration tons",
              "value": 3,
              "unit": "refrigeration tons"
            },
            {
              "label": "In BTU per hour (BTU/h)",
              "value": 36000,
              "unit": "BTU/h"
            },
            {
              "label": "In kilowatts (kW)",
              "value": 10.55055852619992,
              "unit": "kW"
            },
            {
              "label": "In watts (W)",
              "value": 10550.55852619992,
              "unit": "W"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "24,000 BTU/h is exactly two tons",
          "inputs": {
            "capacity": 24000,
            "fromUnit": "btuh",
            "tonsAnswerIn": "btuh"
          },
          "expected": 2,
          "toleranceDecimalPlaces": 6,
          "unit": "refrigeration tons",
          "confidence": "high",
          "steps": [
            {
              "label": "In refrigeration tons",
              "value": 2,
              "unit": "refrigeration tons"
            },
            {
              "label": "In BTU per hour (BTU/h)",
              "value": 24000,
              "unit": "BTU/h"
            },
            {
              "label": "In kilowatts (kW)",
              "value": 7.03370568413328,
              "unit": "kW"
            },
            {
              "label": "In watts (W)",
              "value": 7033.705684133281,
              "unit": "W"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A 10 kW heat pump is 2.843 tons",
          "inputs": {
            "capacity": 10,
            "fromUnit": "kw",
            "tonsAnswerIn": "btuh"
          },
          "expected": 2.8434514,
          "toleranceDecimalPlaces": 6,
          "unit": "refrigeration tons",
          "confidence": "high",
          "steps": [
            {
              "label": "In refrigeration tons",
              "value": 2.8434513609399734,
              "unit": "refrigeration tons"
            },
            {
              "label": "In BTU per hour (BTU/h)",
              "value": 34121.41633127968,
              "unit": "BTU/h"
            },
            {
              "label": "In kilowatts (kW)",
              "value": 10.000000000000002,
              "unit": "kW"
            },
            {
              "label": "In watts (W)",
              "value": 10000.000000000002,
              "unit": "W"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A 3.5 kW split unit is just under one ton",
          "inputs": {
            "capacity": 3.5,
            "fromUnit": "kw",
            "tonsAnswerIn": "btuh"
          },
          "expected": 0.995208,
          "toleranceDecimalPlaces": 6,
          "unit": "refrigeration tons",
          "confidence": "high",
          "steps": [
            {
              "label": "In refrigeration tons",
              "value": 0.9952079763289906,
              "unit": "refrigeration tons"
            },
            {
              "label": "In BTU per hour (BTU/h)",
              "value": 11942.495715947887,
              "unit": "BTU/h"
            },
            {
              "label": "In kilowatts (kW)",
              "value": 3.5,
              "unit": "kW"
            },
            {
              "label": "In watts (W)",
              "value": 3500,
              "unit": "W"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "tons-to-tonnes-calculator",
      "title": "Short Tons to Metric Tonnes Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/tons-to-tonnes-calculator/",
      "sources": [
        "1 short ton = 2,000 lb; 1 lb = 0.45359237 kg; so 1 short ton = 0.90718474 metric tonnes",
        "1 imperial long ton = 2,240 lb = 1.016047 metric tonnes"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "shortTons": 10
          },
          "expected": 9.071847400000001,
          "toleranceDecimalPlaces": 6,
          "unit": "tonnes",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.90718474,
              "unit": "tonnes per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "shortTons": 100
          },
          "expected": 90.718474,
          "toleranceDecimalPlaces": 6,
          "unit": "tonnes",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.90718474,
              "unit": "tonnes per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "topsoil-calculator",
      "title": "Topsoil Calculator",
      "url": "https://craftquantities.com/calculators/landscaping-outdoor/topsoil-calculator/",
      "sources": [
        "Garden beds commonly use 6-12 in of topsoil depth, deeper than typical mulch (2-4 in) or gravel base applications"
      ],
      "vectors": [
        {
          "name": "3x1.2m bed, 8in depth",
          "inputs": {
            "areaLength": 3,
            "areaWidth": 1.2,
            "depth": 0.2032
          },
          "expected": 0.96,
          "toleranceDecimalPlaces": 1,
          "unit": "cubic yards",
          "confidence": "high",
          "steps": [
            {
              "label": "Area",
              "value": 3.5999999999999996,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "5x5m bed, 6in depth",
          "inputs": {
            "areaLength": 5,
            "areaWidth": 5,
            "depth": 0.1524
          },
          "expected": 4.98,
          "toleranceDecimalPlaces": 1,
          "unit": "cubic yards",
          "confidence": "high",
          "steps": [
            {
              "label": "Area",
              "value": 25,
              "unit": "m²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "topsoil-cubic-yards-to-tons-calculator",
      "title": "Topsoil Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/topsoil-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 1.2 short tons per cubic yard",
        "Bulk density varies with moisture, compaction and grading — the supplier's weighbridge ticket governs"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 12,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.2,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 120,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.2,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "topsoil-screened-cubic-yards-to-tons-calculator",
      "title": "Screened Topsoil Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/topsoil-screened-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 1.15 short tons per cubic yard",
        "Density varies with moisture, composition and how the material was broken or processed"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 11.5,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.15,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 114.99999999999999,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.15,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "topsoil-screened-tons-to-cubic-yards-calculator",
      "title": "Screened Topsoil Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/topsoil-screened-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 1.15 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 8.695652173913045,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.8695652173913044,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 86.95652173913044,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.8695652173913044,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "topsoil-tons-to-cubic-yards-calculator",
      "title": "Topsoil Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/topsoil-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 1.2 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 8.333333333333334,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.8333333333333334,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 83.33333333333334,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.8333333333333334,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "torque-wrench-conversion-calculator",
      "title": "Torque Conversion Calculator (ft-lb ↔ Nm)",
      "url": "https://craftquantities.com/calculators/measurements-conversions/torque-wrench-conversion-calculator/",
      "sources": [
        "1 ft-lb = 1.35582 Nm"
      ],
      "vectors": [
        {
          "name": "50 ft-lb to Nm",
          "inputs": {
            "value": 50,
            "fromUnit": "ftlb"
          },
          "expected": 67.791,
          "toleranceDecimalPlaces": 3,
          "unit": "Nm",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "100 Nm to ft-lb",
          "inputs": {
            "value": 100,
            "fromUnit": "nm"
          },
          "expected": 73.76,
          "toleranceDecimalPlaces": 2,
          "unit": "ft-lb",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "trailer-ramp-length-calculator",
      "title": "Trailer Ramp Length Calculator",
      "url": "https://craftquantities.com/calculators/auto-utility/trailer-ramp-length-calculator/",
      "sources": [
        "Horizontal run = rise height / (maximum grade percent / 100) — the same rise/run relationship used in the Slope & Grade Calculator",
        "Ramp length = the hypotenuse over that rise and run, sqrt(rise^2 + run^2), because the ramp is the sloping member rather than its footprint"
      ],
      "vectors": [
        {
          "name": "0.5m rise, 15% max grade",
          "inputs": {
            "riseHeight": 0.5,
            "maxGradePercent": 15
          },
          "expected": 11.06,
          "toleranceDecimalPlaces": 2,
          "unit": "ft (minimum length)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Horizontal run needed on the ground",
              "value": 10.936132983377076,
              "unit": "ft"
            },
            {
              "label": "Rise being climbed",
              "value": 1.6404199475065615,
              "unit": "ft"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "0.8m rise, 12% max grade",
          "inputs": {
            "riseHeight": 0.8,
            "maxGradePercent": 12
          },
          "expected": 22.03,
          "toleranceDecimalPlaces": 2,
          "unit": "ft (minimum length)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Horizontal run needed on the ground",
              "value": 21.872265966754156,
              "unit": "ft"
            },
            {
              "label": "Rise being climbed",
              "value": 2.6246719160104988,
              "unit": "ft"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "transformer-sizing-calculator",
      "title": "Transformer Sizing Calculator",
      "url": "https://craftquantities.com/calculators/electrical/transformer-sizing-calculator/",
      "sources": [
        "Required kVA = connected watts / 1,000 / power factor; standard distribution transformer sizes commonly include 5, 10, 15, 25, 37.5, 50, 75, 100, 150, and 225 kVA"
      ],
      "vectors": [
        {
          "name": "10000W load, 0.8 power factor",
          "inputs": {
            "totalConnectedWatts": 10000,
            "powerFactor": 0.8
          },
          "expected": 15,
          "toleranceDecimalPlaces": 0,
          "unit": "kVA",
          "confidence": "medium",
          "steps": [
            {
              "label": "Minimum required capacity",
              "value": 12.5,
              "unit": "kVA"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30000W load, 0.85 power factor",
          "inputs": {
            "totalConnectedWatts": 30000,
            "powerFactor": 0.85
          },
          "expected": 37.5,
          "toleranceDecimalPlaces": 1,
          "unit": "kVA",
          "confidence": "medium",
          "steps": [
            {
              "label": "Minimum required capacity",
              "value": 35.294117647058826,
              "unit": "kVA"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "trap-primer-flow-calculator",
      "title": "Trap Primer Flow Rate Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/trap-primer-flow-calculator/",
      "sources": [
        "Total trap primer flow = number of fixtures served × flow rate per fixture, the standard method for sizing a trap primer distribution system's total demand"
      ],
      "vectors": [
        {
          "name": "4 fixtures at 3.6 L/min (0.06 L/s) each",
          "inputs": {
            "fixtureCount": 4,
            "flowPerFixture": 3.6
          },
          "expected": 14.4,
          "toleranceDecimalPlaces": 2,
          "unit": "L/min",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "6 fixtures at 3.6 L/min (0.06 L/s) each",
          "inputs": {
            "fixtureCount": 6,
            "flowPerFixture": 3.6
          },
          "expected": 21.6,
          "toleranceDecimalPlaces": 2,
          "unit": "L/min",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "trapeze-hanger-rod-sizing-calculator",
      "title": "Cable Tray Trapeze Hanger Rod Sizing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/trapeze-hanger-rod-sizing-calculator/",
      "sources": [
        "Direct tension check: rod tension = (load per unit length × support spacing) ÷ rods per trapeze; required tensile stress area = tension ÷ allowable tensile stress; diameter follows from area for a round section",
        "RULE OF THUMB, stated as one: the default thread stress-area ratio of 0.75 is the approximate relationship between a threaded rod's tensile stress area and its plain-shank area across the common sizes. It is an approximation for a first pass — the exact stress area for the size you are using is published in its own thread standard and should be entered here once you have chosen a size.",
        "RULE OF THUMB, stated as one: the default allowable tensile stress of 150 MPa is a round working figure for ordinary carbon-steel hanger rod, not a code value. Take the governing allowable stress from the rod's material standard and the design method in force before relying on the answer.",
        "ASCE/SEI 7, Minimum Design Loads and Associated Criteria for Buildings and Other Structures — where the building code adopts seismic requirements, unbraced hanger rod needs bracing designed under that standard, which this tension check does not cover"
      ],
      "vectors": [
        {
          "name": "60 kg/m of loaded tray, 3 m spacing, two rods at 150 MPa allowable",
          "inputs": {
            "loadPerLength": 60,
            "supportSpacing": 3,
            "rodCount": 2,
            "allowableStress": 150000000,
            "threadAreaRatio": 0.75,
            "rodDiameter": 0.012
          },
          "expected": 3.1605,
          "toleranceDecimalPlaces": 3,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Load carried by the whole trapeze",
              "value": 1765.1970000000001,
              "unit": "N"
            },
            {
              "label": "Tension carried by each rod",
              "value": 882.5985000000001,
              "unit": "N"
            },
            {
              "label": "Required tensile stress area",
              "value": 5.88399,
              "unit": "mm²"
            },
            {
              "label": "Stress area of the rod you entered",
              "value": 84.82300164692441,
              "unit": "mm²"
            },
            {
              "label": "Utilisation of the rod you entered",
              "value": 6.936785878542826,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "100 kg/m at 2.4 m spacing shared by four rods at 200 MPa allowable",
          "inputs": {
            "loadPerLength": 100,
            "supportSpacing": 2.4,
            "rodCount": 4,
            "allowableStress": 200000000,
            "threadAreaRatio": 0.75,
            "rodDiameter": 0.016
          },
          "expected": 2.2348,
          "toleranceDecimalPlaces": 3,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "Load carried by the whole trapeze",
              "value": 2353.596,
              "unit": "N"
            },
            {
              "label": "Tension carried by each rod",
              "value": 588.399,
              "unit": "N"
            },
            {
              "label": "Required tensile stress area",
              "value": 2.941995,
              "unit": "mm²"
            },
            {
              "label": "Stress area of the rod you entered",
              "value": 150.79644737231007,
              "unit": "mm²"
            },
            {
              "label": "Utilisation of the rod you entered",
              "value": 1.9509710283401693,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "tree-root-protection-area-calculator",
      "title": "Tree Root Protection Area Calculator (BS 5837 RPA and AS 4970 Notional Root Zone)",
      "url": "https://craftquantities.com/calculators/materials-quantities/tree-root-protection-area-calculator/",
      "sources": [
        "BS 5837:2012 Trees in relation to design, demolition and construction, 4.6.1 and Annexes C and D: the root protection area is a circle whose radius is twelve times the stem diameter measured at 1.5 m above ground, capped at 707 m²; for two to five stems the combined diameter is √(d1² + d2² + …), and for more than five the mean stem diameter × √(number of stems)",
        "AS 4970:2025 Protection of trees on development sites (the second edition, which superseded AS 4970-2009): notional root zone radius = 12 × the diameter at standard height, 1.4 m, no less than 2 m and no more than 15 m, stems combined as √(Σd²); structural root zone radius = (D × 50)^0.42 × 0.64 from the diameter D just above the root buttress, no less than 1.5 m"
      ],
      "vectors": [
        {
          "name": "The oak in the building-near-trees guide: a 620 mm stem",
          "inputs": {
            "standard": "bs5837",
            "stems": "one",
            "stem1": 0.62,
            "stem2": 0,
            "stem3": 0,
            "stem4": 0,
            "stem5": 0,
            "meanDiameter": 0.15,
            "stemCount": 8,
            "buttressDiameter": 0,
            "distanceToWorks": 9.1
          },
          "expected": 7.44,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Stem diameter",
              "value": 620,
              "unit": "mm"
            },
            {
              "label": "Root protection area",
              "value": 173.89846310974795,
              "unit": "m²"
            },
            {
              "label": "Distance from the stem to the works",
              "value": 9.1,
              "unit": "m"
            },
            {
              "label": "Works beyond the edge (negative: inside it)",
              "value": 1.6600000000000001,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A 500 mm stem",
          "inputs": {
            "standard": "bs5837",
            "stems": "one",
            "stem1": 0.5,
            "stem2": 0,
            "stem3": 0,
            "stem4": 0,
            "stem5": 0,
            "meanDiameter": 0.15,
            "stemCount": 8,
            "buttressDiameter": 0,
            "distanceToWorks": 0
          },
          "expected": 6,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Stem diameter",
              "value": 500,
              "unit": "mm"
            },
            {
              "label": "Root protection area",
              "value": 113.09733552923255,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Three stems of 200, 300 and 250 mm combine to 438.7 mm",
          "inputs": {
            "standard": "bs5837",
            "stems": "two-to-five",
            "stem1": 0.2,
            "stem2": 0.3,
            "stem3": 0.25,
            "stem4": 0,
            "stem5": 0,
            "meanDiameter": 0.15,
            "stemCount": 8,
            "buttressDiameter": 0,
            "distanceToWorks": 0
          },
          "expected": 5.26498,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Combined stem diameter",
              "value": 438.7482193696061,
              "unit": "mm"
            },
            {
              "label": "Root protection area",
              "value": 87.08494835750906,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Eight stems averaging 150 mm: mean × √8",
          "inputs": {
            "standard": "bs5837",
            "stems": "more-than-five",
            "stem1": 0.62,
            "stem2": 0,
            "stem3": 0,
            "stem4": 0,
            "stem5": 0,
            "meanDiameter": 0.15,
            "stemCount": 8,
            "buttressDiameter": 0,
            "distanceToWorks": 0
          },
          "expected": 5.09117,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Combined stem diameter",
              "value": 424.26406871192853,
              "unit": "mm"
            },
            {
              "label": "Root protection area",
              "value": 81.43008158104743,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A 1.3 m stem hits the 707 m² cap",
          "inputs": {
            "standard": "bs5837",
            "stems": "one",
            "stem1": 1.3,
            "stem2": 0,
            "stem3": 0,
            "stem4": 0,
            "stem5": 0,
            "meanDiameter": 0.15,
            "stemCount": 8,
            "buttressDiameter": 0,
            "distanceToWorks": 0
          },
          "expected": 15.0015,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Stem diameter",
              "value": 1300,
              "unit": "mm"
            },
            {
              "label": "Root protection area",
              "value": 707,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "AS 4970: a 300 mm stem",
          "inputs": {
            "standard": "as4970",
            "stems": "one",
            "stem1": 0.3,
            "stem2": 0,
            "stem3": 0,
            "stem4": 0,
            "stem5": 0,
            "meanDiameter": 0.15,
            "stemCount": 8,
            "buttressDiameter": 0.35,
            "distanceToWorks": 0
          },
          "expected": 3.6,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Stem diameter",
              "value": 300,
              "unit": "mm"
            },
            {
              "label": "Notional root zone area",
              "value": 40.71504079052371,
              "unit": "m²"
            },
            {
              "label": "Structural root zone radius",
              "value": 2.1293936489964365,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "AS 4970: a 100 mm stem is held at the 2 m floor",
          "inputs": {
            "standard": "as4970",
            "stems": "one",
            "stem1": 0.1,
            "stem2": 0,
            "stem3": 0,
            "stem4": 0,
            "stem5": 0,
            "meanDiameter": 0.15,
            "stemCount": 8,
            "buttressDiameter": 0,
            "distanceToWorks": 0
          },
          "expected": 2,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Stem diameter",
              "value": 100,
              "unit": "mm"
            },
            {
              "label": "Notional root zone area",
              "value": 12.566370614359172,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "AS 4970: a 1.5 m stem is held at the 15 m ceiling",
          "inputs": {
            "standard": "as4970",
            "stems": "one",
            "stem1": 1.5,
            "stem2": 0,
            "stem3": 0,
            "stem4": 0,
            "stem5": 0,
            "meanDiameter": 0.15,
            "stemCount": 8,
            "buttressDiameter": 0,
            "distanceToWorks": 0
          },
          "expected": 15,
          "toleranceDecimalPlaces": 3,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Stem diameter",
              "value": 1500,
              "unit": "mm"
            },
            {
              "label": "Notional root zone area",
              "value": 706.8583470577034,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "tremie-concrete-displacement-calculator",
      "title": "Tremie Pipe Safe Withdrawal & Embedment Calculator",
      "url": "https://craftquantities.com/calculators/heavy-civil/tremie-concrete-displacement-calculator/",
      "sources": [
        "Standard tremie placement practice requires the pipe's discharge end to stay embedded at least 1.5 m (5 ft) into the already-placed concrete at all times, so new concrete displaces water or slurry upward without washout or contamination of the mix"
      ],
      "vectors": [
        {
          "name": "1.5m² area, 3m placed, 10m pipe",
          "inputs": {
            "pourAreaM2": 1.5,
            "currentPourDepth": 3,
            "tremiePipeLength": 10
          },
          "expected": 1.5,
          "toleranceDecimalPlaces": 1,
          "unit": "m of pipe safely withdrawable",
          "confidence": "high",
          "steps": [
            {
              "label": "Concrete volume placed so far",
              "value": 4.5,
              "unit": "m³"
            },
            {
              "label": "Remaining pipe length above pour surface",
              "value": 7,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2m² area, 1m placed, 12m pipe (unsafe)",
          "inputs": {
            "pourAreaM2": 2,
            "currentPourDepth": 1,
            "tremiePipeLength": 12
          },
          "expected": -0.5,
          "toleranceDecimalPlaces": 2,
          "unit": "m of pipe safely withdrawable",
          "confidence": "low",
          "steps": [
            {
              "label": "Concrete volume placed so far",
              "value": 2,
              "unit": "m³"
            },
            {
              "label": "Remaining pipe length above pour surface",
              "value": 11,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "trench-excavation-backfill-calculator",
      "title": "Trench Excavation & Backfill Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/trench-excavation-backfill-calculator/",
      "sources": [
        "Backfill volume = trench excavation volume minus the pipe's own volume, minus any bedding and surround zone (trench width x (bed below + pipe diameter + cover above) x length, less the pipe it holds); loose material ordered accounts for the extra volume lost when compacting loose fill back into a denser state"
      ],
      "vectors": [
        {
          "name": "50m trench, 0.6x1.2m, 0.3m pipe, 15% compaction factor",
          "inputs": {
            "trenchLength": 50,
            "trenchWidth": 0.6,
            "trenchDepth": 1.2,
            "pipeDiameter": 0.3,
            "beddingBelow": 0,
            "surroundAbove": 0,
            "compactionFactorPercent": 15
          },
          "expected": 37.34,
          "toleranceDecimalPlaces": 1,
          "unit": "m³ (loose)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Excavation volume (the depth entered)",
              "value": 36,
              "unit": "m³"
            },
            {
              "label": "Pipe volume (subtracted)",
              "value": 3.5342917352885173,
              "unit": "m³"
            },
            {
              "label": "Compacted backfill void",
              "value": 32.46570826471148,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "80m trench, 0.5x1.0m, 0.2m pipe, 20% compaction factor",
          "inputs": {
            "trenchLength": 80,
            "trenchWidth": 0.5,
            "trenchDepth": 1,
            "pipeDiameter": 0.2,
            "beddingBelow": 0,
            "surroundAbove": 0,
            "compactionFactorPercent": 20
          },
          "expected": 44.99,
          "toleranceDecimalPlaces": 0,
          "unit": "m³ (loose)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Excavation volume (the depth entered)",
              "value": 40,
              "unit": "m³"
            },
            {
              "label": "Pipe volume (subtracted)",
              "value": 2.5132741228718345,
              "unit": "m³"
            },
            {
              "label": "Compacted backfill void",
              "value": 37.486725877128166,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "50m trench, 0.6x1.2m, 0.3m pipe on a 100 mm bed with 300 mm cover, 15%",
          "inputs": {
            "trenchLength": 50,
            "trenchWidth": 0.6,
            "trenchDepth": 1.2,
            "pipeDiameter": 0.3,
            "beddingBelow": 0.1,
            "surroundAbove": 0.3,
            "compactionFactorPercent": 15
          },
          "expected": 17.25,
          "toleranceDecimalPlaces": 2,
          "unit": "m³ (loose)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Excavation volume (the depth entered)",
              "value": 36,
              "unit": "m³"
            },
            {
              "label": "Pipe volume (subtracted)",
              "value": 3.5342917352885173,
              "unit": "m³"
            },
            {
              "label": "Bedding and surround (in place, subtracted)",
              "value": 17.465708264711484,
              "unit": "m³"
            },
            {
              "label": "Compacted backfill void",
              "value": 14.999999999999996,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "No pipe (diameter 0): 10m x 0.6m x 1.0m, 15%",
          "inputs": {
            "trenchLength": 10,
            "trenchWidth": 0.6,
            "trenchDepth": 1,
            "pipeDiameter": 0,
            "beddingBelow": 0,
            "surroundAbove": 0,
            "compactionFactorPercent": 15
          },
          "expected": 6.9,
          "toleranceDecimalPlaces": 2,
          "unit": "m³ (loose)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Excavation volume (the depth entered)",
              "value": 6,
              "unit": "m³"
            },
            {
              "label": "Pipe volume (subtracted)",
              "value": 0,
              "unit": "m³"
            },
            {
              "label": "Compacted backfill void",
              "value": 6,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Bedding zone deeper than the trench leaves no backfill",
          "inputs": {
            "trenchLength": 10,
            "trenchWidth": 0.5,
            "trenchDepth": 0.5,
            "pipeDiameter": 0.2,
            "beddingBelow": 0.15,
            "surroundAbove": 0.3,
            "compactionFactorPercent": 15
          },
          "expected": 0,
          "toleranceDecimalPlaces": 6,
          "unit": "m³ (loose)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Excavation volume (the depth entered)",
              "value": 2.5,
              "unit": "m³"
            },
            {
              "label": "Pipe volume (subtracted)",
              "value": 0.3141592653589793,
              "unit": "m³"
            },
            {
              "label": "Bedding and surround (in place, subtracted)",
              "value": 2.1858407346410207,
              "unit": "m³"
            },
            {
              "label": "Compacted backfill void",
              "value": 0,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "trench-safety-slope-calculator",
      "title": "Trench Sloping & Excavation Width Calculator",
      "url": "https://craftquantities.com/calculators/heavy-civil/trench-safety-slope-calculator/",
      "sources": [
        "OSHA 29 CFR 1926 Subpart P, Appendix B — maximum allowable slopes for excavations less than 20 feet deep: Stable Rock vertical; Type A 3/4:1 (53°); Type B 1:1 (45°); Type C 1½:1 (34°)",
        "29 CFR 1926.652 — excavations deeper than 20 feet require a protective system designed by a registered professional engineer",
        "Soil classification under Appendix A must be performed by a competent person using at least one visual and one manual test"
      ],
      "vectors": [
        {
          "name": "2.4 m deep, 1 m bottom, Type B",
          "inputs": {
            "depth": 2.4,
            "bottomWidth": 1,
            "soilType": "typeB"
          },
          "expected": 5.8,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Setback each side",
              "value": 2.4,
              "unit": "m"
            },
            {
              "label": "Slope angle from horizontal",
              "value": 45,
              "unit": "°"
            },
            {
              "label": "Spoil volume per metre of trench",
              "value": 8.16,
              "unit": "m³/m"
            },
            {
              "label": "Extra volume caused by sloping",
              "value": 5.76,
              "unit": "m³/m"
            },
            {
              "label": "Top width in feet",
              "value": 19.028871391076112,
              "unit": "ft"
            },
            {
              "label": "Total bank excavation volume",
              "value": null,
              "unit": "m³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Type C needs a wider top",
          "inputs": {
            "depth": 2.4,
            "bottomWidth": 1,
            "soilType": "typeC"
          },
          "expected": 8.2,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Setback each side",
              "value": 3.5999999999999996,
              "unit": "m"
            },
            {
              "label": "Slope angle from horizontal",
              "value": 34,
              "unit": "°"
            },
            {
              "label": "Spoil volume per metre of trench",
              "value": 11.04,
              "unit": "m³/m"
            },
            {
              "label": "Extra volume caused by sloping",
              "value": 8.639999999999999,
              "unit": "m³/m"
            },
            {
              "label": "Top width in feet",
              "value": 26.902887139107605,
              "unit": "ft"
            },
            {
              "label": "Total bank excavation volume",
              "value": null,
              "unit": "m³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Type A is tighter",
          "inputs": {
            "depth": 2.4,
            "bottomWidth": 1,
            "soilType": "typeA"
          },
          "expected": 4.6,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Setback each side",
              "value": 1.7999999999999998,
              "unit": "m"
            },
            {
              "label": "Slope angle from horizontal",
              "value": 53,
              "unit": "°"
            },
            {
              "label": "Spoil volume per metre of trench",
              "value": 6.72,
              "unit": "m³/m"
            },
            {
              "label": "Extra volume caused by sloping",
              "value": 4.32,
              "unit": "m³/m"
            },
            {
              "label": "Top width in feet",
              "value": 15.091863517060364,
              "unit": "ft"
            },
            {
              "label": "Total bank excavation volume",
              "value": null,
              "unit": "m³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Stable rock stays vertical",
          "inputs": {
            "depth": 2.4,
            "bottomWidth": 1,
            "soilType": "rock"
          },
          "expected": 1,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Setback each side",
              "value": 0,
              "unit": "m"
            },
            {
              "label": "Slope angle from horizontal",
              "value": 90,
              "unit": "°"
            },
            {
              "label": "Spoil volume per metre of trench",
              "value": 2.4,
              "unit": "m³/m"
            },
            {
              "label": "Extra volume caused by sloping",
              "value": 0,
              "unit": "m³/m"
            },
            {
              "label": "Top width in feet",
              "value": 3.280839895013123,
              "unit": "ft"
            },
            {
              "label": "Total bank excavation volume",
              "value": null,
              "unit": "m³"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Twice the depth doubles the setback",
          "inputs": {
            "depth": 4.8,
            "bottomWidth": 1,
            "soilType": "typeB"
          },
          "expected": 10.6,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Setback each side",
              "value": 4.8,
              "unit": "m"
            },
            {
              "label": "Slope angle from horizontal",
              "value": 45,
              "unit": "°"
            },
            {
              "label": "Spoil volume per metre of trench",
              "value": 27.84,
              "unit": "m³/m"
            },
            {
              "label": "Extra volume caused by sloping",
              "value": 23.04,
              "unit": "m³/m"
            },
            {
              "label": "Top width in feet",
              "value": 34.7769028871391,
              "unit": "ft"
            },
            {
              "label": "Total bank excavation volume",
              "value": null,
              "unit": "m³"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "trial-batch-yield-adjustment-calculator",
      "title": "Concrete Trial Batch Yield Adjustment Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/trial-batch-yield-adjustment-calculator/",
      "sources": [
        "ASTM C138 trial batch adjustment procedure: correction factor = design volume / actual measured yield, applied to every ingredient quantity in the mix"
      ],
      "vectors": [
        {
          "name": "1 m³ design, 0.98 m³ actual, 350 kg cement",
          "inputs": {
            "designVolume": 1,
            "actualYieldVolume": 0.98,
            "originalIngredientQuantity": 350
          },
          "expected": 357.14,
          "toleranceDecimalPlaces": -1,
          "unit": "kg",
          "confidence": "high",
          "steps": [
            {
              "label": "Correction factor",
              "value": 1.0204081632653061
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1 m³ design, 1.03 m³ actual, 400 kg cement",
          "inputs": {
            "designVolume": 1,
            "actualYieldVolume": 1.03,
            "originalIngredientQuantity": 400
          },
          "expected": 388.35,
          "toleranceDecimalPlaces": -1,
          "unit": "kg",
          "confidence": "high",
          "steps": [
            {
              "label": "Correction factor",
              "value": 0.970873786407767
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "triangle-calculator",
      "title": "Triangle Calculator — Right Triangle and Any Triangle Solver",
      "url": "https://craftquantities.com/calculators/measurements-conversions/triangle-calculator/",
      "sources": [
        "NIST Digital Library of Mathematical Functions, §4.42 Solution of Triangles: the right-triangle ratios sin A = a/c, cos A = b/c and tan A = a/b (4.42.1–4.42.3), the law of sines (4.42.4), the law of cosines c² = a² + b² − 2ab cos C (4.42.5), and the area ½bc sin A = √(s(s − a)(s − b)(s − c)) with s the semi-perimeter (4.42.7)",
        "Euclid, Elements, Book I (D. E. Joyce's edition, Clark University): Proposition 47, the square on the side opposite the right angle equals the squares on the other two sides together; Proposition 32, the three angles of a triangle together make two right angles; Proposition 20, any two sides of a triangle together are greater than the third",
        "OpenStax, Algebra and Trigonometry 2e (Rice University), §10.1 Non-right Triangles: Law of Sines — two sides and a non-included angle (SSA) may give no triangle, one right triangle, one triangle or two triangles; the area of an oblique triangle is half the product of two sides and the sine of the angle between them",
        "DeWALT Rafter Square (DWHT46031) instruction manual: rafter lengths from the tables are to the centre of the ridge, so half the ridge board's thickness is deducted from the listed length before the top plumb cut is made, measured at right angles to the top plumb cut line and marked parallel to it; the worked example takes the run as half of a 20 ft building's width"
      ],
      "vectors": [
        {
          "name": "the 3-4-5 triangle: a rise of 3 and a run of 4 slope 5",
          "inputs": {
            "solveFrom": "rise-run",
            "rrRise": 3,
            "rrRun": 4
          },
          "expected": 5,
          "toleranceDecimalPlaces": 9,
          "unit": "m slope length",
          "confidence": "high",
          "steps": [
            {
              "label": "Rise, side a",
              "value": 3,
              "unit": "m"
            },
            {
              "label": "Run, side b",
              "value": 4,
              "unit": "m"
            },
            {
              "label": "Slope length, side c",
              "value": 5,
              "unit": "m"
            },
            {
              "label": "Slope angle at the base, angle A",
              "value": 36.86989764584402,
              "unit": "°"
            },
            {
              "label": "Angle at the top, angle B",
              "value": 53.13010235415598,
              "unit": "°"
            },
            {
              "label": "Rise over run",
              "value": 75,
              "unit": "%"
            },
            {
              "label": "Area",
              "value": 6,
              "unit": "m²"
            },
            {
              "label": "Perimeter",
              "value": 12,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "the opening rafter: rise 1.2 m over a 3.6 m run",
          "inputs": {
            "solveFrom": "rise-run",
            "rrRise": 1.2,
            "rrRun": 3.6
          },
          "expected": 3.794733,
          "toleranceDecimalPlaces": 5,
          "unit": "m slope length",
          "confidence": "high",
          "steps": [
            {
              "label": "Rise, side a",
              "value": 1.2,
              "unit": "m"
            },
            {
              "label": "Run, side b",
              "value": 3.6,
              "unit": "m"
            },
            {
              "label": "Slope length, side c",
              "value": 3.7947331922020555,
              "unit": "m"
            },
            {
              "label": "Slope angle at the base, angle A",
              "value": 18.43494882292201,
              "unit": "°"
            },
            {
              "label": "Angle at the top, angle B",
              "value": 71.56505117707799,
              "unit": "°"
            },
            {
              "label": "Rise over run",
              "value": 33.33333333333333,
              "unit": "%"
            },
            {
              "label": "Area",
              "value": 2.16,
              "unit": "m²"
            },
            {
              "label": "Perimeter",
              "value": 8.594733192202055,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a ladder: 5 long, base 4 out, reaches 3 up",
          "inputs": {
            "solveFrom": "run-slope",
            "rlRun": 4,
            "rlSlope": 5
          },
          "expected": 3,
          "toleranceDecimalPlaces": 9,
          "unit": "m rise",
          "confidence": "high",
          "steps": [
            {
              "label": "Rise, side a",
              "value": 3,
              "unit": "m"
            },
            {
              "label": "Run, side b",
              "value": 4,
              "unit": "m"
            },
            {
              "label": "Slope length, side c",
              "value": 5,
              "unit": "m"
            },
            {
              "label": "Slope angle at the base, angle A",
              "value": 36.86989764584402,
              "unit": "°"
            },
            {
              "label": "Angle at the top, angle B",
              "value": 53.13010235415598,
              "unit": "°"
            },
            {
              "label": "Rise over run",
              "value": 75,
              "unit": "%"
            },
            {
              "label": "Area",
              "value": 6,
              "unit": "m²"
            },
            {
              "label": "Perimeter",
              "value": 12,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "a stringer 4.2 long over a 2.6 rise covers a 3.298 run",
          "inputs": {
            "solveFrom": "rise-slope",
            "hlRise": 2.6,
            "hlSlope": 4.2
          },
          "expected": 3.298485,
          "toleranceDecimalPlaces": 5,
          "unit": "m run",
          "confidence": "high",
          "steps": [
            {
              "label": "Rise, side a",
              "value": 2.6,
              "unit": "m"
            },
            {
              "label": "Run, side b",
              "value": 3.298484500494128,
              "unit": "m"
            },
            {
              "label": "Slope length, side c",
              "value": 4.2,
              "unit": "m"
            },
            {
              "label": "Slope angle at the base, angle A",
              "value": 38.24661987834499,
              "unit": "°"
            },
            {
              "label": "Angle at the top, angle B",
              "value": 51.75338012165501,
              "unit": "°"
            },
            {
              "label": "Rise over run",
              "value": 78.82407813680823,
              "unit": "%"
            },
            {
              "label": "Area",
              "value": 4.288029850642367,
              "unit": "m²"
            },
            {
              "label": "Perimeter",
              "value": 10.098484500494127,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a 30° roof over a 3.6 run has a 4.157 rafter line",
          "inputs": {
            "solveFrom": "run-angle",
            "raRun": 3.6,
            "raAngle": 30
          },
          "expected": 4.156922,
          "toleranceDecimalPlaces": 5,
          "unit": "m slope length",
          "confidence": "high",
          "steps": [
            {
              "label": "Rise, side a",
              "value": 2.0784609690826525,
              "unit": "m"
            },
            {
              "label": "Run, side b",
              "value": 3.6,
              "unit": "m"
            },
            {
              "label": "Slope length, side c",
              "value": 4.156921938165305,
              "unit": "m"
            },
            {
              "label": "Slope angle at the base, angle A",
              "value": 30,
              "unit": "°"
            },
            {
              "label": "Angle at the top, angle B",
              "value": 60,
              "unit": "°"
            },
            {
              "label": "Rise over run",
              "value": 57.735026918962575,
              "unit": "%"
            },
            {
              "label": "Area",
              "value": 3.7412297443487748,
              "unit": "m²"
            },
            {
              "label": "Perimeter",
              "value": 9.835382907247958,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a 35° flight over a 2.6 rise has a 4.533 stringer line",
          "inputs": {
            "solveFrom": "rise-angle",
            "haRise": 2.6,
            "haAngle": 35
          },
          "expected": 4.532962,
          "toleranceDecimalPlaces": 5,
          "unit": "m slope length",
          "confidence": "high",
          "steps": [
            {
              "label": "Rise, side a",
              "value": 2.6,
              "unit": "m"
            },
            {
              "label": "Run, side b",
              "value": 3.7131848175294984,
              "unit": "m"
            },
            {
              "label": "Slope length, side c",
              "value": 4.532961668614855,
              "unit": "m"
            },
            {
              "label": "Slope angle at the base, angle A",
              "value": 35,
              "unit": "°"
            },
            {
              "label": "Angle at the top, angle B",
              "value": 55,
              "unit": "°"
            },
            {
              "label": "Rise over run",
              "value": 70.02075382097097,
              "unit": "%"
            },
            {
              "label": "Area",
              "value": 4.827140262788348,
              "unit": "m²"
            },
            {
              "label": "Perimeter",
              "value": 10.846146486144352,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a 4.8 brace at 45° climbs 3.394",
          "inputs": {
            "solveFrom": "slope-angle",
            "laSlope": 4.8,
            "laAngle": 45
          },
          "expected": 3.394113,
          "toleranceDecimalPlaces": 5,
          "unit": "m rise",
          "confidence": "high",
          "steps": [
            {
              "label": "Rise, side a",
              "value": 3.3941125496954276,
              "unit": "m"
            },
            {
              "label": "Run, side b",
              "value": 3.394112549695428,
              "unit": "m"
            },
            {
              "label": "Slope length, side c",
              "value": 4.8,
              "unit": "m"
            },
            {
              "label": "Slope angle at the base, angle A",
              "value": 45,
              "unit": "°"
            },
            {
              "label": "Angle at the top, angle B",
              "value": 45,
              "unit": "°"
            },
            {
              "label": "Rise over run",
              "value": 99.99999999999999,
              "unit": "%"
            },
            {
              "label": "Area",
              "value": 5.759999999999999,
              "unit": "m²"
            },
            {
              "label": "Perimeter",
              "value": 11.588225099390854,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "three sides 7, 5 and 6 enclose 14.697 by Heron's formula",
          "inputs": {
            "solveFrom": "sss",
            "sssA": 7,
            "sssB": 5,
            "sssC": 6
          },
          "expected": 14.696938,
          "toleranceDecimalPlaces": 5,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Side a",
              "value": 7,
              "unit": "m"
            },
            {
              "label": "Side b",
              "value": 5,
              "unit": "m"
            },
            {
              "label": "Side c",
              "value": 6,
              "unit": "m"
            },
            {
              "label": "Angle A",
              "value": 78.46304096718451,
              "unit": "°"
            },
            {
              "label": "Angle B",
              "value": 44.415308597192976,
              "unit": "°"
            },
            {
              "label": "Angle C",
              "value": 57.12165043562251,
              "unit": "°"
            },
            {
              "label": "Area",
              "value": 14.696938456699069,
              "unit": "m²"
            },
            {
              "label": "Perimeter",
              "value": 18,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a flat triangle: 3 and 4 laid end to end make 7, and no area",
          "inputs": {
            "solveFrom": "sss",
            "sssA": 3,
            "sssB": 4,
            "sssC": 7
          },
          "expected": 0,
          "toleranceDecimalPlaces": 9,
          "unit": "m²",
          "confidence": "low",
          "steps": [
            {
              "label": "Side a",
              "value": 3,
              "unit": "m"
            },
            {
              "label": "Side b",
              "value": 4,
              "unit": "m"
            },
            {
              "label": "Side c",
              "value": 7,
              "unit": "m"
            },
            {
              "label": "Angle A",
              "value": 0,
              "unit": "°"
            },
            {
              "label": "Angle B",
              "value": 0,
              "unit": "°"
            },
            {
              "label": "Angle C",
              "value": 180,
              "unit": "°"
            },
            {
              "label": "Area",
              "value": 0,
              "unit": "m²"
            },
            {
              "label": "Perimeter",
              "value": 14,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "two sides 4 and 5 at 60° enclose 8.660",
          "inputs": {
            "solveFrom": "sas",
            "sasB": 4,
            "sasC": 5,
            "sasAngleA": 60
          },
          "expected": 8.660254,
          "toleranceDecimalPlaces": 5,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Side a",
              "value": 4.58257569495584,
              "unit": "m"
            },
            {
              "label": "Side b",
              "value": 4,
              "unit": "m"
            },
            {
              "label": "Side c",
              "value": 5,
              "unit": "m"
            },
            {
              "label": "Angle A",
              "value": 60,
              "unit": "°"
            },
            {
              "label": "Angle B",
              "value": 49.106605350869096,
              "unit": "°"
            },
            {
              "label": "Angle C",
              "value": 70.8933946491309,
              "unit": "°"
            },
            {
              "label": "Area",
              "value": 8.660254037844386,
              "unit": "m²"
            },
            {
              "label": "Perimeter",
              "value": 13.582575694955839,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a 6 span pitched at 50° and 60° encloses 12.708",
          "inputs": {
            "solveFrom": "asa",
            "asaAngleB": 50,
            "asaAngleC": 60,
            "asaA": 6
          },
          "expected": 12.707827,
          "toleranceDecimalPlaces": 5,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Side a",
              "value": 6,
              "unit": "m"
            },
            {
              "label": "Side b",
              "value": 4.891244814575428,
              "unit": "m"
            },
            {
              "label": "Side c",
              "value": 5.529629910641257,
              "unit": "m"
            },
            {
              "label": "Angle A",
              "value": 70,
              "unit": "°"
            },
            {
              "label": "Angle B",
              "value": 50,
              "unit": "°"
            },
            {
              "label": "Angle C",
              "value": 60,
              "unit": "°"
            },
            {
              "label": "Area",
              "value": 12.707826796653679,
              "unit": "m²"
            },
            {
              "label": "Perimeter",
              "value": 16.420874725216684,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "angles 40° and 60° with 5 opposite the 40° enclose 16.585",
          "inputs": {
            "solveFrom": "aas",
            "aasAngleA": 40,
            "aasAngleB": 60,
            "aasA": 5
          },
          "expected": 16.585349,
          "toleranceDecimalPlaces": 5,
          "unit": "m²",
          "confidence": "high",
          "steps": [
            {
              "label": "Side a",
              "value": 5,
              "unit": "m"
            },
            {
              "label": "Side b",
              "value": 6.736481776669304,
              "unit": "m"
            },
            {
              "label": "Side c",
              "value": 7.660444431189781,
              "unit": "m"
            },
            {
              "label": "Angle A",
              "value": 40,
              "unit": "°"
            },
            {
              "label": "Angle B",
              "value": 60,
              "unit": "°"
            },
            {
              "label": "Angle C",
              "value": 80,
              "unit": "°"
            },
            {
              "label": "Area",
              "value": 16.585348704223463,
              "unit": "m²"
            },
            {
              "label": "Perimeter",
              "value": 19.396926207859085,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "the ambiguous case: a 4, b 5, A 40° fits two triangles; the first encloses 9.982",
          "inputs": {
            "solveFrom": "ssa",
            "ssaA": 4,
            "ssaB": 5,
            "ssaAngleA": 40
          },
          "expected": 9.981728,
          "toleranceDecimalPlaces": 5,
          "unit": "m²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Side a",
              "value": 4,
              "unit": "m"
            },
            {
              "label": "Side b",
              "value": 5,
              "unit": "m"
            },
            {
              "label": "Side c",
              "value": 6.21152484668499,
              "unit": "m"
            },
            {
              "label": "Angle A",
              "value": 40,
              "unit": "°"
            },
            {
              "label": "Angle B",
              "value": 53.464149014388475,
              "unit": "°"
            },
            {
              "label": "Angle C",
              "value": 86.53585098561152,
              "unit": "°"
            },
            {
              "label": "Area",
              "value": 9.98172802177298,
              "unit": "m²"
            },
            {
              "label": "Perimeter",
              "value": 15.211524846684991,
              "unit": "m"
            },
            {
              "label": "Second triangle: side c",
              "value": 1.4489195845047915,
              "unit": "m"
            },
            {
              "label": "Second triangle: angle B",
              "value": 126.53585098561152,
              "unit": "°"
            },
            {
              "label": "Second triangle: angle C",
              "value": 13.464149014388482,
              "unit": "°"
            },
            {
              "label": "Second triangle: area",
              "value": 2.3283688908796214,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "the ambiguous case with a too short to reach: no triangle",
          "inputs": {
            "solveFrom": "ssa",
            "ssaA": 2,
            "ssaB": 5,
            "ssaAngleA": 40
          },
          "expected": 0,
          "toleranceDecimalPlaces": 9,
          "unit": "m²",
          "confidence": "low",
          "steps": [
            {
              "label": "Side a's shortfall against the height b × sin A",
              "value": 1.2139380484326963,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "truck-load-calculator",
      "title": "Dump Truck Load Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/truck-load-calculator/",
      "sources": [
        "Truck loads needed = total volume / truck bed capacity, rounded up — beds are quoted at 10-14 cubic yards in North America and at 8-12 m³ in metric markets, so the count is worked in whichever measure the hauler quotes rather than converted between them"
      ],
      "vectors": [
        {
          "name": "50 yd³ total, 10 yd³ truck",
          "inputs": {
            "bulkVolume": 38227.7428992,
            "truckCapacityYd3": "10"
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "x 10 yd³ loads",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "45 yd³ total, 12 yd³ truck",
          "inputs": {
            "bulkVolume": 34404.96860928,
            "truckCapacityYd3": "12"
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "x 12 yd³ loads",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "truncated-pyramid-development-calculator",
      "title": "Truncated Pyramid Flat Pattern Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/truncated-pyramid-development-calculator/",
      "sources": [
        "Corner edge true length = √(h² + ((A − a)/2)² + ((B − b)/2)²) for a right truncated pyramid centred on its axis",
        "Face true height = √(h² + (half the taper measured ACROSS that face)²); the two pairs of faces therefore have different heights whenever the two tapers differ",
        "Blank length along the base = the bottom perimeter, 2 × (A + B), the four trapezoids laid edge to edge"
      ],
      "vectors": [
        {
          "name": "600 by 400 down to 300 by 200, 500 high",
          "inputs": {
            "bottomLength": 0.6,
            "bottomWidth": 0.4,
            "topLength": 0.3,
            "topWidth": 0.2,
            "verticalHeight": 0.5
          },
          "expected": 20.9255,
          "toleranceDecimalPlaces": 2,
          "unit": "in",
          "confidence": "high",
          "steps": [
            {
              "label": "Face height, long sides",
              "value": 20.074879974774746,
              "unit": "in"
            },
            {
              "label": "Face height, short sides",
              "value": 20.551784466359354,
              "unit": "in"
            },
            {
              "label": "Blank length along the base",
              "value": 78.74015748031496,
              "unit": "in"
            },
            {
              "label": "Top perimeter",
              "value": 39.37007874015748,
              "unit": "in"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a full pyramid — the top closed to a point",
          "inputs": {
            "bottomLength": 0.6,
            "bottomWidth": 0.6,
            "topLength": 0,
            "topWidth": 0,
            "verticalHeight": 0.4
          },
          "expected": 22.9565,
          "toleranceDecimalPlaces": 2,
          "unit": "in",
          "confidence": "high",
          "steps": [
            {
              "label": "Face height, long sides",
              "value": 19.68503937007874,
              "unit": "in"
            },
            {
              "label": "Face height, short sides",
              "value": 19.68503937007874,
              "unit": "in"
            },
            {
              "label": "Blank length along the base",
              "value": 94.48818897637796,
              "unit": "in"
            },
            {
              "label": "Top perimeter",
              "value": 0,
              "unit": "in"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "no taper at all — a straight box, so the corner edge is the height",
          "inputs": {
            "bottomLength": 0.5,
            "bottomWidth": 0.4,
            "topLength": 0.5,
            "topWidth": 0.4,
            "verticalHeight": 0.3
          },
          "expected": 11.811,
          "toleranceDecimalPlaces": 2,
          "unit": "in",
          "confidence": "high",
          "steps": [
            {
              "label": "Face height, long sides",
              "value": 11.811023622047244,
              "unit": "in"
            },
            {
              "label": "Face height, short sides",
              "value": 11.811023622047244,
              "unit": "in"
            },
            {
              "label": "Blank length along the base",
              "value": 70.86614173228347,
              "unit": "in"
            },
            {
              "label": "Top perimeter",
              "value": 70.86614173228347,
              "unit": "in"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "truss-bottom-chord-deflection-calculator",
      "title": "Truss Bottom Chord Deflection Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/truss-bottom-chord-deflection-calculator/",
      "sources": [
        "Uniformly-loaded simple beam deflection D = 5wL^4/(384EI), applied to the truss bottom chord acting as a ceiling joist, checked against the standard L/240 ceiling deflection limit"
      ],
      "vectors": [
        {
          "name": "Landing state — 500 N/m over a 3 m chord bay, 38x140 (I=8.71)",
          "inputs": {
            "udl": 500,
            "span": 3,
            "elasticModulus": 11000000000,
            "momentOfInertia": 8.71
          },
          "expected": 5.5041,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "L/240 ceiling limit",
              "value": 12.5,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "500 N/m, 6m span, I=80x10^6mm^4",
          "inputs": {
            "udl": 500,
            "span": 6,
            "elasticModulus": 11000000000,
            "momentOfInertia": 80
          },
          "expected": 9.59,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "L/240 ceiling limit",
              "value": 25,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "800 N/m, 7m span, I=100x10^6mm^4",
          "inputs": {
            "udl": 800,
            "span": 7,
            "elasticModulus": 11000000000,
            "momentOfInertia": 100
          },
          "expected": 22.74,
          "toleranceDecimalPlaces": 2,
          "unit": "mm",
          "confidence": "medium",
          "steps": [
            {
              "label": "L/240 ceiling limit",
              "value": 29.166666666666668,
              "unit": "mm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "truss-camber-calculator",
      "title": "Wood Truss Camber Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/truss-camber-calculator/",
      "sources": [
        "Truss manufacturers commonly build in upward camber equal to approximately 1.5× the calculated dead-load deflection, to offset long-term sag and present a level/slightly-arched ceiling under dead load"
      ],
      "vectors": [
        {
          "name": "10mm dead-load deflection",
          "inputs": {
            "deadLoadDeflection": 0.01
          },
          "expected": 15,
          "toleranceDecimalPlaces": 0,
          "unit": "mm",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15mm dead-load deflection",
          "inputs": {
            "deadLoadDeflection": 0.015
          },
          "expected": 22.5,
          "toleranceDecimalPlaces": 1,
          "unit": "mm",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "truss-heel-height-calculator",
      "title": "Roof Truss Raised-Heel Height Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/truss-heel-height-calculator/",
      "sources": [
        "Energy-heel (raised-heel) truss design: heel height = desired insulation depth at the eave + bottom chord depth, so full R-value insulation is maintained out to the wall line"
      ],
      "vectors": [
        {
          "name": "12in insulation, 3.5in bottom chord",
          "inputs": {
            "insulationDepth": 0.3048,
            "bottomChordDepth": 0.0889
          },
          "expected": 15.5,
          "toleranceDecimalPlaces": 1,
          "unit": "in",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "14in insulation, 5.5in bottom chord",
          "inputs": {
            "insulationDepth": 0.3556,
            "bottomChordDepth": 0.1397
          },
          "expected": 19.5,
          "toleranceDecimalPlaces": 1,
          "unit": "in",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "truss-plate-connector-calculator",
      "title": "Truss Plate (MPC) Connector Sizing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/truss-plate-connector-calculator/",
      "sources": [
        "Metal plate connector (MPC) capacity is governed by manufacturer-tested tooth values per the Truss Plate Institute (ANSI/TPI 1) — this calculator divides your required joint load by your own plate's rated capacity-per-area to estimate the plate area needed, applied to each of the two side plates"
      ],
      "vectors": [
        {
          "name": "20kN joint, 0.05 kN/cm² plate",
          "inputs": {
            "jointLoad": 20000,
            "plateCapacityPerArea": 0.05
          },
          "expected": 200,
          "toleranceDecimalPlaces": 0,
          "unit": "cm²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total area (both side plates)",
              "value": 400,
              "unit": "cm²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "30kN joint, 0.06 kN/cm² plate",
          "inputs": {
            "jointLoad": 30000,
            "plateCapacityPerArea": 0.06
          },
          "expected": 250,
          "toleranceDecimalPlaces": 0,
          "unit": "cm²",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total area (both side plates)",
              "value": 500,
              "unit": "cm²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "tuckpointing-repair-volume-calculator",
      "title": "Tuckpointing Mortar Repair Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/tuckpointing-repair-volume-calculator/",
      "sources": [
        "Repair mortar volume = total joint length to be repointed x joint width x repair (raked-out) depth"
      ],
      "vectors": [
        {
          "name": "50m joint, 10mm wide, 20mm deep",
          "inputs": {
            "totalJointLength": 50,
            "jointWidth": 0.01,
            "repairDepth": 0.02
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Equivalent in cubic meters",
              "value": 0.01,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "80m joint, 13mm wide, 25mm deep",
          "inputs": {
            "totalJointLength": 80,
            "jointWidth": 0.013,
            "repairDepth": 0.025
          },
          "expected": 26,
          "toleranceDecimalPlaces": 0,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Equivalent in cubic meters",
              "value": 0.026000000000000002,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "two-pack-paint-mixing-calculator",
      "title": "Two-Pack Paint and Coating Mixing Calculator — Pot Life and Batch Size",
      "url": "https://craftquantities.com/calculators/materials-quantities/two-pack-paint-mixing-calculator/",
      "sources": [
        "The mixing ratio and the pot life both come from the product's own technical data sheet, and the ratio is stated there as either BY VOLUME or BY WEIGHT. The two are not interchangeable because the parts differ in density, and this page applies the ratio to whichever basis you select",
        "Pot life is quoted at a reference temperature, conventionally around 20 °C (68 °F), and shortens sharply as temperature rises — a widely used rule of thumb is that it roughly halves for every 10 °C above the quoted figure. That is an approximation for planning the batch size, not a property of any particular product",
        "A two-pack cures by reaction between the two parts in fixed proportion. Excess of either remains unreacted in the film, so an off-ratio mix is a permanently defective coating rather than a slightly different one — under-catalysed stays soft, over-catalysed turns brittle"
      ],
      "vectors": [
        {
          "name": "20 L of 4:1 at 20 °C, 40 minutes pot life, 12 L per hour",
          "inputs": {
            "totalMixedVolume": 20,
            "partsBase": 4,
            "partsHardener": 1,
            "ratioBasis": "volume",
            "potLifeMinutes": 40,
            "workingTemperatureC": 20,
            "applicationRatePerHour": 12
          },
          "expected": 2.11,
          "toleranceDecimalPlaces": 0,
          "unit": "gal",
          "confidence": "medium",
          "steps": [
            {
              "label": "Base in one batch",
              "value": 1.69070113509215,
              "unit": "gal"
            },
            {
              "label": "Hardener in one batch",
              "value": 0.4226752837730375,
              "unit": "gal"
            },
            {
              "label": "Batches for the whole job",
              "value": 3,
              "unit": "batches"
            },
            {
              "label": "Working time at this temperature",
              "value": 40,
              "unit": "min"
            },
            {
              "label": "Base for the whole job",
              "value": 4.226752837730375,
              "unit": "gal"
            },
            {
              "label": "Hardener for the whole job",
              "value": 1.0566882094325938,
              "unit": "gal"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "ten degrees warmer halves the pot life and halves the batch",
          "inputs": {
            "totalMixedVolume": 20,
            "partsBase": 4,
            "partsHardener": 1,
            "ratioBasis": "volume",
            "potLifeMinutes": 40,
            "workingTemperatureC": 30,
            "applicationRatePerHour": 12
          },
          "expected": 1.06,
          "toleranceDecimalPlaces": 0,
          "unit": "gal",
          "confidence": "medium",
          "steps": [
            {
              "label": "Base in one batch",
              "value": 0.845350567546075,
              "unit": "gal"
            },
            {
              "label": "Hardener in one batch",
              "value": 0.21133764188651874,
              "unit": "gal"
            },
            {
              "label": "Batches for the whole job",
              "value": 5,
              "unit": "batches"
            },
            {
              "label": "Working time at this temperature",
              "value": 20,
              "unit": "min"
            },
            {
              "label": "Base for the whole job",
              "value": 4.226752837730375,
              "unit": "gal"
            },
            {
              "label": "Hardener for the whole job",
              "value": 1.0566882094325938,
              "unit": "gal"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "a batch bigger than the job is capped at the job",
          "inputs": {
            "totalMixedVolume": 5,
            "partsBase": 4,
            "partsHardener": 1,
            "ratioBasis": "volume",
            "potLifeMinutes": 40,
            "workingTemperatureC": 20,
            "applicationRatePerHour": 30
          },
          "expected": 1.32,
          "toleranceDecimalPlaces": 0,
          "unit": "gal",
          "confidence": "medium",
          "steps": [
            {
              "label": "Base in one batch",
              "value": 1.0566882094325938,
              "unit": "gal"
            },
            {
              "label": "Hardener in one batch",
              "value": 0.26417205235814845,
              "unit": "gal"
            },
            {
              "label": "Batches for the whole job",
              "value": 1,
              "unit": "batch"
            },
            {
              "label": "Working time at this temperature",
              "value": 40,
              "unit": "min"
            },
            {
              "label": "Base for the whole job",
              "value": 1.0566882094325938,
              "unit": "gal"
            },
            {
              "label": "Hardener for the whole job",
              "value": 0.26417205235814845,
              "unit": "gal"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "u-value-imperial-to-si-calculator",
      "title": "U-Factor Converter (BTU/hr·ft²·°F to W/m²K)",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/u-value-imperial-to-si-calculator/",
      "sources": [
        "NIST Guide to the SI (SP 811), Appendix B.8, factors listed alphabetically: to convert from British thermal unit (IT) per hour square foot degree Fahrenheit to watt per square meter kelvin, multiply by 5.678 263 E+00",
        "R = 1 ÷ U within one system: the reciprocal of a US U-factor is a US R-value, the reciprocal of a metric U-value is an RSI, each counting the inside and outside air films",
        "NFRC 100 window and door ratings, the International Energy Conservation Code and ANSI/ASHRAE/IES Standard 90.1 state their U-factors in BTU/(hr·ft²·°F)"
      ],
      "vectors": [
        {
          "name": "A U-1.0 element",
          "inputs": {
            "uValueImperial": 1
          },
          "expected": 5.678263,
          "toleranceDecimalPlaces": 5,
          "unit": "W/m²K",
          "confidence": "high",
          "steps": [
            {
              "label": "BTU/hr·ft²·°F entered",
              "value": 1,
              "unit": "BTU/hr·ft²·°F"
            },
            {
              "label": "US R-value (1 ÷ U-factor)",
              "value": 1,
              "unit": "hr·ft²·°F/BTU"
            },
            {
              "label": "Thermal resistance, RSI (1 ÷ U)",
              "value": 0.17611018368230585,
              "unit": "m²K/W"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "An NFRC U-0.30 window",
          "inputs": {
            "uValueImperial": 0.3
          },
          "expected": 1.703479,
          "toleranceDecimalPlaces": 5,
          "unit": "W/m²K",
          "confidence": "high",
          "steps": [
            {
              "label": "BTU/hr·ft²·°F entered",
              "value": 0.3,
              "unit": "BTU/hr·ft²·°F"
            },
            {
              "label": "US R-value (1 ÷ U-factor)",
              "value": 3.3333333333333335,
              "unit": "hr·ft²·°F/BTU"
            },
            {
              "label": "Thermal resistance, RSI (1 ÷ U)",
              "value": 0.5870339456076863,
              "unit": "m²K/W"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The sloping-ceiling guide's 0.0317 is its 0.18 W/m²K target",
          "inputs": {
            "uValueImperial": 0.0317
          },
          "expected": 0.18,
          "toleranceDecimalPlaces": 4,
          "unit": "W/m²K",
          "confidence": "high",
          "steps": [
            {
              "label": "BTU/hr·ft²·°F entered",
              "value": 0.0317,
              "unit": "BTU/hr·ft²·°F"
            },
            {
              "label": "US R-value (1 ÷ U-factor)",
              "value": 31.545741324921135,
              "unit": "hr·ft²·°F/BTU"
            },
            {
              "label": "Thermal resistance, RSI (1 ÷ U)",
              "value": 5.555526299126368,
              "unit": "m²K/W"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "u-value-si-to-imperial-calculator",
      "title": "U-Value Converter (W/m²K to BTU/hr·ft²·°F)",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/u-value-si-to-imperial-calculator/",
      "sources": [
        "NIST SP 811, Appendix B: 1 Btu(IT)/(h·ft²·°F) = 5.678 263 W/(m²·K), from the International Table BTU (1055.05585262 J), the foot (0.3048 m) and the Fahrenheit degree (5/9 K)",
        "U = 1 ÷ R in either system, with R the total resistance of the element including its surface resistances"
      ],
      "vectors": [
        {
          "name": "Single glazing at 5.7 W/m²K",
          "inputs": {
            "uValueSi": 5.7
          },
          "expected": 1.003828,
          "toleranceDecimalPlaces": 5,
          "unit": "BTU/hr·ft²·°F",
          "confidence": "high",
          "steps": [
            {
              "label": "W/m²K entered",
              "value": 5.7,
              "unit": "W/m²K"
            },
            {
              "label": "Thermal resistance, RSI (1 ÷ U)",
              "value": 0.17543859649122806,
              "unit": "m²K/W"
            },
            {
              "label": "US R-value (1 ÷ U-factor)",
              "value": 0.9961865510725416,
              "unit": "hr·ft²·°F/BTU"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The cavity-fill guide's 0.30 W/m²K wall",
          "inputs": {
            "uValueSi": 0.3
          },
          "expected": 0.052833,
          "toleranceDecimalPlaces": 5,
          "unit": "BTU/hr·ft²·°F",
          "confidence": "high",
          "steps": [
            {
              "label": "W/m²K entered",
              "value": 0.3,
              "unit": "W/m²K"
            },
            {
              "label": "Thermal resistance, RSI (1 ÷ U)",
              "value": 3.3333333333333335,
              "unit": "m²K/W"
            },
            {
              "label": "US R-value (1 ÷ U-factor)",
              "value": 18.927544470378294,
              "unit": "hr·ft²·°F/BTU"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The sloping-ceiling guide's 0.18 target",
          "inputs": {
            "uValueSi": 0.18
          },
          "expected": 0.0317,
          "toleranceDecimalPlaces": 4,
          "unit": "BTU/hr·ft²·°F",
          "confidence": "high",
          "steps": [
            {
              "label": "W/m²K entered",
              "value": 0.18,
              "unit": "W/m²K"
            },
            {
              "label": "Thermal resistance, RSI (1 ÷ U)",
              "value": 5.555555555555555,
              "unit": "m²K/W"
            },
            {
              "label": "US R-value (1 ÷ U-factor)",
              "value": 31.545907450630484,
              "unit": "hr·ft²·°F/BTU"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "u-value-to-r-value-calculator",
      "title": "U-Value to R-Value Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/u-value-to-r-value-calculator/",
      "sources": [
        "R = 1 / U, the reciprocal of thermal transmittance",
        "Imperial U (BTU/hr-ft2-F) and metric U (W/m2K) differ by a factor of about 5.678"
      ],
      "vectors": [
        {
          "name": "0.05 BTU/hr·ft²·°F converts correctly",
          "inputs": {
            "uValue": 0.05
          },
          "expected": 20,
          "toleranceDecimalPlaces": 6,
          "unit": "hr·ft²·°F/BTU",
          "confidence": "high",
          "steps": [],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "uValue": 0.5
          },
          "expected": 2,
          "toleranceDecimalPlaces": 6,
          "unit": "hr·ft²·°F/BTU",
          "confidence": "high",
          "steps": [],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "uk-stamp-duty-calculator",
      "title": "UK Stamp Duty (SDLT) Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/uk-stamp-duty-calculator/",
      "sources": [
        "HMRC Stamp Duty Land Tax residential rates, England and Northern Ireland, effective from 1 April 2025",
        "Higher rates for additional dwellings: standard rates plus 5 percentage points in every band, from 31 October 2024",
        "First-time buyer relief from 1 April 2025: nil to £300,000, 5% from £300,001 to £500,000, no relief above £500,000"
      ],
      "vectors": [
        {
          "name": "£300,000 standard purchase",
          "inputs": {
            "price": 300000,
            "buyerType": "standard"
          },
          "expected": 5000,
          "toleranceDecimalPlaces": -2,
          "unit": "£",
          "confidence": "medium",
          "steps": [
            {
              "label": "Effective rate on the whole price",
              "value": 1.6666666666666667,
              "unit": "%"
            },
            {
              "label": "At standard rates",
              "value": 5000,
              "unit": "£"
            },
            {
              "label": "Difference from standard",
              "value": 0,
              "unit": "£"
            },
            {
              "label": "Price plus tax",
              "value": 305000,
              "unit": "£"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "£300,000 first-time buyer pays nothing",
          "inputs": {
            "price": 300000,
            "buyerType": "firstTime"
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "£",
          "confidence": "medium",
          "steps": [
            {
              "label": "Effective rate on the whole price",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "At standard rates",
              "value": 5000,
              "unit": "£"
            },
            {
              "label": "Difference from standard",
              "value": -5000,
              "unit": "£"
            },
            {
              "label": "Price plus tax",
              "value": 300000,
              "unit": "£"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "£300,000 as an additional property",
          "inputs": {
            "price": 300000,
            "buyerType": "additional"
          },
          "expected": 20000,
          "toleranceDecimalPlaces": 2,
          "unit": "£",
          "confidence": "medium",
          "steps": [
            {
              "label": "Effective rate on the whole price",
              "value": 6.666666666666667,
              "unit": "%"
            },
            {
              "label": "At standard rates",
              "value": 5000,
              "unit": "£"
            },
            {
              "label": "Difference from standard",
              "value": 15000,
              "unit": "£"
            },
            {
              "label": "Price plus tax",
              "value": 320000,
              "unit": "£"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "£500,000 standard purchase",
          "inputs": {
            "price": 500000,
            "buyerType": "standard"
          },
          "expected": 15000,
          "toleranceDecimalPlaces": 2,
          "unit": "£",
          "confidence": "medium",
          "steps": [
            {
              "label": "Effective rate on the whole price",
              "value": 3,
              "unit": "%"
            },
            {
              "label": "At standard rates",
              "value": 15000,
              "unit": "£"
            },
            {
              "label": "Difference from standard",
              "value": 0,
              "unit": "£"
            },
            {
              "label": "Price plus tax",
              "value": 515000,
              "unit": "£"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "£600,000 first-time buyer loses the relief entirely",
          "inputs": {
            "price": 600000,
            "buyerType": "firstTime"
          },
          "expected": 20000,
          "toleranceDecimalPlaces": 2,
          "unit": "£",
          "confidence": "medium",
          "steps": [
            {
              "label": "Effective rate on the whole price",
              "value": 3.3333333333333335,
              "unit": "%"
            },
            {
              "label": "At standard rates",
              "value": 20000,
              "unit": "£"
            },
            {
              "label": "Difference from standard",
              "value": 0,
              "unit": "£"
            },
            {
              "label": "Price plus tax",
              "value": 620000,
              "unit": "£"
            },
            {
              "label": "Relief withdrawn — price exceeds £500,000",
              "value": 0,
              "unit": "£"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Nothing is due on a zero price",
          "inputs": {
            "price": 0,
            "buyerType": "standard"
          },
          "expected": 0,
          "toleranceDecimalPlaces": 8,
          "unit": "£",
          "confidence": "medium",
          "steps": [
            {
              "label": "Effective rate on the whole price",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "At standard rates",
              "value": 0,
              "unit": "£"
            },
            {
              "label": "Difference from standard",
              "value": 0,
              "unit": "£"
            },
            {
              "label": "Price plus tax",
              "value": 0,
              "unit": "£"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "under-slab-perimeter-foam-calculator",
      "title": "Under-Slab Perimeter Rigid Foam Board Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/under-slab-perimeter-foam-calculator/",
      "sources": [
        "Board count = ceil(perimeter length ÷ standard board length), since slab-edge insulation is installed as a continuous vertical/under-slab strip around the foundation perimeter rather than covering a full area"
      ],
      "vectors": [
        {
          "name": "40m perimeter, 2.4m boards",
          "inputs": {
            "perimeterLength": 40,
            "boardLength": 2.4
          },
          "expected": 17,
          "toleranceDecimalPlaces": 0,
          "unit": "boards",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "55m perimeter, 2.4m boards",
          "inputs": {
            "perimeterLength": 55,
            "boardLength": 2.4
          },
          "expected": 23,
          "toleranceDecimalPlaces": 0,
          "unit": "boards",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "under-slab-seam-tape-calculator",
      "title": "Under-Slab Vapor Barrier Seam Tape Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/under-slab-seam-tape-calculator/",
      "sources": [
        "Number of seams = ceil(slab width ÷ sheet width) − 1; total seam tape = seams × slab length × (1 + waste allowance), the standard method for taping overlap seams across a wide under-slab vapor barrier installation"
      ],
      "vectors": [
        {
          "name": "20m x 15m slab, 6.1m sheets, 5% waste",
          "inputs": {
            "slabWidth": 20,
            "sheetWidth": 6.1,
            "slabLength": 15,
            "wastePercent": 5
          },
          "expected": 47.25,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Number of seams",
              "value": 3
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "25m x 18m slab, 6.1m sheets, 8% waste",
          "inputs": {
            "slabWidth": 25,
            "sheetWidth": 6.1,
            "slabLength": 18,
            "wastePercent": 8
          },
          "expected": 77.76,
          "toleranceDecimalPlaces": 2,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Number of seams",
              "value": 4
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "underfloor-heating-mat-calculator",
      "title": "Electric Underfloor Heating Mat Area Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/underfloor-heating-mat-calculator/",
      "sources": [
        "Heating mat is laid only on the free floor: never beneath a fixed fixture such as a WC pan, basin pedestal, bath or fitted furniture, where the heat it produces has no path out of the floor",
        "A setback is kept from walls and fixtures so the cable clears skirtings, sealant lines and later fixings; manufacturers commonly specify between 50 and 100 mm",
        "The mesh backing may be cut and turned to fit a shape, but the heating cable itself must never be cut or shortened — a mat is selected to fit the area rather than trimmed to it",
        "SunTouch TapeMat installation manual, Table 2 - Mat Sizes: 120 VAC mats 2 ft wide in 10, 15, 20, 25, 30, 35, 40, 45, 50, 60, 70, 80, 90 and 100 sq ft — the whole-square-foot sizes the imperial breakdown chooses from"
      ],
      "vectors": [
        {
          "name": "3 x 2 m room, 50 mm setback, 0.9 m² of fixtures",
          "inputs": {
            "roomLength": 3,
            "roomWidth": 2,
            "setback": 0.05,
            "fixtureFootprint": 0.9
          },
          "expected": 49.623,
          "toleranceDecimalPlaces": 2,
          "unit": "sq ft",
          "confidence": "medium",
          "steps": [
            {
              "label": "Room floor, gross",
              "value": 64.58346250025834,
              "unit": "sq ft"
            },
            {
              "label": "After the setback at every wall",
              "value": 59.30914639607057,
              "unit": "sq ft"
            },
            {
              "label": "Fixtures deducted",
              "value": 9.68751937503875,
              "unit": "sq ft"
            },
            {
              "label": "Largest standard mat that fits",
              "value": 45,
              "unit": "sq ft"
            },
            {
              "label": "Floor left unheated by that mat",
              "value": 4.621627021031813,
              "unit": "sq ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The same room with a bath in it",
          "inputs": {
            "roomLength": 3,
            "roomWidth": 2,
            "setback": 0.05,
            "fixtureFootprint": 2.1
          },
          "expected": 36.705,
          "toleranceDecimalPlaces": 2,
          "unit": "sq ft",
          "confidence": "medium",
          "steps": [
            {
              "label": "Room floor, gross",
              "value": 64.58346250025834,
              "unit": "sq ft"
            },
            {
              "label": "After the setback at every wall",
              "value": 59.30914639607057,
              "unit": "sq ft"
            },
            {
              "label": "Fixtures deducted",
              "value": 22.604211875090417,
              "unit": "sq ft"
            },
            {
              "label": "Largest standard mat that fits",
              "value": 35,
              "unit": "sq ft"
            },
            {
              "label": "Floor left unheated by that mat",
              "value": 1.7049345209801459,
              "unit": "sq ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A wider setback costs more than people expect",
          "inputs": {
            "roomLength": 3,
            "roomWidth": 2,
            "setback": 0.1,
            "fixtureFootprint": 0.9
          },
          "expected": 44.563,
          "toleranceDecimalPlaces": 2,
          "unit": "sq ft",
          "confidence": "medium",
          "steps": [
            {
              "label": "Room floor, gross",
              "value": 64.58346250025834,
              "unit": "sq ft"
            },
            {
              "label": "After the setback at every wall",
              "value": 54.250108500216996,
              "unit": "sq ft"
            },
            {
              "label": "Fixtures deducted",
              "value": 9.68751937503875,
              "unit": "sq ft"
            },
            {
              "label": "Largest standard mat that fits",
              "value": 40,
              "unit": "sq ft"
            },
            {
              "label": "Floor left unheated by that mat",
              "value": 4.562589125178242,
              "unit": "sq ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A 10 x 8 ft bathroom, 2 in setback, 10 sq ft of fixtures",
          "inputs": {
            "roomLength": 3.048,
            "roomWidth": 2.4384,
            "setback": 0.0508,
            "fixtureFootprint": 0.9290304
          },
          "expected": 64.111,
          "toleranceDecimalPlaces": 2,
          "unit": "sq ft",
          "confidence": "medium",
          "steps": [
            {
              "label": "Room floor, gross",
              "value": 80,
              "unit": "sq ft"
            },
            {
              "label": "After the setback at every wall",
              "value": 74.11111111111111,
              "unit": "sq ft"
            },
            {
              "label": "Fixtures deducted",
              "value": 10,
              "unit": "sq ft"
            },
            {
              "label": "Largest standard mat that fits",
              "value": 60,
              "unit": "sq ft"
            },
            {
              "label": "Floor left unheated by that mat",
              "value": 4.111111111111114,
              "unit": "sq ft"
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        }
      ]
    },
    {
      "slug": "underpinning-pit-volume-calculator",
      "title": "Underpinning Pit Excavation Volume Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/underpinning-pit-volume-calculator/",
      "sources": [
        "Underpinning is typically excavated as a series of individual pits beneath an existing footing; total excavation volume = pit count x pit length x pit width x pit depth"
      ],
      "vectors": [
        {
          "name": "5 pits, 1.2x1.0x1.5m",
          "inputs": {
            "pitCount": 5,
            "pitLength": 1.2,
            "pitWidth": 1,
            "pitDepth": 1.5
          },
          "expected": 9,
          "toleranceDecimalPlaces": 0,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Volume per pit",
              "value": 1.7999999999999998,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "8 pits, 1.0x0.8x1.2m",
          "inputs": {
            "pitCount": 8,
            "pitLength": 1,
            "pitWidth": 0.8,
            "pitDepth": 1.2
          },
          "expected": 7.68,
          "toleranceDecimalPlaces": 2,
          "unit": "m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Volume per pit",
              "value": 0.96,
              "unit": "m³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "us-gallons-to-liters-calculator",
      "title": "US Gallons to Litres Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/us-gallons-to-liters-calculator/",
      "sources": [
        "1 US liquid gallon is defined as 231 cubic inches = 3.785411784 L exactly"
      ],
      "vectors": [
        {
          "name": "5 US gal converts correctly",
          "inputs": {
            "gallons": 5
          },
          "expected": 18.92705892,
          "toleranceDecimalPlaces": 6,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 3.785411784,
              "unit": "L per US gal"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "gallons": 50
          },
          "expected": 189.2705892,
          "toleranceDecimalPlaces": 6,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 3.785411784,
              "unit": "L per US gal"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "vapor-barrier-calculator",
      "title": "Vapor Barrier Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/vapor-barrier-calculator/",
      "sources": [
        "A standard 6-mil poly vapor barrier roll (10 ft x 100 ft) covers approximately 1,000 sq ft"
      ],
      "vectors": [
        {
          "name": "100m² crawlspace",
          "inputs": {
            "area": 100
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Area to cover (with overlap allowance)",
              "value": 1184.0301458380693,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "200m² crawlspace",
          "inputs": {
            "area": 200
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Area to cover (with overlap allowance)",
              "value": 2368.0602916761386,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "176.5m² crawlspace with no overlap allowance",
          "inputs": {
            "area": 176.5,
            "overlapPercent": 0
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Area to cover (with overlap allowance)",
              "value": 1899.8301885492658,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "vapor-barrier-dewpoint-calculator",
      "title": "Vapor Barrier Dew-Point Condensation Risk Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/vapor-barrier-dewpoint-calculator/",
      "sources": [
        "Simplified steady-state temperature gradient method: the temperature at any point within an insulated assembly = interior temp − (R-value from interior to that point ÷ total assembly R-value) × (interior temp − exterior temp); condensation risk exists if this temperature falls below the interior air's dew point"
      ],
      "vectors": [
        {
          "name": "R20 assembly, VB at R5 from interior (pass)",
          "inputs": {
            "interiorTemp": 21,
            "exteriorTemp": -10,
            "totalRValue": 20,
            "interiorRValue": 5,
            "dewPoint": 10
          },
          "expected": 13.25,
          "toleranceDecimalPlaces": 1,
          "unit": "°C",
          "confidence": "medium",
          "steps": [
            {
              "label": "Interior air dew point",
              "value": 10,
              "unit": "°C"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "R15 assembly, VB at R8 from interior (fail)",
          "inputs": {
            "interiorTemp": 21,
            "exteriorTemp": -15,
            "totalRValue": 15,
            "interiorRValue": 8,
            "dewPoint": 12
          },
          "expected": 1.8,
          "toleranceDecimalPlaces": 1,
          "unit": "°C",
          "confidence": "medium",
          "steps": [
            {
              "label": "Interior air dew point",
              "value": 12,
              "unit": "°C"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "vav-reheat-coil-capacity-calculator",
      "title": "VAV Terminal Reheat Coil Sensible Heat Capacity Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/vav-reheat-coil-capacity-calculator/",
      "sources": [
        "Q(Btu/hr) = 1.08 x CFM x deltaT, the standard ASHRAE sensible heat formula for air at standard conditions (60 min/hr x 0.075 lb/ft³ standard air density x 0.24 Btu/(lb*F) specific heat of air is approximately 1.08). This is a simplified sizing/balance check; full VAV reheat coil selection also accounts for entering water temperature, coil rows, fin spacing, and actual air density at altitude."
      ],
      "vectors": [
        {
          "name": "600 CFM, 40°F rise",
          "inputs": {
            "airflow": 283.1685,
            "reheatRise": 22.2222222
          },
          "expected": 25920,
          "toleranceDecimalPlaces": -1,
          "unit": "BTU/hr",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1000 CFM, 30°F rise",
          "inputs": {
            "airflow": 471.9474,
            "reheatRise": 16.6666667
          },
          "expected": 32400,
          "toleranceDecimalPlaces": -1,
          "unit": "BTU/hr",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "vegetative-roof-drainage-layer-calculator",
      "title": "Vegetative (Green) Roof Drainage Layer Calculator",
      "url": "https://craftquantities.com/calculators/sustainability-compliance/vegetative-roof-drainage-layer-calculator/",
      "sources": [
        "Roll count = ceil(roof area ÷ roll coverage area), the standard method for estimating rolled drainage composite/mat material installed beneath a green roof's growing medium"
      ],
      "vectors": [
        {
          "name": "90m² roof, 9.3m² roll",
          "inputs": {
            "roofArea": 90,
            "rollCoverageArea": 9.3
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "130m² roof, 9.3m² roll",
          "inputs": {
            "roofArea": 130,
            "rollCoverageArea": 9.3
          },
          "expected": 14,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "veneer-shelf-angle-load-calculator",
      "title": "Masonry Veneer Shelf Angle Load Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/veneer-shelf-angle-load-calculator/",
      "sources": [
        "Load per linear meter = supported veneer height x veneer thickness x brick density x gravitational acceleration"
      ],
      "vectors": [
        {
          "name": "3m veneer, 0.1m thick, 1900 kg/m³",
          "inputs": {
            "veneerHeight": 3,
            "veneerThickness": 0.1,
            "brickDensity": 1900
          },
          "expected": 5.591,
          "toleranceDecimalPlaces": 1,
          "unit": "kN/m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in lb/ft",
              "value": 383.1533490600001,
              "unit": "lb/ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "4m veneer, 0.09m thick, 1800 kg/m³",
          "inputs": {
            "veneerHeight": 4,
            "veneerThickness": 0.09,
            "brickDensity": 1800
          },
          "expected": 6.357,
          "toleranceDecimalPlaces": 2,
          "unit": "kN/m",
          "confidence": "medium",
          "steps": [
            {
              "label": "Equivalent in lb/ft",
              "value": 435.584859984,
              "unit": "lb/ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "vibration-isolator-deflection-calculator",
      "title": "HVAC Vibration Isolation Spring Static Deflection Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/vibration-isolator-deflection-calculator/",
      "sources": [
        "Static deflection δ = Supported Weight ÷ Spring Rate (Hooke's Law), the standard way to characterize a spring isolator's deflection under load, applied in HVAC equipment isolation selection per ASHRAE Handbook — HVAC Applications (Noise and Vibration Control) and the SMACNA Seismic Restraint Manual. Typical target deflection ranges vary by application: ~0.25-0.35 in for slab-on-grade equipment, ~0.75-1 in for upper-floor mounting, up to 2 in for fans, and 1-4 in for rooftop units — actual isolator selection should follow the full isolation-efficiency calculation (disturbing frequency vs. isolator natural frequency), not deflection alone."
      ],
      "vectors": [
        {
          "name": "500 lb on a 300 lb/in spring",
          "inputs": {
            "isolatorLoad": 226.796185,
            "springRate": 300
          },
          "expected": 1.667,
          "toleranceDecimalPlaces": 1,
          "unit": "in",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1200 lb on a 400 lb/in spring",
          "inputs": {
            "isolatorLoad": 544.310844,
            "springRate": 400
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "in",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "vinyl-sheet-seam-calculator",
      "title": "Vinyl Sheet Flooring Roll Seam Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/vinyl-sheet-seam-calculator/",
      "sources": [
        "Seams needed = ceil(room width ÷ roll width) − 1, since the first roll width strip needs no seam and each additional strip requires one"
      ],
      "vectors": [
        {
          "name": "5m room, 3.66m roll",
          "inputs": {
            "roomWidth": 5,
            "rollWidth": 3.66
          },
          "expected": 1,
          "toleranceDecimalPlaces": 0,
          "unit": "seams",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "8m room, 3.66m roll",
          "inputs": {
            "roomWidth": 8,
            "rollWidth": 3.66
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "seams",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "wall-formwork-pressure-calculator",
      "title": "ACI 347 Wall Formwork Rate-of-Placement Pressure Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/wall-formwork-pressure-calculator/",
      "sources": [
        "ACI 347R-14(21) Guide to Formwork for Concrete, Section 2.2.2, Eq. 2.4 (used across its full 0-15 ft/hr rate range as a single conservative envelope formula, since Eq. 2.3 and 2.4 are continuous and equal at R=7 ft/hr and Eq. 2.4 is always ≥ Eq. 2.3 below that): Pmax = Cw×Cc×[150 + 43400/T + 2800R/T] psf, with a floor of 600×Cw psf and a ceiling of full hydrostatic pressure (w×h). Cw (unit weight coefficient, Table 2.1) = 1.0 for 140-150 pcf concrete. Cc (chemistry coefficient, Table 2.2) = 1.0 for ordinary Type I/II/III cement with no retarder, rising to 1.2-1.4 for retarders or high slag/fly-ash content. This formula ONLY applies when slump ≤ 7 in, placement uses normal internal vibration to a depth ≤4ft, and R≤15 ft/hr — this is DISTINCT from this site's existing SCC formwork pressure calculator, which correctly uses full hydrostatic pressure (ACI 347R Eq. 2.1a) for self-consolidating concrete, since SCC and high-slump/retarded mixes fall outside this reduced formula's applicability and ACI 347R itself directs using full hydrostatic pressure for those cases."
      ],
      "vectors": [
        {
          "name": "150pcf, 5ft/hr, 70°F, Cc=1.0, 15.24m (50ft) wall",
          "inputs": {
            "freshDensity": 2402.7695061,
            "pourRate": 5,
            "concreteTemperature": 21.1111111,
            "cementCoefficient": "1.0",
            "wallHeight": 15.24
          },
          "expected": 970,
          "toleranceDecimalPlaces": -1,
          "unit": "psf",
          "confidence": "medium",
          "steps": [
            {
              "label": "Unit weight coefficient Cw",
              "value": 1,
              "unit": "(dimensionless)"
            },
            {
              "label": "Full hydrostatic ceiling",
              "value": 7499.999999999999,
              "unit": "psf"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150pcf, 6ft/hr, 60°F, Cc=1.2, 15.24m (50ft) wall",
          "inputs": {
            "freshDensity": 2402.7695061,
            "pourRate": 6,
            "concreteTemperature": 15.5555556,
            "cementCoefficient": "1.2",
            "wallHeight": 15.24
          },
          "expected": 1384,
          "toleranceDecimalPlaces": -1,
          "unit": "psf",
          "confidence": "medium",
          "steps": [
            {
              "label": "Unit weight coefficient Cw",
              "value": 1,
              "unit": "(dimensionless)"
            },
            {
              "label": "Full hydrostatic ceiling",
              "value": 7499.999999999999,
              "unit": "psf"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "wall-niche-framing-calculator",
      "title": "Decorative Wall Niche/Display Alcove Framing Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/wall-niche-framing-calculator/",
      "sources": [
        "Framing length = 2 × (Niche Width + Niche Height) — the standard perimeter framing takeoff for a rectangular wall niche or recessed display alcove opening."
      ],
      "vectors": [
        {
          "name": "0.9x0.6m niche",
          "inputs": {
            "nicheWidth": 0.9,
            "nicheHeight": 0.6
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1.2x0.8m niche",
          "inputs": {
            "nicheWidth": 1.2,
            "nicheHeight": 0.8
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "wall-tie-density-calculator",
      "title": "Brick Veneer Wall Tie Density Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/wall-tie-density-calculator/",
      "sources": [
        "IRC/IBC standard: each wall tie supports no more than 2.67 sq ft of wall area in normal conditions, or no more than 2 sq ft in high seismic design categories or wind pressure exceeding 30 psf"
      ],
      "vectors": [
        {
          "name": "20m² wall, standard conditions",
          "inputs": {
            "wallArea": 20,
            "highSeismicOrWind": "no"
          },
          "expected": 81,
          "toleranceDecimalPlaces": 0,
          "unit": "ties",
          "confidence": "medium",
          "steps": [
            {
              "label": "Wall area",
              "value": 215.27820833419443,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "25m² wall, high seismic/wind",
          "inputs": {
            "wallArea": 25,
            "highSeismicOrWind": "yes"
          },
          "expected": 135,
          "toleranceDecimalPlaces": 0,
          "unit": "ties",
          "confidence": "medium",
          "steps": [
            {
              "label": "Wall area",
              "value": 269.097760417743,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "wallpaper-calculator",
      "title": "Wallpaper Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/wallpaper-calculator/",
      "sources": [
        "US double rolls: the page divides the wall area, with the pattern-match waste added, by 56 sq ft a double roll (York Wallcoverings lists a 20.5 in × 33 ft double roll as covering about 56.4 sq ft)",
        "10% waste is standard; large pattern repeats or diagonal cuts can push waste to 20-25%",
        "A.S. Création Tapeten AG, Thermo-Wall technical data sheet (December 2022): rolls of 10.05 m × 0.53 m (Euro roll) and 10.05 m × 1.06 m (wide roll), dimensional tolerances to DIN EN 233, the European specification for finished wallpapers",
        "A.S. Création, roll calculator guidance: standard roll formats are Euro rolls of 10.05 m × 0.53 m; the room perimeter and height decide the rolls; add about 5 cm to the room height to avoid a tight cut; plan a spare roll for later repairs",
        "York Wallcoverings, product data and roll calculator (read 2026-10-05): a double roll of 20.5 in × 33 ft covering about 56.4 sq ft, another of 27 in × 27 ft covering about 60.8 sq ft; the calculator takes the strip as the wall height rounded up to whole pattern repeats, the strips as the wall width over the roll width rounded up, less one whole strip for each roll width an opening spans, and the rolls as the strips over the whole strips a roll gives, the roll length over the strip rounded down; it takes no match type. This page departs from it in three places: it adds the makers' trim before rounding, it takes nothing off for openings, and it lets the last drop on a roll stop at the wall height and the trim rather than at a whole strip",
        "York Wallcoverings installation guide: measure the wall height and allow approximately 4 in of additional length, about 2 in at the ceiling and 2 in at the baseboard, for trimming, accounting for the pattern repeat and match",
        "Meinewand, calculating wallpaper with a repeat: strips needed are the wall width over the roll width; the panel length is the number of repeats that cover the room height times the repeat; one roll gives the roll length over the panel length (2.65 m room, 0.72 m repeat, 10.05 × 0.53 m roll: 4 repeats, 2.88 m panels, 3 a roll)",
        "Farrow & Ball, calculating wallpaper quantities: every roll 10 m long and 53 cm wide; in a standard 2.4 m high room, three drops a roll for small pattern repeats and four for striped papers",
        "Cole & Son hanging instructions and Graham & Brown's wallpaper FAQs: a random or free match has nothing to line up at the joining edge; a straight match joins in the same place on the next drop; a half-drop or offset match drops half a repeat from side to side and repeats at the ceiling line on every other strip",
        "Graham & Brown, how to hang wallpaper: a roll is 52 to 53 cm wide; allow a little extra, for example 2 to 3 cm at the top, and trim in line with the ceiling"
      ],
      "vectors": [
        {
          "name": "4x3.5m room, 2.4m walls, no pattern match",
          "inputs": {
            "roomLength": 4,
            "roomWidth": 3.5,
            "wallHeight": 2.4,
            "patternRepeat": "none"
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "double rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Wall area",
              "value": 387.50077500155,
              "unit": "sq ft"
            },
            {
              "label": "Waste factor applied",
              "value": 10,
              "unit": "%"
            },
            {
              "label": "Area with waste",
              "value": 426.250852501705,
              "unit": "sq ft"
            }
          ],
          "includesAllowance": {
            "label": "Pattern-match waste",
            "percent": 10,
            "base": 6.91965669645625
          },
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "5x4m room, 2.5m walls, large pattern repeat",
          "inputs": {
            "roomLength": 5,
            "roomWidth": 4,
            "wallHeight": 2.5,
            "patternRepeat": "large"
          },
          "expected": 11,
          "toleranceDecimalPlaces": 0,
          "unit": "double rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Wall area",
              "value": 484.3759687519375,
              "unit": "sq ft"
            },
            {
              "label": "Waste factor applied",
              "value": 25,
              "unit": "%"
            },
            {
              "label": "Area with waste",
              "value": 605.4699609399219,
              "unit": "sq ft"
            }
          ],
          "includesAllowance": {
            "label": "Pattern-match waste",
            "percent": 25,
            "base": 8.649570870570312
          },
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Drops: 4 x 3.5 m room, 2.4 m walls, Euro roll, 53 cm straight repeat, 5 cm trim",
          "inputs": {
            "roomLength": 4,
            "roomWidth": 3.5,
            "wallHeight": 2.4,
            "rollType": "drops",
            "patternRepeat": "small",
            "rollLength": 10.05,
            "rollWidth": 0.53,
            "matchType": "straight",
            "repeatLength": 0.53,
            "trimAllowance": 0.05
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Wall area",
              "value": 36,
              "unit": "m²"
            },
            {
              "label": "Wall run round the room",
              "value": 15,
              "unit": "m"
            },
            {
              "label": "Length cut for each drop",
              "value": 2.6500000000000004,
              "unit": "m"
            },
            {
              "label": "Drops one roll gives",
              "value": 3,
              "unit": "drops"
            },
            {
              "label": "Drops needed round the room",
              "value": 29,
              "unit": "drops"
            },
            {
              "label": "Paper left on each roll",
              "value": 2.3000000000000003,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 6
        },
        {
          "name": "Drops: the same room in a free-match paper, four drops a roll",
          "inputs": {
            "roomLength": 4,
            "roomWidth": 3.5,
            "wallHeight": 2.4,
            "rollType": "drops",
            "patternRepeat": "small",
            "rollLength": 10.05,
            "rollWidth": 0.53,
            "matchType": "free",
            "repeatLength": 0.53,
            "trimAllowance": 0.05
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Wall area",
              "value": 36,
              "unit": "m²"
            },
            {
              "label": "Wall run round the room",
              "value": 15,
              "unit": "m"
            },
            {
              "label": "Length cut for each drop",
              "value": 2.4499999999999997,
              "unit": "m"
            },
            {
              "label": "Drops one roll gives",
              "value": 4,
              "unit": "drops"
            },
            {
              "label": "Drops needed round the room",
              "value": 29,
              "unit": "drops"
            },
            {
              "label": "Paper left on each roll",
              "value": 0.25000000000000133,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 7
        },
        {
          "name": "Drops: a 12 x 12 ft room, 8 ft walls, York double roll 20.5 in x 33 ft, 20.9 in straight repeat, 4 in trim",
          "inputs": {
            "roomLength": 3.6576,
            "roomWidth": 3.6576,
            "wallHeight": 2.4384,
            "rollType": "drops",
            "patternRepeat": "small",
            "rollLength": 10.0584,
            "rollWidth": 0.5207,
            "matchType": "straight",
            "repeatLength": 0.53086,
            "trimAllowance": 0.1016
          },
          "expected": 10,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Wall area",
              "value": 35.674767360000004,
              "unit": "m²"
            },
            {
              "label": "Wall run round the room",
              "value": 14.6304,
              "unit": "m"
            },
            {
              "label": "Length cut for each drop",
              "value": 2.6543,
              "unit": "m"
            },
            {
              "label": "Drops one roll gives",
              "value": 3,
              "unit": "drops"
            },
            {
              "label": "Drops needed round the room",
              "value": 29,
              "unit": "drops"
            },
            {
              "label": "Paper left on each roll",
              "value": 2.2098000000000004,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 4
        },
        {
          "name": "Drops: the same room in York's 27 in x 27 ft roll with a 25.25 in half-drop match",
          "inputs": {
            "roomLength": 3.6576,
            "roomWidth": 3.6576,
            "wallHeight": 2.4384,
            "rollType": "drops",
            "patternRepeat": "small",
            "rollLength": 8.2296,
            "rollWidth": 0.6858,
            "matchType": "half-drop",
            "repeatLength": 0.64135,
            "trimAllowance": 0.1016
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Wall area",
              "value": 35.674767360000004,
              "unit": "m²"
            },
            {
              "label": "Wall run round the room",
              "value": 14.6304,
              "unit": "m"
            },
            {
              "label": "Length cut for each drop",
              "value": 2.5654,
              "unit": "m"
            },
            {
              "label": "Drops one roll gives",
              "value": 3,
              "unit": "drops"
            },
            {
              "label": "Drops needed round the room",
              "value": 22,
              "unit": "drops"
            },
            {
              "label": "Paper left on each roll",
              "value": 0.5587999999999997,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 4
        }
      ]
    },
    {
      "slug": "wallpaper-paste-calculator",
      "title": "Wallpaper Paste Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/wallpaper-paste-calculator/",
      "sources": [
        "Paste powder is sold in sachets rated by the number of rolls they hang, so the count is the roll total divided by that rating, rounded up",
        "A sachet is made up to a stated volume of water — commonly 4.5 litres for a five to six roll sachet — and that volume, not the powder, is what fills the bucket",
        "Heavy, embossed and vinyl papers are hung with a stronger mix and fewer rolls per sachet than light printed papers; the packet's own rating already carries the difference"
      ],
      "vectors": [
        {
          "name": "10 rolls at 5 rolls a sachet is two sachets",
          "inputs": {
            "rolls": 10,
            "rollsPerSachet": 5,
            "litresPerSachet": 4.5,
            "pasteTheWall": "paper"
          },
          "expected": 2,
          "toleranceDecimalPlaces": 0,
          "unit": "sachets",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rolls covered",
              "value": 10,
              "unit": "rolls"
            },
            {
              "label": "Mixed paste",
              "value": 2.377548471223336,
              "unit": "gal"
            },
            {
              "label": "Water per sachet",
              "value": 1.188774235611668,
              "unit": "gal"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "11 rolls needs a third — the rounding is the whole point",
          "inputs": {
            "rolls": 11,
            "rollsPerSachet": 5,
            "litresPerSachet": 4.5,
            "pasteTheWall": "paper"
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "sachets",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rolls covered",
              "value": 15,
              "unit": "rolls"
            },
            {
              "label": "Mixed paste",
              "value": 3.566322706835004,
              "unit": "gal"
            },
            {
              "label": "Water per sachet",
              "value": 1.188774235611668,
              "unit": "gal"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A heavy paper rated 3 rolls a sachet takes twice as many",
          "inputs": {
            "rolls": 10,
            "rollsPerSachet": 3,
            "litresPerSachet": 3,
            "pasteTheWall": "wall"
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "sachets",
          "confidence": "medium",
          "steps": [
            {
              "label": "Rolls covered",
              "value": 12,
              "unit": "rolls"
            },
            {
              "label": "Mixed paste",
              "value": 3.170064628297781,
              "unit": "gal"
            },
            {
              "label": "Water per sachet",
              "value": 0.7925161570744452,
              "unit": "gal"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        }
      ]
    },
    {
      "slug": "water-cement-ratio-strength-calculator",
      "title": "Water-Cement Ratio and Concrete Strength Calculator (Abrams' Law)",
      "url": "https://craftquantities.com/calculators/materials-quantities/water-cement-ratio-strength-calculator/",
      "sources": [
        "Abrams, D.A. (1918), Design of Concrete Mixtures, Structural Materials Research Laboratory Bulletin 1. Strength against water-cement ratio as fc = A / B^(w/c), for fully compacted concrete",
        "A and B are calibration constants for a particular set of materials, a particular age and a particular curing regime, not universal values. The defaults here are commonly published 28-day figures and track the water-cement ratios ACI 211.1 tabulates against strength to within a few per cent across the usual band — which is a sanity check on the defaults, not a substitute for calibrating them",
        "The relation holds only where the concrete is FULLY COMPACTED. Below roughly a 0.30 ratio a mix cannot be consolidated by ordinary means and real strength falls away instead of continuing to rise, and very wet mixes segregate, so the curve is meaningful only across the placeable band",
        "No calculation certifies a strength. Compressive strength is established by testing specimens under ASTM C39 or EN 12390-3 from the concrete actually placed, and a predicted figure has no standing against a test result"
      ],
      "vectors": [
        {
          "name": "a 0.50 ratio on the default 28-day constants",
          "inputs": {
            "waterCementRatio": 0.5,
            "targetStrength": 30000000,
            "constantA": 96500000,
            "constantB": 8.2
          },
          "expected": 4887.67,
          "toleranceDecimalPlaces": 0,
          "unit": "psi",
          "confidence": "medium",
          "steps": [
            {
              "label": "Ratio needed for the target strength",
              "value": 0.5552619467307734
            },
            {
              "label": "Margin over the target",
              "value": 536.532558520623,
              "unit": "psi"
            },
            {
              "label": "Strength if the ratio rises by 0.05",
              "value": 4399.57485891188,
              "unit": "psi"
            },
            {
              "label": "Strength given up by that water",
              "value": 488.08983151524785,
              "unit": "psi"
            },
            {
              "label": "Proportion of strength given up",
              "value": 9.986156220397236,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "a 0.40 ratio is markedly stronger",
          "inputs": {
            "waterCementRatio": 0.4,
            "targetStrength": 30000000,
            "constantA": 96500000,
            "constantB": 8.2
          },
          "expected": 6032.3,
          "toleranceDecimalPlaces": 0,
          "unit": "psi",
          "confidence": "medium",
          "steps": [
            {
              "label": "Ratio needed for the target strength",
              "value": 0.5552619467307734
            },
            {
              "label": "Margin over the target",
              "value": 1681.1658907356773,
              "unit": "psi"
            },
            {
              "label": "Strength if the ratio rises by 0.05",
              "value": 5429.9033184212,
              "unit": "psi"
            },
            {
              "label": "Strength given up by that water",
              "value": 602.3947042209812,
              "unit": "psi"
            },
            {
              "label": "Proportion of strength given up",
              "value": 9.986156220397227,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "a 0.70 ratio falls well below a 30 MPa target",
          "inputs": {
            "waterCementRatio": 0.7,
            "targetStrength": 30000000,
            "constantA": 96500000,
            "constantB": 8.2
          },
          "expected": 3208.77,
          "toleranceDecimalPlaces": 0,
          "unit": "psi",
          "confidence": "medium",
          "steps": [
            {
              "label": "Ratio needed for the target strength",
              "value": 0.5552619467307734
            },
            {
              "label": "Margin over the target",
              "value": -1142.361798193559,
              "unit": "psi"
            },
            {
              "label": "Strength if the ratio rises by 0.05",
              "value": 2888.337515434609,
              "unit": "psi"
            },
            {
              "label": "Strength given up by that water",
              "value": 320.4328182783366,
              "unit": "psi"
            },
            {
              "label": "Proportion of strength given up",
              "value": 9.986156220397241,
              "unit": "%"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "water-feature-pump-flow-calculator",
      "title": "Decorative Water Feature Pump Flow & Turnover Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/water-feature-pump-flow-calculator/",
      "sources": [
        "Required pump flow rate = Basin Volume ÷ Target Turnover Time — the standard method for sizing a recirculating pump for a fountain, pond, or decorative water feature, analogous to pool/spa turnover-rate sizing."
      ],
      "vectors": [
        {
          "name": "5,000L basin, 2hr turnover",
          "inputs": {
            "basinVolume": 5000,
            "turnoverTime": 2
          },
          "expected": 41.67,
          "toleranceDecimalPlaces": 1,
          "unit": "L/min",
          "confidence": "medium",
          "steps": [
            {
              "label": "Flow rate",
              "value": 2500,
              "unit": "L/hr"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "8,000L basin, 1.5hr turnover",
          "inputs": {
            "basinVolume": 8000,
            "turnoverTime": 1.5
          },
          "expected": 88.89,
          "toleranceDecimalPlaces": 1,
          "unit": "L/min",
          "confidence": "medium",
          "steps": [
            {
              "label": "Flow rate",
              "value": 5333.333333333333,
              "unit": "L/hr"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "water-hammer-surge-calculator",
      "title": "Closed-Loop Hydronic Water Hammer Surge Pressure Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/water-hammer-surge-calculator/",
      "sources": [
        "Joukowsky equation: ΔP = ρ × a × Δv, where ρ is fluid density, a is the pressure wave propagation speed in the pipe, and Δv is the sudden change in flow velocity — the standard method for estimating instantaneous water hammer surge pressure from rapid valve closure"
      ],
      "vectors": [
        {
          "name": "Water, rigid pipe, 1.5 m/s velocity change",
          "inputs": {
            "fluidDensity": 1000,
            "waveSpeed": 1200,
            "velocityChange": 1.5
          },
          "expected": 1800,
          "toleranceDecimalPlaces": 0,
          "unit": "kPa",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Water, 1000 m/s wave speed, 2.0 m/s velocity change",
          "inputs": {
            "fluidDensity": 1000,
            "waveSpeed": 1000,
            "velocityChange": 2
          },
          "expected": 2000,
          "toleranceDecimalPlaces": 0,
          "unit": "kPa",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "water-heater-recovery-time-calculator",
      "title": "Water Heater Recovery Time Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/water-heater-recovery-time-calculator/",
      "sources": [
        "Standard recovery formula: recovery rate = (power input × recovery efficiency) ÷ (8.33 BTU/gal·°F × temperature rise); recovery time = tank capacity ÷ recovery rate. Efficiency is 0.75 for a gas storage heater, near 1.0 for an immersion element or an indirect coil. Metric inputs convert at the formula's boundary."
      ],
      "vectors": [
        {
          "name": "180 L cylinder, 3 kW immersion, efficiency 1.0",
          "inputs": {
            "tankVolume": 180,
            "incomingTemp": 10,
            "targetTemp": 60,
            "heaterPower": 3000,
            "recoveryEfficiency": 1
          },
          "expected": 209,
          "toleranceDecimalPlaces": -1,
          "unit": "minutes",
          "confidence": "medium",
          "steps": [
            {
              "label": "Recovery rate",
              "value": 0.8614353172415375,
              "unit": "L/min"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "the same cylinder on a gas heater still takes the longer time",
          "inputs": {
            "tankVolume": 180,
            "incomingTemp": 10,
            "targetTemp": 60,
            "heaterPower": 3000,
            "recoveryEfficiency": 0.75
          },
          "expected": 279,
          "toleranceDecimalPlaces": -1,
          "unit": "minutes",
          "confidence": "medium",
          "steps": [
            {
              "label": "Recovery rate",
              "value": 0.646076487931153,
              "unit": "L/min"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "189 L (50 gal) tank, 10°C→48.9°C, 11,723 W (40,000 BTU/hr)",
          "inputs": {
            "tankVolume": 189.2705892,
            "incomingTemp": 10,
            "targetTemp": 48.88888889,
            "heaterPower": 11722.6407
          },
          "expected": 58.31,
          "toleranceDecimalPlaces": 1,
          "unit": "minutes",
          "confidence": "medium",
          "steps": [
            {
              "label": "Recovery rate",
              "value": 3.2458810853650304,
              "unit": "L/min"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "151 L (40 gal) tank, 4.4°C→54.4°C, 10,550 W (36,000 BTU/hr)",
          "inputs": {
            "tankVolume": 151.41647136,
            "incomingTemp": 4.444444444,
            "targetTemp": 54.44444444,
            "heaterPower": 10550.37663
          },
          "expected": 66.64,
          "toleranceDecimalPlaces": 1,
          "unit": "minutes",
          "confidence": "medium",
          "steps": [
            {
              "label": "Recovery rate",
              "value": 2.272116760002208,
              "unit": "L/min"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "water-heater-sizing-calculator",
      "title": "Water Heater Sizing Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/water-heater-sizing-calculator/",
      "sources": [
        "Rule-of-thumb ranges: 1-2 people need 30-40 gallons, 3-4 people 50-65 gallons, 5+ people 65-80 gallons"
      ],
      "vectors": [
        {
          "name": "1-2 people",
          "inputs": {
            "householdSize": "1-2"
          },
          "expected": 35,
          "toleranceDecimalPlaces": 0,
          "unit": "gallons (recommended)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Recommended range, low",
              "value": 30,
              "unit": "gal"
            },
            {
              "label": "Recommended range, high",
              "value": 40,
              "unit": "gal"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "5+ people",
          "inputs": {
            "householdSize": "5plus"
          },
          "expected": 72.5,
          "toleranceDecimalPlaces": 1,
          "unit": "gallons (recommended)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Recommended range, low",
              "value": 65,
              "unit": "gal"
            },
            {
              "label": "Recommended range, high",
              "value": 80,
              "unit": "gal"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "water-leak-cost-calculator",
      "title": "Water Leak Cost Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/water-leak-cost-calculator/",
      "sources": [
        "Annual volume wasted = leak rate × minutes per year; annual cost = volume wasted × your utility's volumetric water rate"
      ],
      "vectors": [
        {
          "name": "Running toilet (0.125 L/min ≈ 0.033 gal/min), 1.32/m³ ≈ $5/1,000 gal",
          "inputs": {
            "leakRateLpm": 0.125,
            "ratePerM3": 1.32
          },
          "expected": 86.72,
          "toleranceDecimalPlaces": 2,
          "unit": "currency per year",
          "confidence": "medium",
          "steps": [
            {
              "label": "Water wasted per year",
              "value": 65700,
              "unit": "L"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Larger leak (0.379 L/min ≈ 0.1 gal/min), 2.11/m³ ≈ $8/1,000 gal",
          "inputs": {
            "leakRateLpm": 0.379,
            "ratePerM3": 2.11
          },
          "expected": 420.32,
          "toleranceDecimalPlaces": 2,
          "unit": "currency per year",
          "confidence": "medium",
          "steps": [
            {
              "label": "Water wasted per year",
              "value": 199202.4,
              "unit": "L"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "water-meter-sizing-calculator",
      "title": "Water Meter Sizing Calculator (Fixture Units)",
      "url": "https://craftquantities.com/calculators/materials-quantities/water-meter-sizing-calculator/",
      "sources": [
        "Simplified Hunter's curve approximation: peak demand (gpm) ≈ demand factor × √(total water supply fixture units, WSFU) — probability-based fixture unit methods (per IPC/UPC Appendix tables) estimate peak simultaneous demand from a building's total fixture count, since not all fixtures operate at once"
      ],
      "vectors": [
        {
          "name": "50 WSFU, demand factor 3.2",
          "inputs": {
            "totalFixtureUnits": 50,
            "demandFactor": 3.2
          },
          "expected": 22.63,
          "toleranceDecimalPlaces": 1,
          "unit": "GPM",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "80 WSFU, demand factor 3.2",
          "inputs": {
            "totalFixtureUnits": 80,
            "demandFactor": 3.2
          },
          "expected": 28.62,
          "toleranceDecimalPlaces": 1,
          "unit": "GPM",
          "confidence": "medium",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "water-softener-sizing-calculator",
      "title": "Water Softener Sizing Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/water-softener-sizing-calculator/",
      "sources": [
        "Standard sizing formula: daily softening demand (grains) = people x 75 gallons/person/day x water hardness (grains per gallon); required capacity = daily demand x days between regenerations",
        "Common residential softener grain capacities: 24,000 / 32,000 / 48,000 / 64,000 / 80,000 grains"
      ],
      "vectors": [
        {
          "name": "3 people, 10 GPG, weekly regen",
          "inputs": {
            "householdSize": 3,
            "waterHardnessGpg": 10,
            "regenerationDays": "7"
          },
          "expected": 24000,
          "toleranceDecimalPlaces": 0,
          "unit": "grains capacity",
          "confidence": "medium",
          "steps": [
            {
              "label": "Daily softening demand",
              "value": 2250,
              "unit": "grains/day"
            },
            {
              "label": "Capacity needed before rounding",
              "value": 15750,
              "unit": "grains"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "4 people, 15 GPG, weekly regen",
          "inputs": {
            "householdSize": 4,
            "waterHardnessGpg": 15,
            "regenerationDays": "7"
          },
          "expected": 32000,
          "toleranceDecimalPlaces": 0,
          "unit": "grains capacity",
          "confidence": "medium",
          "steps": [
            {
              "label": "Daily softening demand",
              "value": 4500,
              "unit": "grains/day"
            },
            {
              "label": "Capacity needed before rounding",
              "value": 31500,
              "unit": "grains"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "waterproofing-membrane-roll-calculator",
      "title": "Below-Grade Waterproofing Membrane Roll Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/waterproofing-membrane-roll-calculator/",
      "sources": [
        "Roll count = ceil(wall area ÷ roll coverage area), the standard method for estimating rolled sheet membrane material"
      ],
      "vectors": [
        {
          "name": "80 m² wall, 9.3 m² roll",
          "inputs": {
            "wallArea": 80,
            "rollCoverageArea": 9.3
          },
          "expected": 9,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "120 m² wall, 9.3 m² roll",
          "inputs": {
            "wallArea": 120,
            "rollCoverageArea": 9.3
          },
          "expected": 13,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "waterproofing-protection-board-calculator",
      "title": "Foundation Waterproofing Protection Board Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/waterproofing-protection-board-calculator/",
      "sources": [
        "Sheet count = ceil(wall area ÷ sheet area), the standard coverage method for protection board installed over waterproofing membrane before backfilling"
      ],
      "vectors": [
        {
          "name": "50 m² wall, 2.88 m² sheet",
          "inputs": {
            "wallArea": 50,
            "sheetArea": 2.88
          },
          "expected": 18,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "70 m² wall, 2.88 m² sheet",
          "inputs": {
            "wallArea": 70,
            "sheetArea": 2.88
          },
          "expected": 25,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "waterstop-linear-footage-calculator",
      "title": "Waterstop Linear Footage Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/waterstop-linear-footage-calculator/",
      "sources": [
        "Waterstop is installed continuously along the full length of every construction or expansion joint requiring a water seal"
      ],
      "vectors": [
        {
          "name": "50m total joint length, 10% waste",
          "inputs": {
            "totalJointLength": 50,
            "wasteFactorPercent": 10
          },
          "expected": 180.45,
          "toleranceDecimalPlaces": -1,
          "unit": "linear ft",
          "confidence": "medium",
          "steps": [
            {
              "label": "Base joint length (no waste)",
              "value": 164.04199475065616,
              "unit": "ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "80m total joint length, 5% waste",
          "inputs": {
            "totalJointLength": 80,
            "wasteFactorPercent": 5
          },
          "expected": 275.6,
          "toleranceDecimalPlaces": -1,
          "unit": "linear ft",
          "confidence": "medium",
          "steps": [
            {
              "label": "Base joint length (no waste)",
              "value": 262.4671916010499,
              "unit": "ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "watts-amps-kva-calculator",
      "title": "Watts, Amps and kVA Calculator (Any Voltage, AC or DC)",
      "url": "https://craftquantities.com/calculators/electrical/watts-amps-kva-calculator/",
      "sources": [
        "Definitions of real, apparent and reactive power: DC P = V × I; single-phase S = V × I and P = V × I × PF; three-phase S = √3 × V(line-to-line) × I and P = √3 × V × I × PF for a balanced load; Q = S × √(1 − PF²)",
        "Balanced three-phase systems: the line-to-line voltage is √3 times the line-to-neutral voltage (phases 120° apart), so three loads at V/√3 each draw √3 × V × I in total",
        "WEG Rolled Steel General Purpose 1-phase Motors, performance data (AutomationDirect catalogue page tMTR-54): the four-pole motors from 1/4 to 1 hp at full-load power factors of 0.59 to 0.68; the 1 hp motors listed at 6.8 A (1,745 rpm, 71.0%, 0.68) and 5.06 A (3,500 rpm, 70.0%, 0.92) on 230 V",
        "WEG W22 Single-Phase Electric Motor, Commercial Catalogue, European Market (Cod. 50069268, Rev. 00, 01/2017), page 5: motors with start and run capacitors, 0.18 to 9.2 kW, at full-load power factors of 0.75 to 0.99"
      ],
      "vectors": [
        {
          "name": "the opening: 7,200 W on a 240 V single-phase circuit draws 30 A",
          "inputs": {
            "supply": "ac",
            "phase": "single",
            "voltage": "240",
            "known": "watts",
            "watts": 7200,
            "powerFactor": 1
          },
          "expected": 30,
          "toleranceDecimalPlaces": 6,
          "unit": "A",
          "confidence": "high",
          "steps": [
            {
              "label": "Apparent power",
              "value": 7.2,
              "unit": "kVA"
            },
            {
              "label": "Reactive power",
              "value": 0,
              "unit": "kvar"
            },
            {
              "label": "Voltage used",
              "value": 240,
              "unit": "V"
            },
            {
              "label": "Power factor used",
              "value": 1
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "the same 7,200 W at 230 V draws 31.30 A",
          "inputs": {
            "supply": "ac",
            "phase": "single",
            "voltage": "230",
            "known": "watts",
            "watts": 7200,
            "powerFactor": 1
          },
          "expected": 31.304348,
          "toleranceDecimalPlaces": 5,
          "unit": "A",
          "confidence": "high",
          "steps": [
            {
              "label": "Apparent power",
              "value": 7.2,
              "unit": "kVA"
            },
            {
              "label": "Reactive power",
              "value": 0,
              "unit": "kvar"
            },
            {
              "label": "Voltage used",
              "value": 230,
              "unit": "V"
            },
            {
              "label": "Power factor used",
              "value": 1
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "the EV worked example: 48 A at 240 V is 11,520 W",
          "inputs": {
            "supply": "ac",
            "phase": "single",
            "voltage": "240",
            "known": "amps",
            "amps": 48,
            "powerFactor": 1
          },
          "expected": 11520,
          "toleranceDecimalPlaces": 6,
          "unit": "W",
          "confidence": "high",
          "steps": [
            {
              "label": "Apparent power",
              "value": 11.52,
              "unit": "kVA"
            },
            {
              "label": "Reactive power",
              "value": 0,
              "unit": "kvar"
            },
            {
              "label": "Voltage used",
              "value": 240,
              "unit": "V"
            },
            {
              "label": "Power factor used",
              "value": 1
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "10 kVA at 400 V single phase is 25 A",
          "inputs": {
            "supply": "ac",
            "phase": "single",
            "voltage": "400",
            "known": "kva",
            "kva": 10,
            "powerFactor": 0.8
          },
          "expected": 25,
          "toleranceDecimalPlaces": 6,
          "unit": "A",
          "confidence": "high",
          "steps": [
            {
              "label": "Real power",
              "value": 8,
              "unit": "kW"
            },
            {
              "label": "Reactive power",
              "value": 5.999999999999999,
              "unit": "kvar"
            },
            {
              "label": "Voltage used",
              "value": 400,
              "unit": "V"
            },
            {
              "label": "Power factor used",
              "value": 0.8
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "the same 10 kVA at 400 V three phase is 14.43 A in each line",
          "inputs": {
            "supply": "ac",
            "phase": "three",
            "voltage": "400",
            "known": "kva",
            "kva": 10,
            "powerFactor": 0.8
          },
          "expected": 14.433757,
          "toleranceDecimalPlaces": 5,
          "unit": "A",
          "confidence": "high",
          "steps": [
            {
              "label": "Real power",
              "value": 8,
              "unit": "kW"
            },
            {
              "label": "Reactive power",
              "value": 5.999999999999999,
              "unit": "kvar"
            },
            {
              "label": "Voltage used",
              "value": 400,
              "unit": "V"
            },
            {
              "label": "Line-to-neutral voltage, V ÷ √3",
              "value": 230.94010767585033,
              "unit": "V"
            },
            {
              "label": "Power factor used",
              "value": 0.8
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "a power factor of 0.8 raises 7,200 W at 240 V to 37.5 A",
          "inputs": {
            "supply": "ac",
            "phase": "single",
            "voltage": "240",
            "known": "watts",
            "watts": 7200,
            "powerFactor": 0.8
          },
          "expected": 37.5,
          "toleranceDecimalPlaces": 6,
          "unit": "A",
          "confidence": "high",
          "steps": [
            {
              "label": "Apparent power",
              "value": 9,
              "unit": "kVA"
            },
            {
              "label": "Reactive power",
              "value": 5.3999999999999995,
              "unit": "kvar"
            },
            {
              "label": "Voltage used",
              "value": 240,
              "unit": "V"
            },
            {
              "label": "Power factor used",
              "value": 0.8
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a typed 220 V: 2,200 W draws 10 A",
          "inputs": {
            "supply": "ac",
            "phase": "single",
            "voltage": "other",
            "customVoltage": 220,
            "known": "watts",
            "watts": 2200,
            "powerFactor": 1
          },
          "expected": 10,
          "toleranceDecimalPlaces": 6,
          "unit": "A",
          "confidence": "high",
          "steps": [
            {
              "label": "Apparent power",
              "value": 2.2,
              "unit": "kVA"
            },
            {
              "label": "Reactive power",
              "value": 0,
              "unit": "kvar"
            },
            {
              "label": "Voltage used",
              "value": 220,
              "unit": "V"
            },
            {
              "label": "Power factor used",
              "value": 1
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "DC: 1,200 W from a 48 V bank draws 25 A, whatever the power factor box says",
          "inputs": {
            "supply": "dc",
            "phase": "three",
            "voltage": "48",
            "known": "watts",
            "watts": 1200,
            "powerFactor": 0.5
          },
          "expected": 25,
          "toleranceDecimalPlaces": 6,
          "unit": "A",
          "confidence": "high",
          "steps": [
            {
              "label": "Apparent power",
              "value": 1.2,
              "unit": "kVA"
            },
            {
              "label": "Voltage used",
              "value": 48,
              "unit": "V"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "480 V three phase, 100 A at 0.85: 70,668 W",
          "inputs": {
            "supply": "ac",
            "phase": "three",
            "voltage": "480",
            "known": "amps",
            "amps": 100,
            "powerFactor": 0.85
          },
          "expected": 70667.67,
          "toleranceDecimalPlaces": 1,
          "unit": "W",
          "confidence": "high",
          "steps": [
            {
              "label": "Apparent power",
              "value": 83.1384387633061,
              "unit": "kVA"
            },
            {
              "label": "Reactive power",
              "value": 43.795890218147186,
              "unit": "kvar"
            },
            {
              "label": "Voltage used",
              "value": 480,
              "unit": "V"
            },
            {
              "label": "Line-to-neutral voltage, V ÷ √3",
              "value": 277.1281292110204,
              "unit": "V"
            },
            {
              "label": "Power factor used",
              "value": 0.85
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "agrees with the fixed 120 V page: 1,500 W is 12.5 A",
          "inputs": {
            "supply": "ac",
            "phase": "single",
            "voltage": "120",
            "known": "watts",
            "watts": 1500,
            "powerFactor": 1
          },
          "expected": 12.5,
          "toleranceDecimalPlaces": 6,
          "unit": "A",
          "confidence": "high",
          "steps": [
            {
              "label": "Apparent power",
              "value": 1.5,
              "unit": "kVA"
            },
            {
              "label": "Reactive power",
              "value": 0,
              "unit": "kvar"
            },
            {
              "label": "Voltage used",
              "value": 120,
              "unit": "V"
            },
            {
              "label": "Power factor used",
              "value": 1
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "12 V DC: a 60 W lamp draws 5 A",
          "inputs": {
            "supply": "dc",
            "phase": "single",
            "voltage": "12",
            "known": "watts",
            "watts": 60,
            "powerFactor": 1
          },
          "expected": 5,
          "toleranceDecimalPlaces": 6,
          "unit": "A",
          "confidence": "high",
          "steps": [
            {
              "label": "Apparent power",
              "value": 0.06,
              "unit": "kVA"
            },
            {
              "label": "Voltage used",
              "value": 12,
              "unit": "V"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "24 V DC: 240 W draws 10 A",
          "inputs": {
            "supply": "dc",
            "phase": "single",
            "voltage": "24",
            "known": "watts",
            "watts": 240,
            "powerFactor": 1
          },
          "expected": 10,
          "toleranceDecimalPlaces": 6,
          "unit": "A",
          "confidence": "high",
          "steps": [
            {
              "label": "Apparent power",
              "value": 0.24,
              "unit": "kVA"
            },
            {
              "label": "Voltage used",
              "value": 24,
              "unit": "V"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "208 V three phase: 10 kVA is 27.76 A in each line",
          "inputs": {
            "supply": "ac",
            "phase": "three",
            "voltage": "208",
            "known": "kva",
            "kva": 10,
            "powerFactor": 0.9
          },
          "expected": 27.757224,
          "toleranceDecimalPlaces": 5,
          "unit": "A",
          "confidence": "high",
          "steps": [
            {
              "label": "Real power",
              "value": 9,
              "unit": "kW"
            },
            {
              "label": "Reactive power",
              "value": 4.358898943540673,
              "unit": "kvar"
            },
            {
              "label": "Voltage used",
              "value": 208,
              "unit": "V"
            },
            {
              "label": "Line-to-neutral voltage, V ÷ √3",
              "value": 120.08885599144216,
              "unit": "V"
            },
            {
              "label": "Power factor used",
              "value": 0.9
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "277 V lighting: 2,770 W at a power factor of 1 is 10 A",
          "inputs": {
            "supply": "ac",
            "phase": "single",
            "voltage": "277",
            "known": "watts",
            "watts": 2770,
            "powerFactor": 1
          },
          "expected": 10,
          "toleranceDecimalPlaces": 6,
          "unit": "A",
          "confidence": "high",
          "steps": [
            {
              "label": "Apparent power",
              "value": 2.77,
              "unit": "kVA"
            },
            {
              "label": "Reactive power",
              "value": 0,
              "unit": "kvar"
            },
            {
              "label": "Voltage used",
              "value": 277,
              "unit": "V"
            },
            {
              "label": "Power factor used",
              "value": 1
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "415 V three phase: 100 A at 0.8 is 57,504 W",
          "inputs": {
            "supply": "ac",
            "phase": "three",
            "voltage": "415",
            "known": "amps",
            "amps": 100,
            "powerFactor": 0.8
          },
          "expected": 57504.087,
          "toleranceDecimalPlaces": 2,
          "unit": "W",
          "confidence": "high",
          "steps": [
            {
              "label": "Apparent power",
              "value": 71.8801085141084,
              "unit": "kVA"
            },
            {
              "label": "Reactive power",
              "value": 43.12806510846503,
              "unit": "kvar"
            },
            {
              "label": "Voltage used",
              "value": 415,
              "unit": "V"
            },
            {
              "label": "Line-to-neutral voltage, V ÷ √3",
              "value": 239.6003617136947,
              "unit": "V"
            },
            {
              "label": "Power factor used",
              "value": 0.8
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "watts-to-amps-120v-calculator",
      "title": "Watts to Amps Calculator (120 V)",
      "url": "https://craftquantities.com/calculators/electrical/watts-to-amps-120v-calculator/",
      "sources": [
        "Rearranged Ohm's law: I = P / V",
        "NEC 210.20(A) sizes the overcurrent device at 125% of a continuous load, and 210.19(A)(1) does the same for the conductor — which is the same rule read the other way round, as the familiar 80% ceiling on the breaker rating"
      ],
      "vectors": [
        {
          "name": "1500 W converts correctly",
          "inputs": {
            "watts": 1500
          },
          "expected": 12.5,
          "toleranceDecimalPlaces": 6,
          "unit": "A",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.008333333333333333,
              "unit": "A per W"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "watts": 15000
          },
          "expected": 125,
          "toleranceDecimalPlaces": 6,
          "unit": "A",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.008333333333333333,
              "unit": "A per W"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "watts-to-amps-230v-calculator",
      "title": "Watts to Amps Calculator (230 V)",
      "url": "https://craftquantities.com/calculators/electrical/watts-to-amps-230v-calculator/",
      "sources": [
        "I = P / V, rearranged from P = V x I",
        "UK plug fuses are manufactured in 3 A, 5 A and 13 A ratings (BS 1362)"
      ],
      "vectors": [
        {
          "name": "3000 W converts correctly",
          "inputs": {
            "watts": 3000
          },
          "expected": 13.043478260869565,
          "toleranceDecimalPlaces": 6,
          "unit": "A",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.004347826086956522,
              "unit": "A per W"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "watts": 30000
          },
          "expected": 130.43478260869566,
          "toleranceDecimalPlaces": 6,
          "unit": "A",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.004347826086956522,
              "unit": "A per W"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "watts-to-btu-calculator",
      "title": "Watts to BTU/hr Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/watts-to-btu-calculator/",
      "sources": [
        "1 W = 3.412141633 BTU/h, from the definition 1 BTU/h = 0.29307107017222 W",
        "Sensible heat gain from equipment: for cooling load purposes, electrical input inside the conditioned space is treated as heat gain"
      ],
      "vectors": [
        {
          "name": "1500 W converts correctly",
          "inputs": {
            "watts": 1500
          },
          "expected": 5118.212449691952,
          "toleranceDecimalPlaces": 6,
          "unit": "BTU/hr",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 3.412141633127968,
              "unit": "BTU/hr per W"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "watts": 15000
          },
          "expected": 51182.12449691952,
          "toleranceDecimalPlaces": 6,
          "unit": "BTU/hr",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 3.412141633127968,
              "unit": "BTU/hr per W"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "weatherstripping-calculator",
      "title": "Weatherstripping Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/weatherstripping-calculator/",
      "sources": [
        "Weatherstripping seals the full perimeter of an opening (all four sides, since air sealing includes the threshold): length = 2 x (height + width) per opening. Self-adhesive foam and V-strip is stocked in 10 ft and 17 ft rolls in North America and in 5 m and 10 m rolls in metric markets, so the roll count follows the market being read"
      ],
      "vectors": [
        {
          "name": "1 door, 80x34 in, 10ft rolls",
          "inputs": {
            "openingHeight": 2.032,
            "openingWidth": 0.864,
            "openingCount": 1,
            "rollLengthFt": "10"
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "x 10 ft rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Weatherstripping needed (with waste)",
              "value": 20.902887139107612,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "3 windows, 1.2x0.9m, 17ft rolls",
          "inputs": {
            "openingHeight": 1.2,
            "openingWidth": 0.9,
            "openingCount": 3,
            "rollLengthFt": "17"
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "x 17 ft rolls",
          "confidence": "high",
          "steps": [
            {
              "label": "Weatherstripping needed (with waste)",
              "value": 45.472440944881896,
              "unit": "linear ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "weekly-noise-exposure-calculator",
      "title": "Weekly Noise Exposure (LEP,w) Calculator",
      "url": "https://craftquantities.com/calculators/sustainability-compliance/weekly-noise-exposure-calculator/",
      "sources": [
        "Control of Noise at Work Regulations 2005, Schedule 1, Part 2: LEP,w = 10 log10[(1/5) × Σ 10^(0.1 × (LEP,d)k)], summed over the working days k of the week — divided by five whatever the number of days worked",
        "Control of Noise at Work Regulations 2005, regulation 4(6): where exposure varies markedly from day to day, weekly personal noise exposure may be used in place of daily; Directive 2003/10/EC, Article 3(3), allows the same on condition that the weekly level shown by monitoring does not exceed the 87 dB(A) exposure limit value and that the risk from the noisy work is reduced to a minimum"
      ],
      "vectors": [
        {
          "name": "Five days at 85 dB(A) average to exactly 85",
          "inputs": {
            "day1": 85,
            "day2": 85,
            "day3": 85,
            "day4": 85,
            "day5": 85,
            "day6": 0,
            "day7": 0
          },
          "expected": 85,
          "toleranceDecimalPlaces": 2,
          "unit": "dB(A)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Days worked",
              "value": 5,
              "unit": "days"
            },
            {
              "label": "Loudest day, Monday",
              "value": 85,
              "unit": "dB(A)"
            },
            {
              "label": "The loudest day's share of the week's noise energy",
              "value": 20,
              "unit": "%"
            },
            {
              "label": "Loudest day minus the weekly figure",
              "value": 0,
              "unit": "dB"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "One day at 90 and four at 80 average to 84.5 — the loud day is most of the week",
          "inputs": {
            "day1": 90,
            "day2": 80,
            "day3": 80,
            "day4": 80,
            "day5": 80,
            "day6": 0,
            "day7": 0
          },
          "expected": 84.47158,
          "toleranceDecimalPlaces": 2,
          "unit": "dB(A)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Days worked",
              "value": 5,
              "unit": "days"
            },
            {
              "label": "Loudest day, Monday",
              "value": 90,
              "unit": "dB(A)"
            },
            {
              "label": "The loudest day's share of the week's noise energy",
              "value": 71.42857142857143,
              "unit": "%"
            },
            {
              "label": "Loudest day minus the weekly figure",
              "value": 5.528419686577806,
              "unit": "dB"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A sixth day at 85 raises the week to 85.8, because the divisor stays at five",
          "inputs": {
            "day1": 85,
            "day2": 85,
            "day3": 85,
            "day4": 85,
            "day5": 85,
            "day6": 85,
            "day7": 0
          },
          "expected": 85.791812,
          "toleranceDecimalPlaces": 2,
          "unit": "dB(A)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Days worked",
              "value": 6,
              "unit": "days"
            },
            {
              "label": "Loudest day, Monday",
              "value": 85,
              "unit": "dB(A)"
            },
            {
              "label": "The loudest day's share of the week's noise energy",
              "value": 16.666666666666664,
              "unit": "%"
            },
            {
              "label": "Loudest day minus the weekly figure",
              "value": -0.7918124604762511,
              "unit": "dB"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The defaults — a Monday at 92 and four days at 80 — come to 86.0 over the week",
          "inputs": {
            "day1": 92,
            "day2": 80,
            "day3": 80,
            "day4": 80,
            "day5": 80,
            "day6": 0,
            "day7": 0
          },
          "expected": 85.987671,
          "toleranceDecimalPlaces": 2,
          "unit": "dB(A)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Days worked",
              "value": 5,
              "unit": "days"
            },
            {
              "label": "Loudest day, Monday",
              "value": 92,
              "unit": "dB(A)"
            },
            {
              "label": "The loudest day's share of the week's noise energy",
              "value": 79.84778216181842,
              "unit": "%"
            },
            {
              "label": "Loudest day minus the weekly figure",
              "value": 6.012328620896625,
              "unit": "dB"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "weeping-tile-segment-calculator",
      "title": "Perimeter Weeping Tile Pipe Segment Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/weeping-tile-segment-calculator/",
      "sources": [
        "Segment count = ceil(foundation perimeter ÷ standard pipe segment length), the standard method for estimating pipe segments along a continuous perimeter drain run"
      ],
      "vectors": [
        {
          "name": "45m perimeter, 3.05m segments",
          "inputs": {
            "foundationPerimeter": 45,
            "pipeSegmentLength": 3.05
          },
          "expected": 15,
          "toleranceDecimalPlaces": 0,
          "unit": "segments",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "60m perimeter, 3.05m segments",
          "inputs": {
            "foundationPerimeter": 60,
            "pipeSegmentLength": 3.05
          },
          "expected": 20,
          "toleranceDecimalPlaces": 0,
          "unit": "segments",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "weight-to-volume-material-calculator",
      "title": "Weight to Volume Material Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/weight-to-volume-material-calculator/",
      "sources": [
        "Commonly cited average bulk densities: gravel/sand ~2,700 lb/yd³, topsoil ~2,200 lb/yd³, mulch ~600 lb/yd³ — the inverse of the Material Volume to Weight Calculator; actual density varies with moisture content and composition, and the supplier's ticket weight governs"
      ],
      "vectors": [
        {
          "name": "10 tons of gravel",
          "inputs": {
            "materialType": "gravel",
            "weight": 9071.847
          },
          "expected": 7.407,
          "toleranceDecimalPlaces": 0.5,
          "unit": "cubic yards",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight",
              "value": 19999.99911815095,
              "unit": "lb"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "15 tons of topsoil",
          "inputs": {
            "materialType": "topsoil",
            "weight": 13607.771
          },
          "expected": 13.636,
          "toleranceDecimalPlaces": 0.5,
          "unit": "cubic yards",
          "confidence": "medium",
          "steps": [
            {
              "label": "Weight",
              "value": 29999.99977953774,
              "unit": "lb"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "weight-unit-conversion-calculator",
      "title": "Weight Unit Conversion Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/weight-unit-conversion-calculator/",
      "sources": [
        "1 lb = 0.45359237 kg (exact, by international agreement)"
      ],
      "vectors": [
        {
          "name": "50 lb to kg",
          "inputs": {
            "weightValue": 50,
            "fromUnit": "lb"
          },
          "expected": 22.6796,
          "toleranceDecimalPlaces": 0.1,
          "unit": "kg",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "100 kg to lb",
          "inputs": {
            "weightValue": 100,
            "fromUnit": "kg"
          },
          "expected": 220.462,
          "toleranceDecimalPlaces": 0.1,
          "unit": "lb",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "welded-wire-mesh-calculator",
      "title": "Welded Wire Mesh Calculator — Reinforcing Mesh Sheets for a Slab",
      "url": "https://craftquantities.com/calculators/materials-quantities/welded-wire-mesh-calculator/",
      "sources": [
        "Wire Reinforcement Institute, Manual of Standard Practice — Structural Welded Wire Reinforcement (WWR-500, 7th edition, © July 2006): style designation (6 x 12-W12 x W5 means wires at 6 in and 12 in, W12 and W5 being 0.12 and 0.05 sq in); width the centre-to-centre distance between the outside longitudinal wires, not including overhangs; side overhangs no greater than 1 in (25 mm) a side where none is specified; length tip to tip, always including the end overhangs; preferably the sum of the two end overhangs should equal the transverse wire spacing; common sheet sizes 96 in x 12.5 ft (US except west coast), 96 x 16, 96 x 20, 84 x 20 and 84 x 25 ft (US west coast), and 48 in x 8 ft and 96 in x 12, 14, 16 and 20 ft in Canada (2438 mm x 3.7, 4.3, 4.9 and 6.1 m); styles may be obtained in roll form, flattened and cut to size before placement; plain wire splices not less than one space + 2 in (50 mm) nor 6 in (150 mm), overhangs added to the splice length; for slabs on ground the minimum splice is 2 in plus overhangs",
        "American Society of Concrete Contractors, \"WWR Lap Splice Requirements\": ACI 439.5R-18, Guide for Specification, Manufacture and Construction Use of Welded Wire Reinforcement, section 6.4, gives a lap splice of one square plus 2 inches for plain wire WWR; non-structural slabs-on-ground are designed to ACI 360 and the design professional sets the splice",
        "BSI, BS 4483:2025 Steel fabric for the reinforcement of concrete. Specification (current; published 27 March 2025; supersedes BS 4483:2005, which is withdrawn), the standard UK fabric is made to: sheets of machine-welded fabric made from ribbed bars",
        "Capital Reinforcing (Ireland) Ltd, reinforcing mesh product page: mesh produced to BS 4483; A type square mesh A393, A252, A193 and A142, in standard sheets or flying end sheets",
        "Heaton Manufacturing, Steel Reinforcing Mesh Sizes (size chart, reviewed 3 April 2026): steel reinforcing mesh sizes in the UK are defined by BS 4483 and commonly supplied in standard 4.8 m x 2.4 m sheets, area 11.52 m²; A393, A252, A193 and A142 at a 200 mm pitch both ways",
        "Jewson, BRC Standard Fabric Reinforcement 4.8 x 2.4m x 6mm (L x W x Dia): the maker's part WWS A142, product length 4.8 m, product width 2.4 m"
      ],
      "vectors": [
        {
          "name": "Opening: a 9 x 6 m slab in WRI's 96 in x 20 ft sheets, 202 mm laps and 152 mm of end overhangs",
          "inputs": {
            "slabLength": 9,
            "slabWidth": 6,
            "edgeCover": 0,
            "sheetSize": "wri-96x240",
            "sheetLength": 6.1,
            "sheetWidth": 2.438,
            "lap": 0.202,
            "endOverhangs": 0.152
          },
          "expected": 4,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets",
          "confidence": "high",
          "steps": [
            {
              "label": "Sheets with their length along the slab",
              "value": 6,
              "unit": "sheets"
            },
            {
              "label": "Sheets with their length across the slab",
              "value": 4,
              "unit": "sheets"
            },
            {
              "label": "Sheets in each run, in the layout used",
              "value": 4,
              "unit": "sheets"
            },
            {
              "label": "Runs side by side, in the layout used",
              "value": 1,
              "unit": "runs"
            },
            {
              "label": "Sheets that need cutting, in the layout used",
              "value": 4,
              "unit": "sheets"
            },
            {
              "label": "Overlap where sheets meet end to end, tip to tip",
              "value": 354,
              "unit": "mm"
            },
            {
              "label": "Slab area the mesh covers",
              "value": 54,
              "unit": "m²"
            },
            {
              "label": "Area of the sheets bought",
              "value": 59.457945599999995,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A 40 x 30 ft slab, 8 x 20 ft sheets entered by hand at the ASCC's one square plus 2 in, 6 in of end overhangs, 2 in edge gap",
          "inputs": {
            "slabLength": 12.192,
            "slabWidth": 9.144,
            "edgeCover": 0.0508,
            "sheetSize": "custom",
            "sheetLength": 6.096,
            "sheetWidth": 2.4384,
            "lap": 0.2032,
            "endOverhangs": 0.15239999999999998
          },
          "expected": 12,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets",
          "confidence": "high",
          "steps": [
            {
              "label": "Sheets with their length along the slab",
              "value": 12,
              "unit": "sheets"
            },
            {
              "label": "Sheets with their length across the slab",
              "value": 12,
              "unit": "sheets"
            },
            {
              "label": "Sheets in each run, in the layout used",
              "value": 3,
              "unit": "sheets"
            },
            {
              "label": "Runs side by side, in the layout used",
              "value": 4,
              "unit": "runs"
            },
            {
              "label": "Sheets that need cutting, in the layout used",
              "value": 6,
              "unit": "sheets"
            },
            {
              "label": "Overlap where sheets meet end to end, tip to tip",
              "value": 355.59999999999997,
              "unit": "mm"
            },
            {
              "label": "Slab area the mesh covers",
              "value": 109.32623296000001,
              "unit": "m²"
            },
            {
              "label": "Area of the sheets bought",
              "value": 178.37383680000002,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A 39 x 8 ft slab in 20 ft sheets end to end: the end overhangs in the lap make three, where a bare 8 in would give two",
          "inputs": {
            "slabLength": 11.8872,
            "slabWidth": 2.4384,
            "edgeCover": 0,
            "sheetSize": "wri-96x240",
            "sheetLength": 6.1,
            "sheetWidth": 2.438,
            "lap": 0.2032,
            "endOverhangs": 0.15239999999999998
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets",
          "confidence": "high",
          "steps": [
            {
              "label": "Sheets with their length along the slab",
              "value": 3,
              "unit": "sheets"
            },
            {
              "label": "Sheets with their length across the slab",
              "value": 6,
              "unit": "sheets"
            },
            {
              "label": "Sheets in each run, in the layout used",
              "value": 3,
              "unit": "sheets"
            },
            {
              "label": "Runs side by side, in the layout used",
              "value": 1,
              "unit": "runs"
            },
            {
              "label": "Sheets that need cutting, in the layout used",
              "value": 1,
              "unit": "sheets"
            },
            {
              "label": "Overlap where sheets meet end to end, tip to tip",
              "value": 355.59999999999997,
              "unit": "mm"
            },
            {
              "label": "Slab area the mesh covers",
              "value": 28.98574848,
              "unit": "m²"
            },
            {
              "label": "Area of the sheets bought",
              "value": 44.5934592,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A 30 x 19.5 ft slab in WRI's 96 in x 12.5 ft sheets",
          "inputs": {
            "slabLength": 9.144,
            "slabWidth": 5.9436,
            "edgeCover": 0,
            "sheetSize": "wri-96x150",
            "sheetLength": 6.1,
            "sheetWidth": 2.438,
            "lap": 0.2032,
            "endOverhangs": 0.15239999999999998
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets",
          "confidence": "high",
          "steps": [
            {
              "label": "Sheets with their length along the slab",
              "value": 9,
              "unit": "sheets"
            },
            {
              "label": "Sheets with their length across the slab",
              "value": 8,
              "unit": "sheets"
            },
            {
              "label": "Sheets in each run, in the layout used",
              "value": 4,
              "unit": "sheets"
            },
            {
              "label": "Runs side by side, in the layout used",
              "value": 2,
              "unit": "runs"
            },
            {
              "label": "Sheets that need cutting, in the layout used",
              "value": 4,
              "unit": "sheets"
            },
            {
              "label": "Overlap where sheets meet end to end, tip to tip",
              "value": 355.59999999999997,
              "unit": "mm"
            },
            {
              "label": "Slab area the mesh covers",
              "value": 54.3482784,
              "unit": "m²"
            },
            {
              "label": "Area of the sheets bought",
              "value": 74.32243199999999,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A 9 x 6 m slab in the UK standard 4.8 x 2.4 m sheet",
          "inputs": {
            "slabLength": 9,
            "slabWidth": 6,
            "edgeCover": 0,
            "sheetSize": "uk-4800x2400",
            "sheetLength": 6.1,
            "sheetWidth": 2.438,
            "lap": 0.202,
            "endOverhangs": 0.152
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "sheets",
          "confidence": "high",
          "steps": [
            {
              "label": "Sheets with their length along the slab",
              "value": 6,
              "unit": "sheets"
            },
            {
              "label": "Sheets with their length across the slab",
              "value": 10,
              "unit": "sheets"
            },
            {
              "label": "Sheets in each run, in the layout used",
              "value": 2,
              "unit": "sheets"
            },
            {
              "label": "Runs side by side, in the layout used",
              "value": 3,
              "unit": "runs"
            },
            {
              "label": "Sheets that need cutting, in the layout used",
              "value": 4,
              "unit": "sheets"
            },
            {
              "label": "Overlap where sheets meet end to end, tip to tip",
              "value": 354,
              "unit": "mm"
            },
            {
              "label": "Slab area the mesh covers",
              "value": 54,
              "unit": "m²"
            },
            {
              "label": "Area of the sheets bought",
              "value": 69.11999999999999,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 4
        }
      ]
    },
    {
      "slug": "well-pressure-tank-sizing-calculator",
      "title": "Well Pressure Tank Sizing Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/well-pressure-tank-sizing-calculator/",
      "sources": [
        "Required drawdown = pump flow rate × minimum recommended cycle time (minutes); recommended tank size = required drawdown ÷ typical drawdown fraction (~33% for a standard captive-air tank)"
      ],
      "vectors": [
        {
          "name": "38 L/min (10 gal/min) pump, 1 min minimum cycle",
          "inputs": {
            "pumpFlow": 38,
            "minCycleTimeMin": 1
          },
          "expected": 115.15,
          "toleranceDecimalPlaces": 1,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Required drawdown",
              "value": 38,
              "unit": "L"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "57 L/min pump, 1.5 min minimum cycle",
          "inputs": {
            "pumpFlow": 57,
            "minCycleTimeMin": 1.5
          },
          "expected": 259.09,
          "toleranceDecimalPlaces": 1,
          "unit": "L",
          "confidence": "medium",
          "steps": [
            {
              "label": "Required drawdown",
              "value": 85.5,
              "unit": "L"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "wellpoint-radius-influence-calculator",
      "title": "Wellpoint Dewatering Radius of Influence Calculator (Sichardt)",
      "url": "https://craftquantities.com/calculators/materials-quantities/wellpoint-radius-influence-calculator/",
      "sources": [
        "Sichardt's empirical formula (unconfined conditions): R ≈ 3000 x s x sqrt(k), where R is the radius of influence in meters, s is the drawdown in meters, and k is the soil's hydraulic conductivity in m/s. Widely used as a first-pass planning estimate, though it's known to be approximate and typically most reliable for early-stage (first few days) dewatering planning."
      ],
      "vectors": [
        {
          "name": "3m drawdown, k=0.0001 m/s",
          "inputs": {
            "drawdown": 3,
            "hydraulicConductivity": 0.0001
          },
          "expected": 90,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2m drawdown, k=0.0004 m/s",
          "inputs": {
            "drawdown": 2,
            "hydraulicConductivity": 0.0004
          },
          "expected": 120,
          "toleranceDecimalPlaces": 0,
          "unit": "m",
          "confidence": "low",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "wet-concrete-cubic-yards-to-tons-calculator",
      "title": "Wet Concrete Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/wet-concrete-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 2.03 short tons per cubic yard",
        "Density varies with moisture, compaction and composition — the supplier's ticket weight governs"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 20.299999999999997,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 2.03,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 202.99999999999997,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 2.03,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "wet-concrete-tons-to-cubic-yards-calculator",
      "title": "Wet Concrete Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/wet-concrete-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 2.03 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 4.926108374384237,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.4926108374384237,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 49.26108374384237,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.4926108374384237,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "wet-plaster-cubic-yards-to-tons-calculator",
      "title": "Wet Plaster Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/wet-plaster-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 1.6 short tons per cubic yard",
        "Density varies with moisture, grading and how the material was processed"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 16,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.6,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 160,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.6,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "wet-plaster-tons-to-cubic-yards-calculator",
      "title": "Wet Plaster Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/wet-plaster-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 1.6 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 6.25,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.625,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 62.5,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.625,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "wet-room-floor-fall-calculator",
      "title": "Wet Room and Curbless Shower Floor Fall Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/wet-room-floor-fall-calculator/",
      "sources": [
        "The International Plumbing Code sets a shower floor's slope to the drain at not less than 1/4 in and not more than 1/2 in per foot (about 21 and 42 mm per metre): 1:48 to 1:24. ICC A117.1 limits the floor of an accessible shower to no steeper than 1:48 in any direction",
        "With the perimeter level, a floor falling to a point drain is four planes meeting at the drain, and water on each plane runs across it into the valleys that run from the corners to the drain. The valleys are the flattest lines on the floor, so the minimum fall is held along the longest of them: drop = distance from the drain to the farthest corner × the minimum fall. Each face then falls that drop over its own distance from the drain to its wall, which is steeper",
        "Screed volume = floor area × (depth at the drain + two-thirds of the drop) for a point drain — a pyramid holds a third of its box, wherever its apex sits — and floor area × (depth at the drain + half the drop) for a one-way fall to a linear drain. BS 8204-1 governs the screed, including the least thickness it may be laid to"
      ],
      "vectors": [
        {
          "name": "A 2.4 by 1.8 m wet room, drain in the middle, 1:48 — each valley is 1.5 m, so 31.25 mm of fall over the 25 mm at the drain",
          "inputs": {
            "floorLength": 2.4,
            "floorWidth": 1.8,
            "drainType": "point",
            "drainFromEnd": 1.2,
            "drainFromSide": 0.9,
            "fallRatio": 48,
            "depthAtDrain": 0.025,
            "tankingHeight": 0.15
          },
          "expected": 56.25,
          "toleranceDecimalPlaces": 4,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Screed depth at the drain",
              "value": 25,
              "unit": "mm"
            },
            {
              "label": "Drop from the walls to the drain",
              "value": 31.25,
              "unit": "mm"
            },
            {
              "label": "Longest run, from the farthest corner to the drain",
              "value": 1.5,
              "unit": "m"
            },
            {
              "label": "Fall along that valley — the flattest line on the floor",
              "value": 2.083333333333333,
              "unit": "%"
            },
            {
              "label": "Fall on the steepest face, towards the nearest wall",
              "value": 3.4722222222222223,
              "unit": "%"
            },
            {
              "label": "Screed volume, with the depth at the drain under all of it",
              "value": 198.00000000000003,
              "unit": "L"
            },
            {
              "label": "Floor area",
              "value": 4.32,
              "unit": "m²"
            },
            {
              "label": "Area to tank — the floor and its upstand",
              "value": 5.58,
              "unit": "m²"
            },
            {
              "label": "Floor-to-wall junction to reinforce",
              "value": 8.4,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "The same room with the drain near a corner — the far valley is 2.25 m, so the whole floor is deeper",
          "inputs": {
            "floorLength": 2.4,
            "floorWidth": 1.8,
            "drainType": "point",
            "drainFromEnd": 0.6,
            "drainFromSide": 0.45,
            "fallRatio": 48,
            "depthAtDrain": 0.025,
            "tankingHeight": 0.15
          },
          "expected": 71.875,
          "toleranceDecimalPlaces": 4,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Screed depth at the drain",
              "value": 25,
              "unit": "mm"
            },
            {
              "label": "Drop from the walls to the drain",
              "value": 46.875,
              "unit": "mm"
            },
            {
              "label": "Longest run, from the farthest corner to the drain",
              "value": 2.25,
              "unit": "m"
            },
            {
              "label": "Fall along that valley — the flattest line on the floor",
              "value": 2.083333333333333,
              "unit": "%"
            },
            {
              "label": "Fall on the steepest face, towards the nearest wall",
              "value": 10.416666666666666,
              "unit": "%"
            },
            {
              "label": "Screed volume, with the depth at the drain under all of it",
              "value": 243.00000000000003,
              "unit": "L"
            },
            {
              "label": "Floor area",
              "value": 4.32,
              "unit": "m²"
            },
            {
              "label": "Area to tank — the floor and its upstand",
              "value": 5.58,
              "unit": "m²"
            },
            {
              "label": "Floor-to-wall junction to reinforce",
              "value": 8.4,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A linear drain along one end wall — one plane, the fall running the full 2.4 m length",
          "inputs": {
            "floorLength": 2.4,
            "floorWidth": 1.8,
            "drainType": "linear",
            "drainFromEnd": 1.2,
            "drainFromSide": 0.9,
            "fallRatio": 48,
            "depthAtDrain": 0.025,
            "tankingHeight": 0.15
          },
          "expected": 75,
          "toleranceDecimalPlaces": 4,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Screed depth at the drain",
              "value": 25,
              "unit": "mm"
            },
            {
              "label": "Drop from the far wall to the drain",
              "value": 49.99999999999999,
              "unit": "mm"
            },
            {
              "label": "Fall, the same across the whole floor",
              "value": 2.083333333333333,
              "unit": "%"
            },
            {
              "label": "Screed volume, with the depth at the drain under all of it",
              "value": 216.00000000000003,
              "unit": "L"
            },
            {
              "label": "Floor area",
              "value": 4.32,
              "unit": "m²"
            },
            {
              "label": "Area to tank — the floor and its upstand",
              "value": 5.58,
              "unit": "m²"
            },
            {
              "label": "Floor-to-wall junction to reinforce",
              "value": 8.4,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A gentler 1:80 in the same room, drain in the middle",
          "inputs": {
            "floorLength": 2.4,
            "floorWidth": 1.8,
            "drainType": "point",
            "drainFromEnd": 1.2,
            "drainFromSide": 0.9,
            "fallRatio": 80,
            "depthAtDrain": 0.025,
            "tankingHeight": 0.15
          },
          "expected": 43.75,
          "toleranceDecimalPlaces": 4,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Screed depth at the drain",
              "value": 25,
              "unit": "mm"
            },
            {
              "label": "Drop from the walls to the drain",
              "value": 18.750000000000004,
              "unit": "mm"
            },
            {
              "label": "Longest run, from the farthest corner to the drain",
              "value": 1.5,
              "unit": "m"
            },
            {
              "label": "Fall along that valley — the flattest line on the floor",
              "value": 1.25,
              "unit": "%"
            },
            {
              "label": "Fall on the steepest face, towards the nearest wall",
              "value": 2.0833333333333335,
              "unit": "%"
            },
            {
              "label": "Screed volume, with the depth at the drain under all of it",
              "value": 162.00000000000003,
              "unit": "L"
            },
            {
              "label": "Floor area",
              "value": 4.32,
              "unit": "m²"
            },
            {
              "label": "Area to tank — the floor and its upstand",
              "value": 5.58,
              "unit": "m²"
            },
            {
              "label": "Floor-to-wall junction to reinforce",
              "value": 8.4,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A 1.5 m square catchment, centre gully, 1:48 on the diagonal, 4 mm standing on the flange",
          "inputs": {
            "floorLength": 1.5,
            "floorWidth": 1.5,
            "drainType": "point",
            "drainFromEnd": 0.75,
            "drainFromSide": 0.75,
            "fallRatio": 48,
            "depthAtDrain": 0.004,
            "tankingHeight": 0.15
          },
          "expected": 26.097087,
          "toleranceDecimalPlaces": 4,
          "unit": "mm",
          "confidence": "high",
          "steps": [
            {
              "label": "Screed depth at the drain",
              "value": 4,
              "unit": "mm"
            },
            {
              "label": "Drop from the walls to the drain",
              "value": 22.09708691207961,
              "unit": "mm"
            },
            {
              "label": "Longest run, from the farthest corner to the drain",
              "value": 1.0606601717798214,
              "unit": "m"
            },
            {
              "label": "Fall along that valley — the flattest line on the floor",
              "value": 2.083333333333333,
              "unit": "%"
            },
            {
              "label": "Fall on the steepest face, towards the nearest wall",
              "value": 2.946278254943948,
              "unit": "%"
            },
            {
              "label": "Screed volume, with the depth at the drain under all of it",
              "value": 42.14563036811941,
              "unit": "L"
            },
            {
              "label": "Floor area",
              "value": 2.25,
              "unit": "m²"
            },
            {
              "label": "Area to tank — the floor and its upstand",
              "value": 3.15,
              "unit": "m²"
            },
            {
              "label": "Floor-to-wall junction to reinforce",
              "value": 6,
              "unit": "m"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "wet-room-tanking-calculator",
      "title": "Wet Room Tanking and Waterproof Membrane Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/wet-room-tanking-calculator/",
      "sources": [
        "Liquid-applied tanking is specified in two coats, the second laid at right angles to the first, and every published coverage rate is PER COAT — so the area is doubled before it is divided by the rate",
        "Reinforcing tape or matting is bedded into the first coat at every internal junction — wall to floor, wall to wall — and a preformed collar at every pipe penetration, because a membrane bridging a moving junction unsupported is the joint that splits first",
        "Primer is required on absorbent substrates such as plaster, render and sand-cement screed, and is commonly omitted on cement-based tile backer board; the manufacturer's sheet governs which applies"
      ],
      "vectors": [
        {
          "name": "12 m² of wall and 4 m² of floor at 1 m²/L per coat",
          "inputs": {
            "wallArea": 12,
            "floorArea": 4,
            "coverageRate": 1,
            "junctionLength": 9,
            "penetrations": 3
          },
          "expected": 8.5,
          "toleranceDecimalPlaces": 2,
          "unit": "gal",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total area tanked",
              "value": 172.22256666735555,
              "unit": "sq ft"
            },
            {
              "label": "Area covered, at two coats",
              "value": 344.4451333347111,
              "unit": "sq ft"
            },
            {
              "label": "Reinforcing tape, laps included",
              "value": 32.48031496062992,
              "unit": "ft"
            },
            {
              "label": "Preformed collars",
              "value": 3,
              "unit": "collars"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A thirstier substrate at 0.7 m² per litre",
          "inputs": {
            "wallArea": 12,
            "floorArea": 4,
            "coverageRate": 0.7,
            "junctionLength": 9,
            "penetrations": 3
          },
          "expected": 12.1,
          "toleranceDecimalPlaces": 2,
          "unit": "gal",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total area tanked",
              "value": 172.22256666735555,
              "unit": "sq ft"
            },
            {
              "label": "Area covered, at two coats",
              "value": 344.4451333347111,
              "unit": "sq ft"
            },
            {
              "label": "Reinforcing tape, laps included",
              "value": 32.48031496062992,
              "unit": "ft"
            },
            {
              "label": "Preformed collars",
              "value": 3,
              "unit": "collars"
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "A tray installation with far less floor tanked",
          "inputs": {
            "wallArea": 9,
            "floorArea": 1,
            "coverageRate": 1,
            "junctionLength": 6,
            "penetrations": 2
          },
          "expected": 5.3,
          "toleranceDecimalPlaces": 2,
          "unit": "gal",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total area tanked",
              "value": 107.63910416709722,
              "unit": "sq ft"
            },
            {
              "label": "Area covered, at two coats",
              "value": 215.27820833419443,
              "unit": "sq ft"
            },
            {
              "label": "Reinforcing tape, laps included",
              "value": 21.653543307086615,
              "unit": "ft"
            },
            {
              "label": "Preformed collars",
              "value": 2,
              "unit": "collars"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "wheelbarrow-loads-calculator",
      "title": "Wheelbarrow Loads Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/wheelbarrow-loads-calculator/",
      "sources": [
        "A standard 6 cu ft wheelbarrow is practically loaded to about 5 cu ft to avoid spilling; loads needed = total volume (cu ft) / 5"
      ],
      "vectors": [
        {
          "name": "5 yd³ total volume",
          "inputs": {
            "bulkVolume": 3822.77428992
          },
          "expected": 27,
          "toleranceDecimalPlaces": 0,
          "unit": "wheelbarrow loads",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total volume",
              "value": 134.99999999999997,
              "unit": "ft³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2 yd³ total volume",
          "inputs": {
            "bulkVolume": 1529.109715968
          },
          "expected": 11,
          "toleranceDecimalPlaces": 0,
          "unit": "wheelbarrow loads",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total volume",
              "value": 54,
              "unit": "ft³"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "wheelchair-turning-space-calculator",
      "title": "Wheelchair Turning Space Clearance Checker",
      "url": "https://craftquantities.com/calculators/materials-quantities/wheelchair-turning-space-calculator/",
      "sources": [
        "Per the ADA 2010 Standards Section 304.3.1, a circular turning space requires a minimum diameter of 60 inches (1,525 mm / 1.524m) — verified against a regulatory-text mirror this session (up.codes), which confirmed the 60-inch/1525mm circular turning space figure directly."
      ],
      "vectors": [
        {
          "name": "1.6x1.6m space (compliant)",
          "inputs": {
            "spaceWidth": 1.6,
            "spaceDepth": 1.6
          },
          "expected": 1.6,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Required minimum diameter (ADA 304.3.1)",
              "value": 1.524,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1.4x1.8m space (not compliant)",
          "inputs": {
            "spaceWidth": 1.4,
            "spaceDepth": 1.8
          },
          "expected": 1.4,
          "toleranceDecimalPlaces": 1,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Required minimum diameter (ADA 304.3.1)",
              "value": 1.524,
              "unit": "m"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "whole-body-vibration-exposure-calculator",
      "title": "Whole-Body Vibration Exposure (A(8) and VDV) Calculator",
      "url": "https://craftquantities.com/calculators/sustainability-compliance/whole-body-vibration-exposure-calculator/",
      "sources": [
        "ISO 2631-1:1997 and Directive 2002/44/EC, Annex B: the daily exposure A(8) is the highest of 1.4 awx, 1.4 awy and awz, each scaled by √(T ÷ 8 hours), where aw is the frequency-weighted r.m.s. acceleration on each axis measured at the seat",
        "Control of Vibration at Work Regulations 2005, regulation 4: for whole-body vibration, a daily exposure action value of 0.5 m/s² A(8) and an exposure limit value of 1.15 m/s² A(8)",
        "Directive 2002/44/EC, Article 3(2): a Member State may instead express the whole-body values as vibration dose values — 9.1 m/s^1.75 for the action value and 21 m/s^1.75 for the limit value — and ISO 2631-1 scales a dose measured over part of a day to the whole day by the fourth root of the ratio of the times"
      ],
      "vectors": [
        {
          "name": "0.5 m/s² vertical for 8 hours is exactly the action value",
          "inputs": {
            "awx": 0,
            "awy": 0,
            "awz": 0.5,
            "exposureHours": 8,
            "vdvKnown": "no",
            "vdvMeasured": 6,
            "vdvMinutes": 30
          },
          "expected": 0.5,
          "toleranceDecimalPlaces": 3,
          "unit": "m/s²",
          "confidence": "medium",
          "steps": [
            {
              "label": "A(8) on the fore-and-aft (x) axis, ×1.4",
              "value": 0,
              "unit": "m/s²"
            },
            {
              "label": "A(8) on the side-to-side (y) axis, ×1.4",
              "value": 0,
              "unit": "m/s²"
            },
            {
              "label": "A(8) on the vertical (z) axis",
              "value": 0.5,
              "unit": "m/s²"
            },
            {
              "label": "Exposure time to reach the action value on the dominant axis",
              "value": 8,
              "unit": "hours"
            },
            {
              "label": "Exposure time to reach the limit value on the dominant axis",
              "value": 42.31999999999999,
              "unit": "hours"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "A 0.5 m/s² fore-and-aft reading outweighs 0.6 vertical once multiplied by 1.4",
          "inputs": {
            "awx": 0.5,
            "awy": 0.3,
            "awz": 0.6,
            "exposureHours": 8,
            "vdvKnown": "no",
            "vdvMeasured": 6,
            "vdvMinutes": 30
          },
          "expected": 0.7,
          "toleranceDecimalPlaces": 3,
          "unit": "m/s²",
          "confidence": "medium",
          "steps": [
            {
              "label": "A(8) on the fore-and-aft (x) axis, ×1.4",
              "value": 0.7,
              "unit": "m/s²"
            },
            {
              "label": "A(8) on the side-to-side (y) axis, ×1.4",
              "value": 0.42,
              "unit": "m/s²"
            },
            {
              "label": "A(8) on the vertical (z) axis",
              "value": 0.6,
              "unit": "m/s²"
            },
            {
              "label": "Exposure time to reach the action value on the dominant axis",
              "value": 4.081632653061225,
              "unit": "hours"
            },
            {
              "label": "Exposure time to reach the limit value on the dominant axis",
              "value": 21.591836734693874,
              "unit": "hours"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Half the day at 1.0 m/s² vertical is 0.71 — exposure falls with the square root of time",
          "inputs": {
            "awx": 0,
            "awy": 0,
            "awz": 1,
            "exposureHours": 4,
            "vdvKnown": "no",
            "vdvMeasured": 6,
            "vdvMinutes": 30
          },
          "expected": 0.707107,
          "toleranceDecimalPlaces": 3,
          "unit": "m/s²",
          "confidence": "medium",
          "steps": [
            {
              "label": "A(8) on the fore-and-aft (x) axis, ×1.4",
              "value": 0,
              "unit": "m/s²"
            },
            {
              "label": "A(8) on the side-to-side (y) axis, ×1.4",
              "value": 0,
              "unit": "m/s²"
            },
            {
              "label": "A(8) on the vertical (z) axis",
              "value": 0.7071067811865476,
              "unit": "m/s²"
            },
            {
              "label": "Exposure time to reach the action value on the dominant axis",
              "value": 2,
              "unit": "hours"
            },
            {
              "label": "Exposure time to reach the limit value on the dominant axis",
              "value": 10.579999999999998,
              "unit": "hours"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The defaults — 0.3, 0.25 and 0.55 for 6 hours — are 0.48 on the vertical axis",
          "inputs": {
            "awx": 0.3,
            "awy": 0.25,
            "awz": 0.55,
            "exposureHours": 6,
            "vdvKnown": "yes",
            "vdvMeasured": 6,
            "vdvMinutes": 30
          },
          "expected": 0.476314,
          "toleranceDecimalPlaces": 3,
          "unit": "m/s²",
          "confidence": "medium",
          "steps": [
            {
              "label": "A(8) on the fore-and-aft (x) axis, ×1.4",
              "value": 0.3637306695894642,
              "unit": "m/s²"
            },
            {
              "label": "A(8) on the side-to-side (y) axis, ×1.4",
              "value": 0.3031088913245535,
              "unit": "m/s²"
            },
            {
              "label": "A(8) on the vertical (z) axis",
              "value": 0.4763139720814413,
              "unit": "m/s²"
            },
            {
              "label": "Exposure time to reach the action value on the dominant axis",
              "value": 6.611570247933884,
              "unit": "hours"
            },
            {
              "label": "Exposure time to reach the limit value on the dominant axis",
              "value": 34.97520661157023,
              "unit": "hours"
            },
            {
              "label": "Vibration dose value scaled to the day",
              "value": 11.167258309225195,
              "unit": "m/s^1.75"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "window-film-calculator",
      "title": "Window Film Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/window-film-calculator/",
      "sources": [
        "A standard window film roll (3 ft x 15 ft) covers approximately 45 sq ft, per common retail roll sizes"
      ],
      "vectors": [
        {
          "name": "10m² window area",
          "inputs": {
            "windowArea": 10
          },
          "expected": 3,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "medium",
          "steps": [
            {
              "label": "Area to cover (with trim allowance)",
              "value": 118.40301458380695,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "20m² window area",
          "inputs": {
            "windowArea": 20
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "rolls",
          "confidence": "medium",
          "steps": [
            {
              "label": "Area to cover (with trim allowance)",
              "value": 236.8060291676139,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "window-heat-loss-savings-calculator",
      "title": "Window Heat Loss Savings Calculator",
      "url": "https://craftquantities.com/calculators/insulation-efficiency/window-heat-loss-savings-calculator/",
      "sources": [
        "Standard heat loss formula: Q = U x Area x temperature difference; savings = (U-old - U-new) x window area x design temperature difference"
      ],
      "vectors": [
        {
          "name": "10m² window area, U1.0 to U0.3, 50°F diff",
          "inputs": {
            "windowArea": 10,
            "oldUFactor": 1,
            "newUFactor": 0.3,
            "designTempDiff": 27.7777778
          },
          "expected": 3767.4,
          "toleranceDecimalPlaces": 1,
          "unit": "BTU/hr reduction",
          "confidence": "medium",
          "steps": [
            {
              "label": "U-factor improvement",
              "value": 0.7,
              "unit": "U"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "20m² window area, U0.9 to U0.25, 60°F diff",
          "inputs": {
            "windowArea": 20,
            "oldUFactor": 0.9,
            "newUFactor": 0.25,
            "designTempDiff": 33.3333333
          },
          "expected": 8395.9,
          "toleranceDecimalPlaces": 1,
          "unit": "BTU/hr reduction",
          "confidence": "medium",
          "steps": [
            {
              "label": "U-factor improvement",
              "value": 0.65,
              "unit": "U"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "window-setting-block-calculator",
      "title": "Window Setting Block Count Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/window-setting-block-calculator/",
      "sources": [
        "Total setting blocks = number of lites × blocks per lite, following standard glazing practice of two setting blocks placed at the quarter points beneath each glass lite"
      ],
      "vectors": [
        {
          "name": "40 lites, 2 blocks/lite",
          "inputs": {
            "liteCount": 40,
            "blocksPerLite": 2
          },
          "expected": 80,
          "toleranceDecimalPlaces": 0,
          "unit": "setting blocks",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "55 lites, 2 blocks/lite",
          "inputs": {
            "liteCount": 55,
            "blocksPerLite": 2
          },
          "expected": 110,
          "toleranceDecimalPlaces": 0,
          "unit": "setting blocks",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "window-wall-u-factor-calculator",
      "title": "Window Wall Area-Weighted U-Factor Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/window-wall-u-factor-calculator/",
      "sources": [
        "Area-weighted composite U-factor = (Uglass×Aglass + Uframe×Aframe) ÷ (Aglass+Aframe), the standard NFRC method for combining component U-factors into a single assembly rating"
      ],
      "vectors": [
        {
          "name": "Glass U1.8/8m², Frame U3.5/2m²",
          "inputs": {
            "glassUFactor": 1.8,
            "glassArea": 8,
            "frameUFactor": 3.5,
            "frameArea": 2
          },
          "expected": 2.14,
          "toleranceDecimalPlaces": 1,
          "unit": "W/m²K",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Glass U1.5/10m², Frame U3.0/2.5m²",
          "inputs": {
            "glassUFactor": 1.5,
            "glassArea": 10,
            "frameUFactor": 3,
            "frameArea": 2.5
          },
          "expected": 1.8,
          "toleranceDecimalPlaces": 1,
          "unit": "W/m²K",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "wire-gauge-to-amperage-calculator",
      "title": "Wire Gauge to Amperage Calculator",
      "url": "https://craftquantities.com/calculators/electrical/wire-gauge-to-amperage-calculator/",
      "sources": [
        "NFPA 70 (NEC) Table 310.16 — Allowable Ampacities of Insulated Conductors, copper, 60/75/90 °C columns, ambient 30 °C, not more than three current-carrying conductors",
        "NEC 240.4(D) — small-conductor overcurrent limits: 15 A for 14 AWG, 20 A for 12 AWG, 30 A for 10 AWG copper"
      ],
      "vectors": [
        {
          "name": "12 AWG copper is 25 A at 75 °C",
          "inputs": {
            "awg": "12"
          },
          "expected": 25,
          "toleranceDecimalPlaces": 0,
          "unit": "A",
          "confidence": "high",
          "steps": [
            {
              "label": "60 °C column",
              "value": 20,
              "unit": "A"
            },
            {
              "label": "75 °C column",
              "value": 25,
              "unit": "A"
            },
            {
              "label": "90 °C column",
              "value": 30,
              "unit": "A"
            },
            {
              "label": "Maximum overcurrent protection — NEC 240.4(D)",
              "value": 20,
              "unit": "A"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "14 AWG copper is 20 A at 75 °C",
          "inputs": {
            "awg": "14"
          },
          "expected": 20,
          "toleranceDecimalPlaces": 0,
          "unit": "A",
          "confidence": "high",
          "steps": [
            {
              "label": "60 °C column",
              "value": 15,
              "unit": "A"
            },
            {
              "label": "75 °C column",
              "value": 20,
              "unit": "A"
            },
            {
              "label": "90 °C column",
              "value": 25,
              "unit": "A"
            },
            {
              "label": "Maximum overcurrent protection — NEC 240.4(D)",
              "value": 15,
              "unit": "A"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "6 AWG copper is 65 A at 75 °C",
          "inputs": {
            "awg": "6"
          },
          "expected": 65,
          "toleranceDecimalPlaces": 0,
          "unit": "A",
          "confidence": "high",
          "steps": [
            {
              "label": "60 °C column",
              "value": 55,
              "unit": "A"
            },
            {
              "label": "75 °C column",
              "value": 65,
              "unit": "A"
            },
            {
              "label": "90 °C column",
              "value": 75,
              "unit": "A"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "1/0 AWG copper is 150 A at 75 °C",
          "inputs": {
            "awg": "0"
          },
          "expected": 150,
          "toleranceDecimalPlaces": -1,
          "unit": "A",
          "confidence": "high",
          "steps": [
            {
              "label": "60 °C column",
              "value": 125,
              "unit": "A"
            },
            {
              "label": "75 °C column",
              "value": 150,
              "unit": "A"
            },
            {
              "label": "90 °C column",
              "value": 170,
              "unit": "A"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "wire-gauge-voltage-drop-calculator",
      "title": "Wire Gauge Voltage Drop Calculator (Copper or Aluminum, AWG to 1,000 kcmil)",
      "url": "https://craftquantities.com/calculators/electrical/wire-gauge-voltage-drop-calculator/",
      "sources": [
        "Standard single-phase voltage drop formula: Vdrop = (2 x K x one-way length in ft x amps) / circular mils, K=12.9 for copper",
        "NEC recommends keeping voltage drop to 3% or less for branch circuits (and 5% total including feeders) for reasonable efficiency, though it is a recommendation, not a hard code violation",
        "IAEI Magazine, \"Voltage Drop Formulas\" (March/April 2017): K is a conductor's resistance per foot times its area in circular mils — the resistance of a conductor one circular mil in area and one foot long — at 75 °C (167 °F), from NEC Chapter 9 Table 8: 1,000 kcmil uncoated copper at 0.0129 Ω per 1,000 ft (0.0423 Ω/km) gives 12.9, 1,000 kcmil aluminum at 0.0212 Ω per 1,000 ft (0.0696 Ω/km) gives 21.2, and every size in the table works out close to these; the single-phase multiplier 2 becomes 1.732 for three phase",
        "EC&M, \"Stumped by the Code? NEC Requirements for Conductor Material Types and Sizing Requirements\" (Mike Holt, 9 February 2023, on the 2023 NEC): Section 310.3(A) sets the smallest conductors at 14 AWG for copper and 12 AWG for aluminum or copper-clad aluminum, except where the code permits otherwise"
      ],
      "vectors": [
        {
          "name": "12 AWG, 15 m (49.2 ft) run, 10 A, 120 V",
          "inputs": {
            "wireGauge": "12",
            "oneWayLength": 15,
            "currentAmps": 10,
            "circuitVoltage": "120"
          },
          "expected": 1.945,
          "toleranceDecimalPlaces": 1,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop",
              "value": 1.620322919053189,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 118.05561249713617,
              "unit": "V"
            },
            {
              "label": "K constant, Ω·cmil per ft",
              "value": 12.9
            },
            {
              "label": "Conductor area, circular mils",
              "value": 6530
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "14 AWG, 30 m (98.4 ft) run, 15 A, 120 V",
          "inputs": {
            "wireGauge": "14",
            "oneWayLength": 30,
            "currentAmps": 15,
            "circuitVoltage": "120"
          },
          "expected": 9.27,
          "toleranceDecimalPlaces": 0.2,
          "unit": "V",
          "confidence": "low",
          "steps": [
            {
              "label": "Voltage drop",
              "value": 7.7231450083338125,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 110.73222598999942,
              "unit": "V"
            },
            {
              "label": "K constant, Ω·cmil per ft",
              "value": 12.9
            },
            {
              "label": "Conductor area, circular mils",
              "value": 4110
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "aluminum at the same size drops 21.2/12.9 times as much: 12 AWG, 15 m (49.2 ft), 10 A is 3.195 V",
          "inputs": {
            "material": "aluminum",
            "wireGauge": "12",
            "phase": "single",
            "oneWayLength": 15,
            "currentAmps": 10,
            "circuitVoltage": "120"
          },
          "expected": 3.19542,
          "toleranceDecimalPlaces": 3,
          "unit": "V",
          "confidence": "medium",
          "steps": [
            {
              "label": "Voltage drop",
              "value": 2.662856270071907,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 116.80457247591372,
              "unit": "V"
            },
            {
              "label": "K constant, Ω·cmil per ft",
              "value": 21.2
            },
            {
              "label": "Conductor area, circular mils",
              "value": 6530
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "three phase at 480 V: 250 kcmil copper, 100 ft (30.48 m), 200 A drops 1.787 V",
          "inputs": {
            "material": "copper",
            "wireGauge": "250",
            "phase": "three",
            "oneWayLength": 30.48,
            "currentAmps": 200,
            "circuitVoltage": "480"
          },
          "expected": 1.787424,
          "toleranceDecimalPlaces": 4,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop",
              "value": 0.37238000000000004,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 478.212576,
              "unit": "V"
            },
            {
              "label": "K constant, Ω·cmil per ft",
              "value": 12.9
            },
            {
              "label": "Conductor area, circular mils",
              "value": 250000
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "the same run single phase drops 2/1.732 times as much: 2.064 V",
          "inputs": {
            "material": "copper",
            "wireGauge": "250",
            "phase": "single",
            "oneWayLength": 30.48,
            "currentAmps": 200,
            "circuitVoltage": "240"
          },
          "expected": 2.064,
          "toleranceDecimalPlaces": 4,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop",
              "value": 0.86,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 237.936,
              "unit": "V"
            },
            {
              "label": "K constant, Ω·cmil per ft",
              "value": 12.9
            },
            {
              "label": "Conductor area, circular mils",
              "value": 250000
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "aluminum 4/0, 150 ft (45.72 m), 150 A single phase drops 4.509 V",
          "inputs": {
            "material": "aluminum",
            "wireGauge": "4/0",
            "phase": "single",
            "oneWayLength": 45.72,
            "currentAmps": 150,
            "circuitVoltage": "240"
          },
          "expected": 4.508507,
          "toleranceDecimalPlaces": 4,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop",
              "value": 1.8785444234404536,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 235.49149338374292,
              "unit": "V"
            },
            {
              "label": "K constant, Ω·cmil per ft",
              "value": 21.2
            },
            {
              "label": "Conductor area, circular mils",
              "value": 211600
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "1,000 kcmil aluminum is the article's own row: 1,000 ft (304.8 m) at 100 A three phase drops 3.672 V",
          "inputs": {
            "material": "aluminum",
            "wireGauge": "1000",
            "phase": "three",
            "oneWayLength": 304.8,
            "currentAmps": 100,
            "circuitVoltage": "other",
            "customVoltage": 600
          },
          "expected": 3.67184,
          "toleranceDecimalPlaces": 4,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop",
              "value": 0.6119733333333333,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 596.32816,
              "unit": "V"
            },
            {
              "label": "K constant, Ω·cmil per ft",
              "value": 21.2
            },
            {
              "label": "Conductor area, circular mils",
              "value": 1000000
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "14 AWG aluminum is below the NEC's 12 AWG minimum for aluminum: no drop is given",
          "inputs": {
            "material": "aluminum",
            "wireGauge": "14",
            "phase": "single",
            "oneWayLength": 15,
            "currentAmps": 10,
            "circuitVoltage": "120"
          },
          "expected": 0,
          "toleranceDecimalPlaces": 6,
          "unit": "V",
          "confidence": "low",
          "steps": [
            {
              "label": "Conductor area, circular mils",
              "value": 4110
            }
          ],
          "basis": "cited",
          "sourceIndex": 3
        },
        {
          "name": "a 277 V lighting circuit: 12 AWG, 100 ft (30.48 m), 10 A drops 3.951 V",
          "inputs": {
            "material": "copper",
            "wireGauge": "12",
            "phase": "single",
            "oneWayLength": 30.48,
            "currentAmps": 10,
            "circuitVoltage": "277"
          },
          "expected": 3.950995,
          "toleranceDecimalPlaces": 4,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop",
              "value": 1.4263521320647277,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 273.0490045941807,
              "unit": "V"
            },
            {
              "label": "K constant, Ω·cmil per ft",
              "value": 12.9
            },
            {
              "label": "Conductor area, circular mils",
              "value": 6530
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "a 208 V three-phase circuit: 10 AWG, 100 ft (30.48 m), 10 A drops 2.152 V",
          "inputs": {
            "material": "copper",
            "wireGauge": "10",
            "phase": "three",
            "oneWayLength": 30.48,
            "currentAmps": 10,
            "circuitVoltage": "208"
          },
          "expected": 2.152486,
          "toleranceDecimalPlaces": 4,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop",
              "value": 1.0348488216985328,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 205.84751445086704,
              "unit": "V"
            },
            {
              "label": "K constant, Ω·cmil per ft",
              "value": 12.9
            },
            {
              "label": "Conductor area, circular mils",
              "value": 10380
            }
          ],
          "basis": "cited",
          "sourceIndex": 2
        },
        {
          "name": "8 AWG copper, 100 ft (30.48 m) at 10 A: 1.562689 V",
          "inputs": {
            "material": "copper",
            "wireGauge": "8",
            "phase": "single",
            "oneWayLength": 30.48,
            "currentAmps": 10,
            "circuitVoltage": "120"
          },
          "expected": 1.562689,
          "toleranceDecimalPlaces": 5,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop",
              "value": 1.3022410660205934,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 118.43731072077529,
              "unit": "V"
            },
            {
              "label": "K constant, Ω·cmil per ft",
              "value": 12.9
            },
            {
              "label": "Conductor area, circular mils",
              "value": 16510
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "6 AWG copper, 100 ft (30.48 m) at 10 A: 0.983232 V",
          "inputs": {
            "material": "copper",
            "wireGauge": "6",
            "phase": "single",
            "oneWayLength": 30.48,
            "currentAmps": 10,
            "circuitVoltage": "120"
          },
          "expected": 0.983232,
          "toleranceDecimalPlaces": 5,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop",
              "value": 0.819359756097561,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 119.01676829268293,
              "unit": "V"
            },
            {
              "label": "K constant, Ω·cmil per ft",
              "value": 12.9
            },
            {
              "label": "Conductor area, circular mils",
              "value": 26240
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "4 AWG copper, 100 ft (30.48 m) at 10 A: 0.618112 V",
          "inputs": {
            "material": "copper",
            "wireGauge": "4",
            "phase": "single",
            "oneWayLength": 30.48,
            "currentAmps": 10,
            "circuitVoltage": "120"
          },
          "expected": 0.618112,
          "toleranceDecimalPlaces": 5,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop",
              "value": 0.515093435553426,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 119.38188787733588,
              "unit": "V"
            },
            {
              "label": "K constant, Ω·cmil per ft",
              "value": 12.9
            },
            {
              "label": "Conductor area, circular mils",
              "value": 41740
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "3 AWG copper, 100 ft (30.48 m) at 10 A: 0.490308 V",
          "inputs": {
            "material": "copper",
            "wireGauge": "3",
            "phase": "single",
            "oneWayLength": 30.48,
            "currentAmps": 10,
            "circuitVoltage": "120"
          },
          "expected": 0.490308,
          "toleranceDecimalPlaces": 5,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop",
              "value": 0.40858988977575067,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 119.5096921322691,
              "unit": "V"
            },
            {
              "label": "K constant, Ω·cmil per ft",
              "value": 12.9
            },
            {
              "label": "Conductor area, circular mils",
              "value": 52620
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "2 AWG copper, 100 ft (30.48 m) at 10 A: 0.388788 V",
          "inputs": {
            "material": "copper",
            "wireGauge": "2",
            "phase": "single",
            "oneWayLength": 30.48,
            "currentAmps": 10,
            "circuitVoltage": "120"
          },
          "expected": 0.388788,
          "toleranceDecimalPlaces": 5,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop",
              "value": 0.32399035563592526,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 119.61121157323689,
              "unit": "V"
            },
            {
              "label": "K constant, Ω·cmil per ft",
              "value": 12.9
            },
            {
              "label": "Conductor area, circular mils",
              "value": 66360
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1 AWG copper, 100 ft (30.48 m) at 10 A: 0.308281 V",
          "inputs": {
            "material": "copper",
            "wireGauge": "1",
            "phase": "single",
            "oneWayLength": 30.48,
            "currentAmps": 10,
            "circuitVoltage": "120"
          },
          "expected": 0.308281,
          "toleranceDecimalPlaces": 5,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop",
              "value": 0.25690046600549643,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 119.6917194407934,
              "unit": "V"
            },
            {
              "label": "K constant, Ω·cmil per ft",
              "value": 12.9
            },
            {
              "label": "Conductor area, circular mils",
              "value": 83690
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "1/0 AWG copper, 100 ft (30.48 m) at 10 A: 0.244318 V",
          "inputs": {
            "material": "copper",
            "wireGauge": "1/0",
            "phase": "single",
            "oneWayLength": 30.48,
            "currentAmps": 10,
            "circuitVoltage": "120"
          },
          "expected": 0.244318,
          "toleranceDecimalPlaces": 5,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop",
              "value": 0.20359848484848486,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 119.75568181818181,
              "unit": "V"
            },
            {
              "label": "K constant, Ω·cmil per ft",
              "value": 12.9
            },
            {
              "label": "Conductor area, circular mils",
              "value": 105600
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "2/0 AWG copper, 100 ft (30.48 m) at 10 A: 0.193839 V",
          "inputs": {
            "material": "copper",
            "wireGauge": "2/0",
            "phase": "single",
            "oneWayLength": 30.48,
            "currentAmps": 10,
            "circuitVoltage": "120"
          },
          "expected": 0.193839,
          "toleranceDecimalPlaces": 5,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop",
              "value": 0.1615326821938392,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 119.8061607813674,
              "unit": "V"
            },
            {
              "label": "K constant, Ω·cmil per ft",
              "value": 12.9
            },
            {
              "label": "Conductor area, circular mils",
              "value": 133100
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "3/0 AWG copper, 100 ft (30.48 m) at 10 A: 0.153754 V",
          "inputs": {
            "material": "copper",
            "wireGauge": "3/0",
            "phase": "single",
            "oneWayLength": 30.48,
            "currentAmps": 10,
            "circuitVoltage": "120"
          },
          "expected": 0.153754,
          "toleranceDecimalPlaces": 5,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop",
              "value": 0.12812872467222883,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 119.84624553039333,
              "unit": "V"
            },
            {
              "label": "K constant, Ω·cmil per ft",
              "value": 12.9
            },
            {
              "label": "Conductor area, circular mils",
              "value": 167800
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "300 kcmil copper, 100 ft (30.48 m) at 10 A: 0.086 V",
          "inputs": {
            "material": "copper",
            "wireGauge": "300",
            "phase": "single",
            "oneWayLength": 30.48,
            "currentAmps": 10,
            "circuitVoltage": "120"
          },
          "expected": 0.086,
          "toleranceDecimalPlaces": 5,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop",
              "value": 0.07166666666666666,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 119.914,
              "unit": "V"
            },
            {
              "label": "K constant, Ω·cmil per ft",
              "value": 12.9
            },
            {
              "label": "Conductor area, circular mils",
              "value": 300000
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "350 kcmil copper, 100 ft (30.48 m) at 10 A: 0.073714 V",
          "inputs": {
            "material": "copper",
            "wireGauge": "350",
            "phase": "single",
            "oneWayLength": 30.48,
            "currentAmps": 10,
            "circuitVoltage": "120"
          },
          "expected": 0.073714,
          "toleranceDecimalPlaces": 5,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop",
              "value": 0.06142857142857144,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 119.92628571428571,
              "unit": "V"
            },
            {
              "label": "K constant, Ω·cmil per ft",
              "value": 12.9
            },
            {
              "label": "Conductor area, circular mils",
              "value": 350000
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "400 kcmil copper, 100 ft (30.48 m) at 10 A: 0.0645 V",
          "inputs": {
            "material": "copper",
            "wireGauge": "400",
            "phase": "single",
            "oneWayLength": 30.48,
            "currentAmps": 10,
            "circuitVoltage": "120"
          },
          "expected": 0.0645,
          "toleranceDecimalPlaces": 5,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop",
              "value": 0.05375,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 119.9355,
              "unit": "V"
            },
            {
              "label": "K constant, Ω·cmil per ft",
              "value": 12.9
            },
            {
              "label": "Conductor area, circular mils",
              "value": 400000
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "500 kcmil copper, 100 ft (30.48 m) at 10 A: 0.0516 V",
          "inputs": {
            "material": "copper",
            "wireGauge": "500",
            "phase": "single",
            "oneWayLength": 30.48,
            "currentAmps": 10,
            "circuitVoltage": "120"
          },
          "expected": 0.0516,
          "toleranceDecimalPlaces": 5,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop",
              "value": 0.043,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 119.9484,
              "unit": "V"
            },
            {
              "label": "K constant, Ω·cmil per ft",
              "value": 12.9
            },
            {
              "label": "Conductor area, circular mils",
              "value": 500000
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "600 kcmil copper, 100 ft (30.48 m) at 10 A: 0.043 V",
          "inputs": {
            "material": "copper",
            "wireGauge": "600",
            "phase": "single",
            "oneWayLength": 30.48,
            "currentAmps": 10,
            "circuitVoltage": "120"
          },
          "expected": 0.043,
          "toleranceDecimalPlaces": 5,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop",
              "value": 0.03583333333333333,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 119.957,
              "unit": "V"
            },
            {
              "label": "K constant, Ω·cmil per ft",
              "value": 12.9
            },
            {
              "label": "Conductor area, circular mils",
              "value": 600000
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "750 kcmil copper, 100 ft (30.48 m) at 10 A: 0.0344 V",
          "inputs": {
            "material": "copper",
            "wireGauge": "750",
            "phase": "single",
            "oneWayLength": 30.48,
            "currentAmps": 10,
            "circuitVoltage": "120"
          },
          "expected": 0.0344,
          "toleranceDecimalPlaces": 5,
          "unit": "V",
          "confidence": "high",
          "steps": [
            {
              "label": "Voltage drop",
              "value": 0.028666666666666667,
              "unit": "%"
            },
            {
              "label": "Voltage at the load",
              "value": 119.9656,
              "unit": "V"
            },
            {
              "label": "K constant, Ω·cmil per ft",
              "value": 12.9
            },
            {
              "label": "Conductor area, circular mils",
              "value": 750000
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "wire-pulling-tension-calculator",
      "title": "Cable Pulling Tension Calculator (Straight Run)",
      "url": "https://craftquantities.com/calculators/materials-quantities/wire-pulling-tension-calculator/",
      "sources": [
        "Straight-run pulling tension = cable weight per unit length × pull length × coefficient of friction, the standard basic cable-pulling tension formula for a straight conduit section (per common cable-pulling engineering references, e.g. Southwire's pulling tension guidelines); a typical PVC-conduit-to-cable-jacket friction coefficient is approximately 0.5"
      ],
      "vectors": [
        {
          "name": "1.2 kg/m cable, 50m straight pull, 0.5 friction",
          "inputs": {
            "cableWeight": 1.2,
            "pullLength": 50,
            "frictionCoefficient": 0.5
          },
          "expected": 294.2,
          "toleranceDecimalPlaces": 1,
          "unit": "N",
          "confidence": "low",
          "steps": [
            {
              "label": "Tension in kgf",
              "value": 30,
              "unit": "kgf"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "2 kg/m cable, 80m straight pull, 0.45 friction",
          "inputs": {
            "cableWeight": 2,
            "pullLength": 80,
            "frictionCoefficient": 0.45
          },
          "expected": 706.08,
          "toleranceDecimalPlaces": 1,
          "unit": "N",
          "confidence": "low",
          "steps": [
            {
              "label": "Tension in kgf",
              "value": 72,
              "unit": "kgf"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "wood-chip-cubic-yards-to-tons-calculator",
      "title": "Wood Chip Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/wood-chip-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 0.25 short tons per cubic yard",
        "Density varies with moisture, compaction and composition — the supplier's ticket weight governs"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 2.5,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.25,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 25,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.25,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "wood-chip-tons-to-cubic-yards-calculator",
      "title": "Wood Chip Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/wood-chip-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 0.25 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 40,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 4,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 400,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 4,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "wood-fence-stain-calculator",
      "title": "Wood Fence Stain Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/wood-fence-stain-calculator/",
      "sources": [
        "Fence stain typically covers approximately 150 sq ft per gallon per coat on rough-sawn wood — lower than smooth deck boards due to picket texture; staining both sides doubles the area"
      ],
      "vectors": [
        {
          "name": "30m fence, 1.8m tall, both sides",
          "inputs": {
            "fenceLength": 30,
            "fenceHeight": 1.8,
            "bothSides": "yes"
          },
          "expected": 8,
          "toleranceDecimalPlaces": 0,
          "unit": "gallons",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total area to stain",
              "value": 1162.50232500465,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "50m fence, 1.5m tall, one side",
          "inputs": {
            "fenceLength": 50,
            "fenceHeight": 1.5,
            "bothSides": "no"
          },
          "expected": 6,
          "toleranceDecimalPlaces": 0,
          "unit": "gallons",
          "confidence": "medium",
          "steps": [
            {
              "label": "Total area to stain",
              "value": 807.2932812532291,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "wood-load-duration-factor-calculator",
      "title": "Wood Load Duration Factor (CD) Adjustment Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/wood-load-duration-factor-calculator/",
      "sources": [
        "NDS (National Design Specification for Wood Construction) Table 2.3.2 load duration factors: CD = 0.9 (permanent/dead), 1.0 (ten-year/normal floor), 1.15 (two-month/snow), 1.25 (seven-day/construction & roof live), 1.6 (ten-minute/wind & seismic), 2.0 (impact)"
      ],
      "vectors": [
        {
          "name": "1000 reference value, snow (CD=1.15)",
          "inputs": {
            "referenceDesignValue": 1000,
            "loadType": "1.15"
          },
          "expected": 1150,
          "toleranceDecimalPlaces": 0,
          "unit": "(CD factor)",
          "confidence": "medium",
          "steps": [
            {
              "label": "CD factor applied",
              "value": 1.15
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "1200 reference value, roof live (CD=1.25)",
          "inputs": {
            "referenceDesignValue": 1200,
            "loadType": "1.25"
          },
          "expected": 1500,
          "toleranceDecimalPlaces": 0,
          "unit": "(CD factor)",
          "confidence": "medium",
          "steps": [
            {
              "label": "CD factor applied",
              "value": 1.25
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "wood-pellets-cubic-yards-to-tons-calculator",
      "title": "Wood Pellets Cubic Yards to Tons Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/wood-pellets-cubic-yards-to-tons-calculator/",
      "sources": [
        "Typical bulk density used here: approximately 0.55 short tons per cubic yard",
        "Density varies with moisture, grading and how the material was processed"
      ],
      "vectors": [
        {
          "name": "10 cu yd converts correctly",
          "inputs": {
            "cubicYards": 10
          },
          "expected": 5.5,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.55,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "cubicYards": 100
          },
          "expected": 55.00000000000001,
          "toleranceDecimalPlaces": 6,
          "unit": "short tons",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 0.55,
              "unit": "short tons per cu yd"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "wood-pellets-tons-to-cubic-yards-calculator",
      "title": "Wood Pellets Tons to Cubic Yards Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/wood-pellets-tons-to-cubic-yards-calculator/",
      "sources": [
        "Inverse of approximately 0.55 short tons per cubic yard",
        "1 short ton = 2,000 lb; a metric tonne is about 10% heavier"
      ],
      "vectors": [
        {
          "name": "10 short tons converts correctly",
          "inputs": {
            "tons": 10
          },
          "expected": 18.18181818181818,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.8181818181818181,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "tons": 100
          },
          "expected": 181.8181818181818,
          "toleranceDecimalPlaces": 6,
          "unit": "cu yd",
          "confidence": "high",
          "steps": [
            {
              "label": "Conversion factor applied",
              "value": 1.8181818181818181,
              "unit": "cu yd per short tons"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "wood-shingle-triple-lap-calculator",
      "title": "Wood Shingle Triple-Lap Exposure Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/wood-shingle-triple-lap-calculator/",
      "sources": [
        "Wood shingles are laid in a triple-lap pattern; bundle coverage is rated at a standard exposure (commonly 5 in (127 mm) for 16 in (406 mm) shingles) and scales linearly with actual exposure ÷ standard exposure"
      ],
      "vectors": [
        {
          "name": "100m² roof, 5in exposure (= reference)",
          "inputs": {
            "roofArea": 100,
            "shingleExposure": 0.127,
            "standardBundleCoverage": 2.322576,
            "standardExposure": 0.127
          },
          "expected": 44,
          "toleranceDecimalPlaces": 0,
          "unit": "bundles",
          "confidence": "medium",
          "steps": [
            {
              "label": "Scaled coverage per bundle",
              "value": 25,
              "unit": "ft²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "150m² roof, 6in exposure",
          "inputs": {
            "roofArea": 150,
            "shingleExposure": 0.1524,
            "standardBundleCoverage": 2.322576,
            "standardExposure": 0.127
          },
          "expected": 54,
          "toleranceDecimalPlaces": 0,
          "unit": "bundles",
          "confidence": "medium",
          "steps": [
            {
              "label": "Scaled coverage per bundle",
              "value": 30.000000000000004,
              "unit": "ft²"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "wood-stove-btu-calculator",
      "title": "Wood Stove & Fireplace BTU Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/wood-stove-btu-calculator/",
      "sources": [
        "Rule-of-thumb baseline: approximately 30-60 BTU per square foot for wood stove heating, depending on climate and insulation, with 40 BTU/sq ft as a common moderate-climate starting point"
      ],
      "vectors": [
        {
          "name": "8x7m space, moderate climate",
          "inputs": {
            "spaceLength": 8,
            "spaceWidth": 7,
            "climate": "moderate"
          },
          "expected": 24111,
          "toleranceDecimalPlaces": -1,
          "unit": "BTU/hr",
          "confidence": "medium",
          "steps": [
            {
              "label": "Space area",
              "value": 602.7789833357444,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "10x8m space, cold climate",
          "inputs": {
            "spaceLength": 10,
            "spaceWidth": 8,
            "climate": "cold"
          },
          "expected": 51667,
          "toleranceDecimalPlaces": -1,
          "unit": "BTU/hr",
          "confidence": "medium",
          "steps": [
            {
              "label": "Space area",
              "value": 861.1128333367777,
              "unit": "sq ft"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "woodwork-paint-calculator",
      "title": "Woodwork Paint Calculator",
      "url": "https://craftquantities.com/calculators/renovation-construction/woodwork-paint-calculator/",
      "sources": [
        "No published standard governs joinery paint quantities. The page applies the coating identity — paint = area × coats ÷ spread rate — to door leaves measured by face, and to frames and skirting measured as run × painted girth",
        "Trim paints are rated per coat on primed, smooth timber: commonly about 300 to 450 sq ft per gallon (7.4 to 11 m² per litre) for North American enamels, and often up to 16 or 17 m² per litre for UK and European glosses, satins and eggshells; the product's own tin is the figure to use"
      ],
      "vectors": [
        {
          "name": "one door both faces, 10 m of frame, 14 m of skirting, 2 coats at 14 m²/L",
          "inputs": {
            "doorCount": 1,
            "doorArea": 1.7,
            "doorFaces": "both",
            "frameRun": 10,
            "frameGirth": 0.15,
            "skirtingRun": 14,
            "skirtingGirth": 0.12,
            "coats": 2,
            "spreadRate": 14
          },
          "expected": 0.94,
          "toleranceDecimalPlaces": 3,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Door faces",
              "value": 3.4,
              "unit": "m²"
            },
            {
              "label": "Frames",
              "value": 1.5,
              "unit": "m²"
            },
            {
              "label": "Skirting",
              "value": 1.68,
              "unit": "m²"
            },
            {
              "label": "Area to paint, one coat",
              "value": 6.58,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "skirting only, 20 m of 150 mm girth, 2 coats at 12 m²/L",
          "inputs": {
            "doorCount": 0,
            "doorArea": 1.7,
            "doorFaces": "one",
            "frameRun": 0,
            "frameGirth": 0.15,
            "skirtingRun": 20,
            "skirtingGirth": 0.15,
            "coats": 2,
            "spreadRate": 12
          },
          "expected": 0.5,
          "toleranceDecimalPlaces": 3,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Door faces",
              "value": 0,
              "unit": "m²"
            },
            {
              "label": "Frames",
              "value": 0,
              "unit": "m²"
            },
            {
              "label": "Skirting",
              "value": 3,
              "unit": "m²"
            },
            {
              "label": "Area to paint, one coat",
              "value": 3,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "two doors one face, 19.6 m of 200 mm frame, 30 m of 100 mm skirting, 3 coats at 15 m²/L",
          "inputs": {
            "doorCount": 2,
            "doorArea": 1.9,
            "doorFaces": "one",
            "frameRun": 19.6,
            "frameGirth": 0.2,
            "skirtingRun": 30,
            "skirtingGirth": 0.1,
            "coats": 3,
            "spreadRate": 15
          },
          "expected": 2.144,
          "toleranceDecimalPlaces": 3,
          "unit": "L",
          "confidence": "high",
          "steps": [
            {
              "label": "Door faces",
              "value": 3.8,
              "unit": "m²"
            },
            {
              "label": "Frames",
              "value": 3.9200000000000004,
              "unit": "m²"
            },
            {
              "label": "Skirting",
              "value": 3,
              "unit": "m²"
            },
            {
              "label": "Area to paint, one coat",
              "value": 10.72,
              "unit": "m²"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "working-days-finish-calculator",
      "title": "Working Days to Finish Calculator",
      "url": "https://craftquantities.com/calculators/financial-adjacent/working-days-finish-calculator/",
      "sources": [
        "Calendar counting as programmes use it: each calendar day from the start is counted, a day counts as worked only if it falls in the working week, and the finish is the day on which the required working days — plus any holidays that fall on working days — have been worked"
      ],
      "vectors": [
        {
          "name": "The defaults: 20 working days and a holiday from a Monday",
          "inputs": {
            "startDay": "1",
            "pattern": "mon-fri",
            "workingDays": 20,
            "holidays": 1
          },
          "expected": 29,
          "toleranceDecimalPlaces": 0,
          "unit": "days",
          "confidence": "high",
          "steps": [
            {
              "label": "Working days, holidays included",
              "value": 21,
              "unit": "days"
            },
            {
              "label": "Days not worked in between — weekends, rest days and holidays",
              "value": 9,
              "unit": "days"
            },
            {
              "label": "Calendar weeks",
              "value": 4.142857142857143,
              "unit": "weeks"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Ten working days from a Wednesday",
          "inputs": {
            "startDay": "3",
            "pattern": "mon-fri",
            "workingDays": 10,
            "holidays": 0
          },
          "expected": 14,
          "toleranceDecimalPlaces": 0,
          "unit": "days",
          "confidence": "high",
          "steps": [
            {
              "label": "Working days, holidays included",
              "value": 10,
              "unit": "days"
            },
            {
              "label": "Days not worked in between — weekends, rest days and holidays",
              "value": 4,
              "unit": "days"
            },
            {
              "label": "Calendar weeks",
              "value": 2,
              "unit": "weeks"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A Saturday start waits for Monday",
          "inputs": {
            "startDay": "6",
            "pattern": "mon-fri",
            "workingDays": 5,
            "holidays": 0
          },
          "expected": 7,
          "toleranceDecimalPlaces": 0,
          "unit": "days",
          "confidence": "high",
          "steps": [
            {
              "label": "Working days, holidays included",
              "value": 5,
              "unit": "days"
            },
            {
              "label": "Days not worked in between — weekends, rest days and holidays",
              "value": 2,
              "unit": "days"
            },
            {
              "label": "Calendar weeks",
              "value": 1,
              "unit": "weeks"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A six-day week",
          "inputs": {
            "startDay": "1",
            "pattern": "mon-sat",
            "workingDays": 30,
            "holidays": 2
          },
          "expected": 37,
          "toleranceDecimalPlaces": 0,
          "unit": "days",
          "confidence": "high",
          "steps": [
            {
              "label": "Working days, holidays included",
              "value": 32,
              "unit": "days"
            },
            {
              "label": "Days not worked in between — weekends, rest days and holidays",
              "value": 7,
              "unit": "days"
            },
            {
              "label": "Calendar weeks",
              "value": 5.285714285714286,
              "unit": "weeks"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Every day, from a Friday",
          "inputs": {
            "startDay": "5",
            "pattern": "every-day",
            "workingDays": 14,
            "holidays": 0
          },
          "expected": 14,
          "toleranceDecimalPlaces": 0,
          "unit": "days",
          "confidence": "high",
          "steps": [
            {
              "label": "Working days, holidays included",
              "value": 14,
              "unit": "days"
            },
            {
              "label": "Days not worked in between — weekends, rest days and holidays",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Calendar weeks",
              "value": 2,
              "unit": "weeks"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A Tuesday start",
          "inputs": {
            "startDay": "2",
            "pattern": "mon-fri",
            "workingDays": 1,
            "holidays": 0
          },
          "expected": 1,
          "toleranceDecimalPlaces": 0,
          "unit": "days",
          "confidence": "high",
          "steps": [
            {
              "label": "Working days, holidays included",
              "value": 1,
              "unit": "days"
            },
            {
              "label": "Days not worked in between — weekends, rest days and holidays",
              "value": 0,
              "unit": "days"
            },
            {
              "label": "Calendar weeks",
              "value": 0.14285714285714285,
              "unit": "weeks"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A Thursday start runs over the weekend",
          "inputs": {
            "startDay": "4",
            "pattern": "mon-fri",
            "workingDays": 3,
            "holidays": 0
          },
          "expected": 5,
          "toleranceDecimalPlaces": 0,
          "unit": "days",
          "confidence": "high",
          "steps": [
            {
              "label": "Working days, holidays included",
              "value": 3,
              "unit": "days"
            },
            {
              "label": "Days not worked in between — weekends, rest days and holidays",
              "value": 2,
              "unit": "days"
            },
            {
              "label": "Calendar weeks",
              "value": 0.7142857142857143,
              "unit": "weeks"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "A Sunday start",
          "inputs": {
            "startDay": "0",
            "pattern": "mon-sat",
            "workingDays": 6,
            "holidays": 0
          },
          "expected": 7,
          "toleranceDecimalPlaces": 0,
          "unit": "days",
          "confidence": "high",
          "steps": [
            {
              "label": "Working days, holidays included",
              "value": 6,
              "unit": "days"
            },
            {
              "label": "Days not worked in between — weekends, rest days and holidays",
              "value": 1,
              "unit": "days"
            },
            {
              "label": "Calendar weeks",
              "value": 1,
              "unit": "weeks"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "workplace-exposure-twa-calculator",
      "title": "Workplace Exposure 8-Hour TWA Calculator (Dust, Fume, Vapour)",
      "url": "https://craftquantities.com/calculators/sustainability-compliance/workplace-exposure-twa-calculator/",
      "sources": [
        "HSE EH40/2005 (Workplace exposure limits): the 8-hour TWA = (C1T1 + C2T2 + … + CnTn) ÷ 8, where C is the concentration over each period of T hours and time not exposed counts as zero",
        "29 CFR 1910.1000(d)(1)(i): E = (CaTa + CbTb + … + CnTn) ÷ 8 for the 8-hour time-weighted average; 29 CFR 1910.1000(d)(2)(i): for a mixture, Em = C1/L1 + C2/L2 + … + Cn/Ln, which is not to exceed unity",
        "EH40/2005 and 29 CFR 1926.1153: respirable crystalline silica has a GB workplace exposure limit of 0.1 mg/m³ and a US construction permissible exposure limit of 50 µg/m³ (0.05 mg/m³), each as an 8-hour TWA"
      ],
      "vectors": [
        {
          "name": "A whole 8-hour day at 0.1 mg/m³ is an 8-hour TWA of 0.1",
          "inputs": {
            "mode": "twa",
            "unit": "mg/m³",
            "concentration1": 0.1,
            "concentrationHours1": 8,
            "concentration2": 0,
            "concentrationHours2": 0,
            "concentration3": 0,
            "concentrationHours3": 0,
            "concentration4": 0,
            "concentrationHours4": 0,
            "limit": 0,
            "mixExposure1": 50,
            "mixLimit1": 100,
            "mixExposure2": 20,
            "mixLimit2": 50,
            "mixExposure3": 0,
            "mixLimit3": 0,
            "mixExposure4": 0,
            "mixLimit4": 0
          },
          "expected": 0.1,
          "toleranceDecimalPlaces": 4,
          "unit": "mg/m³",
          "confidence": "high",
          "steps": [
            {
              "label": "Hours with an exposure entered",
              "value": 8,
              "unit": "hours"
            },
            {
              "label": "Period 1's share of the day's dose",
              "value": 100,
              "unit": "%"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "The defaults — two hours cutting at 0.3 and three at 0.05 — average to 0.094 over the day",
          "inputs": {
            "mode": "twa",
            "unit": "mg/m³",
            "concentration1": 0.3,
            "concentrationHours1": 2,
            "concentration2": 0.05,
            "concentrationHours2": 3,
            "concentration3": 0,
            "concentrationHours3": 0,
            "concentration4": 0,
            "concentrationHours4": 0,
            "limit": 0.1,
            "mixExposure1": 50,
            "mixLimit1": 100,
            "mixExposure2": 20,
            "mixLimit2": 50,
            "mixExposure3": 0,
            "mixLimit3": 0,
            "mixExposure4": 0,
            "mixLimit4": 0
          },
          "expected": 0.09375,
          "toleranceDecimalPlaces": 4,
          "unit": "mg/m³",
          "confidence": "medium",
          "steps": [
            {
              "label": "Hours with an exposure entered",
              "value": 5,
              "unit": "hours"
            },
            {
              "label": "Period 1's share of the day's dose",
              "value": 80,
              "unit": "%"
            },
            {
              "label": "Period 2's share of the day's dose",
              "value": 20.000000000000004,
              "unit": "%"
            },
            {
              "label": "The 8-hour TWA as a share of the limit entered",
              "value": 93.75,
              "unit": "%"
            }
          ],
          "basis": "cited",
          "sourceIndex": 0
        },
        {
          "name": "Four hours at 50 ppm and nothing else is an 8-hour TWA of 25 ppm",
          "inputs": {
            "mode": "twa",
            "unit": "ppm",
            "concentration1": 50,
            "concentrationHours1": 4,
            "concentration2": 0,
            "concentrationHours2": 0,
            "concentration3": 0,
            "concentrationHours3": 0,
            "concentration4": 0,
            "concentrationHours4": 0,
            "limit": 0,
            "mixExposure1": 50,
            "mixLimit1": 100,
            "mixExposure2": 20,
            "mixLimit2": 50,
            "mixExposure3": 0,
            "mixLimit3": 0,
            "mixExposure4": 0,
            "mixLimit4": 0
          },
          "expected": 25,
          "toleranceDecimalPlaces": 3,
          "unit": "ppm",
          "confidence": "high",
          "steps": [
            {
              "label": "Hours with an exposure entered",
              "value": 4,
              "unit": "hours"
            },
            {
              "label": "Period 1's share of the day's dose",
              "value": 100,
              "unit": "%"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Fibre counts average the same way: 0.2 fibres/ml for two hours is 0.05 over the 8-hour reference",
          "inputs": {
            "mode": "twa",
            "unit": "fibres/ml",
            "concentration1": 0.2,
            "concentrationHours1": 2,
            "concentration2": 0,
            "concentrationHours2": 0,
            "concentration3": 0,
            "concentrationHours3": 0,
            "concentration4": 0,
            "concentrationHours4": 0,
            "limit": 0,
            "mixExposure1": 50,
            "mixLimit1": 100,
            "mixExposure2": 20,
            "mixLimit2": 50,
            "mixExposure3": 0,
            "mixLimit3": 0,
            "mixExposure4": 0,
            "mixLimit4": 0
          },
          "expected": 0.05,
          "toleranceDecimalPlaces": 4,
          "unit": "fibres/ml",
          "confidence": "high",
          "steps": [
            {
              "label": "Hours with an exposure entered",
              "value": 2,
              "unit": "hours"
            },
            {
              "label": "Period 1's share of the day's dose",
              "value": 100,
              "unit": "%"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        },
        {
          "name": "Two solvents at half and four-fifths of their limits sum to a mixture index of 0.9",
          "inputs": {
            "mode": "mixture",
            "unit": "ppm",
            "concentration1": 0,
            "concentrationHours1": 0,
            "concentration2": 0,
            "concentrationHours2": 0,
            "concentration3": 0,
            "concentrationHours3": 0,
            "concentration4": 0,
            "concentrationHours4": 0,
            "limit": 0,
            "mixExposure1": 50,
            "mixLimit1": 100,
            "mixExposure2": 40,
            "mixLimit2": 100,
            "mixExposure3": 0,
            "mixLimit3": 0,
            "mixExposure4": 0,
            "mixLimit4": 0
          },
          "expected": 0.9,
          "toleranceDecimalPlaces": 3,
          "unit": "(mixture index)",
          "confidence": "medium",
          "steps": [
            {
              "label": "Substance 1: its TWA as a share of its own limit",
              "value": 50,
              "unit": "%"
            },
            {
              "label": "Substance 2: its TWA as a share of its own limit",
              "value": 40,
              "unit": "%"
            }
          ],
          "basis": "cited",
          "sourceIndex": 1
        }
      ]
    },
    {
      "slug": "worst-case-depressurisation-calculator",
      "title": "Worst-Case Envelope Depressurisation Calculator",
      "url": "https://craftquantities.com/calculators/plumbing-hvac/worst-case-depressurisation-calculator/",
      "sources": [
        "Envelope leakage follows the power law Q = C x dP^n, so a single-point blower-door result at a stated reference pressure gives dP = P_ref x (Q_net / Q_ref)^(1/n) for any other flow",
        "CSA F326, Residential Mechanical Ventilation Systems, together with the applicable mechanical and fuel-gas codes, sets the depressurisation limit and the exhaust capacity at which dedicated makeup air becomes mandatory — both are jurisdictional, which is why the limit is entered here rather than published by this page",
        "A flow exponent of 0.65 is the conventional assumption for a house envelope when the test report gives no measured exponent; it is a rule of thumb, not a property of your building, and a measured exponent from a multi-point test should replace it"
      ],
      "vectors": [
        {
          "name": "500 L/s at 50 Pa, n = 0.65, 250 L/s net exhaust",
          "inputs": {
            "envelopeLeakage": 500,
            "referencePressure": 50,
            "flowExponent": 0.65,
            "totalExhaustFlow": 250,
            "mechanicalSupplyFlow": 0,
            "makeupAirFlow": 0,
            "permittedLimit": 5
          },
          "expected": 17.2126,
          "toleranceDecimalPlaces": 2,
          "unit": "Pa",
          "confidence": "low",
          "steps": [
            {
              "label": "Net exhaust flow across the envelope",
              "value": 250,
              "unit": "L/s"
            },
            {
              "label": "Permitted depressurisation",
              "value": 5,
              "unit": "Pa"
            },
            {
              "label": "Margin to the limit",
              "value": -12.21261813992837,
              "unit": "Pa"
            },
            {
              "label": "Net exhaust the envelope carries at the limit",
              "value": 111.93605692841697,
              "unit": "L/s"
            }
          ],
          "basis": "ambiguous"
        },
        {
          "name": "800 L/s at 50 Pa, n = 0.7, 400 L/s exhaust against 100 L/s supply",
          "inputs": {
            "envelopeLeakage": 800,
            "referencePressure": 50,
            "flowExponent": 0.7,
            "totalExhaustFlow": 400,
            "mechanicalSupplyFlow": 100,
            "makeupAirFlow": 0,
            "permittedLimit": 5
          },
          "expected": 12.3152,
          "toleranceDecimalPlaces": 2,
          "unit": "Pa",
          "confidence": "low",
          "steps": [
            {
              "label": "Net exhaust flow across the envelope",
              "value": 300,
              "unit": "L/s"
            },
            {
              "label": "Permitted depressurisation",
              "value": 5,
              "unit": "Pa"
            },
            {
              "label": "Margin to the limit",
              "value": -7.31525032580582,
              "unit": "Pa"
            },
            {
              "label": "Net exhaust the envelope carries at the limit",
              "value": 159.62098519751038,
              "unit": "L/s"
            }
          ],
          "basis": "ambiguous"
        }
      ]
    },
    {
      "slug": "yards-to-meters-calculator",
      "title": "Yards to Metres Calculator",
      "url": "https://craftquantities.com/calculators/measurements-conversions/yards-to-meters-calculator/",
      "sources": [
        "International yard and pound agreement (1959): 1 yard = 0.9144 m exactly"
      ],
      "vectors": [
        {
          "name": "50 yd converts correctly",
          "inputs": {
            "yards": 50
          },
          "expected": 45.72,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Same length in feet",
              "value": 150,
              "unit": "ft"
            },
            {
              "label": "Same length in centimetres",
              "value": 4572,
              "unit": "cm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "Ten times the input",
          "inputs": {
            "yards": 500
          },
          "expected": 457.2,
          "toleranceDecimalPlaces": 6,
          "unit": "m",
          "confidence": "high",
          "steps": [
            {
              "label": "Same length in feet",
              "value": 1500,
              "unit": "ft"
            },
            {
              "label": "Same length in centimetres",
              "value": 45720,
              "unit": "cm"
            }
          ],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    },
    {
      "slug": "zone-airflow-balancing-calculator",
      "title": "HVAC Zone Airflow Balancing Percent Calculator",
      "url": "https://craftquantities.com/calculators/materials-quantities/zone-airflow-balancing-calculator/",
      "sources": [
        "Airflow balance deviation (%) = (Measured Airflow − Design Airflow) ÷ Design Airflow × 100, the standard testing-adjusting-balancing (TAB) metric (per AABC/NEBB TAB standards) used to confirm a zone's actual airflow is within an acceptable tolerance of its design value (commonly ±10%, per project specification)."
      ],
      "vectors": [
        {
          "name": "500 CFM design, 460 CFM measured",
          "inputs": {
            "designAirflow": 235.9737,
            "measuredAirflow": 217.0958
          },
          "expected": -8,
          "toleranceDecimalPlaces": 0,
          "unit": "%",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        },
        {
          "name": "800 CFM design, 850 CFM measured",
          "inputs": {
            "designAirflow": 377.558,
            "measuredAirflow": 401.1553
          },
          "expected": 6.25,
          "toleranceDecimalPlaces": 1,
          "unit": "%",
          "confidence": "high",
          "steps": [],
          "basis": "sole-source",
          "sourceIndex": 0
        }
      ]
    }
  ]
}
