{
  "name": "Concrete pours to cubic yards and whole bags at the yield you type",
  "page": "https://otherworldlabs.com/concrete-bags-and-yards/",
  "endpoint": "https://otherworldlabs.com/concrete-bags-and-yards/api.json",
  "question": "For the slabs, footings and columns whose dimensions the caller has measured, what volume is that in cubic yards and in cubic feet, how many bags is it at the cubic feet one bag fills, and what does the caller's own waste allowance add to both?",
  "answers": "one order at a time, of up to six pours; the page keeps one order in the reader's own browser and this endpoint stores nothing",
  "version": "2026-10-20",
  "licence": "The arithmetic is not ours to license. Reuse the formulas; the page is free and needs no attribution.",
  "method": "static description plus a worked example; the same formulas run in the page in the reader's browser, with nothing sent anywhere",
  "currency": "none. There is no price, no rate and no money figure anywhere in this endpoint: it answers a quantity question and nothing else.",
  "direction": "The calculation runs one way only: from dimensions the caller has already measured to a purchase quantity. It converts and never specifies. No dimension, thickness, depth, diameter, spacing, strength, mix or code requirement is supplied, suggested, defaulted or called usual by this endpoint, and nothing it returns is a specification anyone builds to. The two figures that are not dimensions - the cubic feet one bag fills, and the waste allowance - are likewise the caller's own: the yield is read off the bag in the caller's hand, where the bag prints it, and the allowance is the caller's own practice.",
  "rounding": {
    "counts": "whole where the control's step is whole: the item count per pour (1 to 99) and the pour count (1 to 6) are rounded to whole numbers, and a figure outside the range a control offers is brought to the nearer end of that range before anything is computed",
    "dimensions": "every dimension is read at two decimals, after it is brought inside the range its own shape and entry mode hold it to and before anything is computed from it: dimOf(v, lo, hi) = rN(clamp(v, lo, hi), 2), by the same half-away-from-zero rule as every other figure here. A slab length typed 12.345 is therefore read as 12.35 and its volume is worked from 12.35, not from 12.345; the order table heads that column THE DIMENSIONS USED and prints the figure it used. An agent reproducing this page rounds each dimension to two decimals after clamping it and before multiplying. Stated 2026-10-24 (round 2, MI6: the engine did this and this file did not say so).",
    "volumes": "cubic feet to two decimals and cubic yards to three, by rN(x, dp) = sign(x) x (Math.round(Math.abs(x) * 10^dp) / 10^dp) on the double, which is half AWAY FROM ZERO in both directions: at dp = 2, -0.005 comes out as -0.01, where Math.round(-0.005 * 100) / 100 would give -0 and so -0.00. The sign is taken out before the rounding and put back after, which is what makes the two directions one rule rather than two. No figure here can come out negative, because no control accepts a negative dimension; the rule is stated at both signs because the engine is one function and a reader of it should not have to guess which half is implemented.",
    "bags": "the bag count as the division gives it is rounded to two decimals, and the WHOLE bag count is the ceiling of that two-decimal figure: wholeBags(x) = Math.ceil(rN(x, 2)). Half a bag is not sold. Rounding to two decimals before the ceiling is deliberate and load-bearing: it is what makes the page, the workbook and this endpoint take the same figure up, instead of three engines disagreeing in the fourteenth decimal and one of them buying a bag nobody needs. The floor this puts under a bag count is not reachable from the page's own controls: a pour's cubic feet are themselves held to two decimals, so the smallest volume above nothing is 0.01 cubic feet, and the widest bag the control offers is 2.00 cubic feet, which leaves 0.005 bags - and 0.005 rounds away from zero to 0.01 and takes up to one whole bag. A nonzero volume therefore always calls for at least one bag.",
    "percentages": "the waste allowance is held to two decimals, which is finer than the half-percent step the control offers, and it is rounded by the same half-away-from-zero rule as every other figure here. It is printed to two decimals as well, so the percentage the page shows is the percentage it divided by rather than a rounder one.",
    "chain": "every figure is rounded where it is defined and every figure built out of other figures is built out of the ROUNDED ones, so no printed line is worked from a longer number than the one printed beside it. EVERY EXPRESSION HERE IS EVALUATED IN THE ORDER IT IS WRITTEN, left to right, and that order is load-bearing at the two-decimal half: a footing is round(run x width / 12 x depth / 12, 2), which is ((((run x width) / 12) x depth) / 12) and not run x (width / 12) x (depth / 12). The second grouping differs from the first in the last bit of a double, and round 1 of this page's review measured the difference - 176 printed figures across 12 of 4,445 states, every one of them a cent, because the true product lands exactly on a two-decimal half and the two groupings fall on opposite sides of it (M1). An agent reproducing this page from this file transcribes each expression term by term as it is written. The one named constant inside a formula is pi, taken to six decimals as 3.141593, which is the figure the page's own working prints."
  },
  "clamping": "Every figure is brought inside the range this page holds that figure inside before anything is computed. Three controls serve more than one reading, so each one's min and max are rewritten as the shape and the entry mode change - by the same loop that rewrites its label, since 2026-10-24 (round 1, B1: the labels changed and the bounds did not, so the markup offered the UNION of the ranges while the engine held the figure inside one of them) - and the engine then holds the figure inside the range its own shape and entry mode have: dimA is a slab's length (0 to 200 ft), a slab's area when the entry mode is area (0 to 40000 sq ft), a footing's run (0 to 500 ft) or a column's height (0 to 40 ft); dimB is a slab's width (0 to 200 ft), a footing's width (0 to 96 in) or a column's diameter (0 to 96 in); dimC is a slab's thickness (0 to 48 in) or a footing's depth (0 to 120 in). Two fields have no meaningful zero and are carried as NOT TYPED rather than clamped up to the bottom of their range: bagYield reads as not typed when it is blank or at nothing, and every bag count is then 0 and dashed on the page; wastePct reads as nothing when blank, which is the honest reading of an allowance nobody has typed. A dimension that is blank and a dimension typed as nothing are one thing, which is no measurement: the pour that wants it is not complete, no volume is computed for it, and its row prints what was typed and no figure. A number input accepts a figure past its own max however the max is written, so a figure typed outside its range is still held at the nearer end of that range - and the PAGE SAYS SO: every held figure prints a sentence in the order warnings naming which figure was held and the figure it was read as, and the order table heads its dimension column THE DIMENSIONS USED rather than AS YOU TYPED IT. The figures this endpoint returns are unchanged by that: bagYieldTyped and wastePctTyped are the held figures, as they always were. There is no state this endpoint describes that the page's own controls cannot reach.",
  "inputs": [
    {
      "name": "pourCount",
      "type": "number",
      "unit": "pours",
      "required": false,
      "range": "1 to 6, step 1, default 1",
      "note": "How many pours are on this order. One card shows for each. A fill that carries lines rather than a count - which is how the workbook sold beside the page arrives - is as long as the lines it carries."
    },
    {
      "name": "pours[].name",
      "type": "string",
      "required": false,
      "range": "up to 40 characters",
      "note": "The reader's own name for the pour. It is echoed and nothing else; no figure depends on it. Blank is allowed and the row is then named by its number."
    },
    {
      "name": "pours[].shape",
      "type": "string",
      "required": true,
      "range": "exactly one of slab, footing, column - matched case-insensitively on the PREFIX, so any value beginning foot reads as a footing and any value beginning column reads as a column, and every other value reads as slab (round 2, MI8)",
      "note": "The geometry the reader measured, chosen by the reader and never because the page recommends a shape. Read case-insensitively and by prefix, so Slab, SLAB and slab are one value; a value this engine does not recognise reads as slab, which is the option the control is showing."
    },
    {
      "name": "pours[].slabBy",
      "type": "string",
      "required": false,
      "range": "lw or area; anything naming an area reads as area, anything else as lw",
      "note": "Which figures the reader holds for a SLAB: a length and a width (lw, the default) or the square footage itself (area). It is an entry mode and not a fourth geometry. Ignored for a footing and a column. A reader quoted 480 square feet holds that area and holds no length and no width, and the page may not make them invent a pair whose product fits."
    },
    {
      "name": "pours[].dimA",
      "type": "number",
      "unit": "feet, or square feet in the slab's area mode",
      "required": true,
      "range": "the control offers 0 to 40000 step 0.01; the engine holds it to 0 to 200 for a slab's length, 0 to 40000 for a slab's area, 0 to 500 for a footing's run and 0 to 40 for a column's height",
      "note": "Blank or nothing reads as no measurement and the pour is then not complete."
    },
    {
      "name": "pours[].dimB",
      "type": "number",
      "unit": "feet for a slab's width, inches for a footing's width and a column's diameter",
      "required": true,
      "range": "the control offers 0 to 200 step 0.01; the engine holds it to 0 to 200 for a slab's width and 0 to 96 for a footing's width or a column's diameter",
      "note": "Not used by a slab typed as an area: the field is hidden and the figure ignored rather than defaulted. Blank or nothing reads as no measurement for the shapes that do use it."
    },
    {
      "name": "pours[].dimC",
      "type": "number",
      "unit": "inches",
      "required": true,
      "range": "the control offers 0 to 120 step 0.01; the engine holds it to 0 to 48 for a slab's thickness and 0 to 120 for a footing's depth",
      "note": "Not used by a column: the field is hidden and the figure ignored rather than defaulted. Blank or nothing reads as no measurement for the shapes that do use it. No thickness and no depth is suggested, defaulted or called usual anywhere."
    },
    {
      "name": "pours[].qty",
      "type": "number",
      "unit": "items",
      "required": false,
      "range": "1 to 99, step 1, default 1",
      "note": "How many identical items of this pour there are: twelve post holes, four piers, one pad. Blank or anything under one reads as one."
    },
    {
      "name": "bagYield",
      "type": "number",
      "unit": "cubic feet a bag",
      "required": true,
      "range": "0.1 to 2, step 0.01, BLANK when the page loads",
      "note": "The cubic feet of set concrete one bag fills, read off the bag the reader is holding, where the bag prints it. It is never pre-filled, defaulted, suggested or called usual by the page or by the file sold beside it. While it is blank every bag count is 0 and the page dashes it."
    },
    {
      "name": "wastePct",
      "type": "number",
      "unit": "percent",
      "required": false,
      "range": "0 to 50, step 0.5, BLANK when the page loads",
      "note": "The waste allowance, typed by the reader out of their own practice and likewise never supplied, suggested or called usual. Blank reads as nothing."
    }
  ],
  "outputs": [
    {
      "name": "poursOnOrder",
      "unit": "pours",
      "formula": "the pour count as typed, held to 1 to 6 and rounded whole; where no count is typed, the number of lines the fill carries, held to the same range"
    },
    {
      "name": "poursStarted",
      "unit": "pours",
      "formula": "how many live pours are STARTED: a name typed, a shape naming one of the three, or any dimension ITS OWN SHAPE AND ENTRY MODE USE above nothing. A dimension the shape and mode do not use is read as nothing before this test and does not start a pour: a width typed on a slab whose entry mode is an area, or a thickness typed on a column, leaves the pour unstarted (round 2, MI7). The page's own select always names one of the three, so every live card is started there whatever its dimensions; the distinction is reachable only through a folded workbook line"
    },
    {
      "name": "poursComplete",
      "unit": "pours",
      "formula": "how many live pours are COMPLETE: started, and carrying every dimension its own shape and entry mode need - a slab typed as length and width needs the length, the width and the thickness; a slab typed as an area needs the area and the thickness; a footing needs the run, the width and the depth; a column needs the height and the diameter"
    },
    {
      "name": "poursCounted",
      "unit": "pours",
      "formula": "how many live pours have cubic feet above nothing. It is poursComplete less any complete pour whose dimensions multiply out to nothing, which the ranges and the rounding make possible at the bottom of the scale"
    },
    {
      "name": "itemsTotal",
      "unit": "items",
      "formula": "the item counts of the COMPLETE pours, added. 0 while no pour is complete"
    },
    {
      "name": "ft3Pour1",
      "unit": "cubic feet",
      "formula": "the first pour: that pour's own cubic feet: unit x qty, where unit is round(dimA x dimB x dimC / 12, 2) for a slab typed as length and width, round(dimA x dimC / 12, 2) for a slab typed as an area, round(dimA x dimB / 12 x dimC / 12, 2) for a footing and round(3.141593 x dimB / 24 x dimB / 24 x dimA, 2) for a column, each then rounded again after the item count. 0 while that pour is not complete, and so 0 while no pour is complete, and 0 for a pour past the pour count"
    },
    {
      "name": "ft3Pour2",
      "unit": "cubic feet",
      "formula": "the second pour: that pour's own cubic feet: unit x qty, where unit is round(dimA x dimB x dimC / 12, 2) for a slab typed as length and width, round(dimA x dimC / 12, 2) for a slab typed as an area, round(dimA x dimB / 12 x dimC / 12, 2) for a footing and round(3.141593 x dimB / 24 x dimB / 24 x dimA, 2) for a column, each then rounded again after the item count. 0 while that pour is not complete, and so 0 while no pour is complete, and 0 for a pour past the pour count"
    },
    {
      "name": "ft3Pour3",
      "unit": "cubic feet",
      "formula": "the third pour: that pour's own cubic feet: unit x qty, where unit is round(dimA x dimB x dimC / 12, 2) for a slab typed as length and width, round(dimA x dimC / 12, 2) for a slab typed as an area, round(dimA x dimB / 12 x dimC / 12, 2) for a footing and round(3.141593 x dimB / 24 x dimB / 24 x dimA, 2) for a column, each then rounded again after the item count. 0 while that pour is not complete, and so 0 while no pour is complete, and 0 for a pour past the pour count"
    },
    {
      "name": "ft3Pour4",
      "unit": "cubic feet",
      "formula": "the fourth pour: that pour's own cubic feet: unit x qty, where unit is round(dimA x dimB x dimC / 12, 2) for a slab typed as length and width, round(dimA x dimC / 12, 2) for a slab typed as an area, round(dimA x dimB / 12 x dimC / 12, 2) for a footing and round(3.141593 x dimB / 24 x dimB / 24 x dimA, 2) for a column, each then rounded again after the item count. 0 while that pour is not complete, and so 0 while no pour is complete, and 0 for a pour past the pour count"
    },
    {
      "name": "ft3Pour5",
      "unit": "cubic feet",
      "formula": "the fifth pour: that pour's own cubic feet: unit x qty, where unit is round(dimA x dimB x dimC / 12, 2) for a slab typed as length and width, round(dimA x dimC / 12, 2) for a slab typed as an area, round(dimA x dimB / 12 x dimC / 12, 2) for a footing and round(3.141593 x dimB / 24 x dimB / 24 x dimA, 2) for a column, each then rounded again after the item count. 0 while that pour is not complete, and so 0 while no pour is complete, and 0 for a pour past the pour count"
    },
    {
      "name": "ft3Pour6",
      "unit": "cubic feet",
      "formula": "the sixth pour: that pour's own cubic feet: unit x qty, where unit is round(dimA x dimB x dimC / 12, 2) for a slab typed as length and width, round(dimA x dimC / 12, 2) for a slab typed as an area, round(dimA x dimB / 12 x dimC / 12, 2) for a footing and round(3.141593 x dimB / 24 x dimB / 24 x dimA, 2) for a column, each then rounded again after the item count. 0 while that pour is not complete, and so 0 while no pour is complete, and 0 for a pour past the pour count"
    },
    {
      "name": "yd3Pour1",
      "unit": "cubic yards",
      "formula": "the first pour: round(ft3Pour1 / 27, 3). 0 while that pour is not complete, and so 0 while no pour is complete"
    },
    {
      "name": "yd3Pour2",
      "unit": "cubic yards",
      "formula": "the second pour: round(ft3Pour2 / 27, 3). 0 while that pour is not complete, and so 0 while no pour is complete"
    },
    {
      "name": "yd3Pour3",
      "unit": "cubic yards",
      "formula": "the third pour: round(ft3Pour3 / 27, 3). 0 while that pour is not complete, and so 0 while no pour is complete"
    },
    {
      "name": "yd3Pour4",
      "unit": "cubic yards",
      "formula": "the fourth pour: round(ft3Pour4 / 27, 3). 0 while that pour is not complete, and so 0 while no pour is complete"
    },
    {
      "name": "yd3Pour5",
      "unit": "cubic yards",
      "formula": "the fifth pour: round(ft3Pour5 / 27, 3). 0 while that pour is not complete, and so 0 while no pour is complete"
    },
    {
      "name": "yd3Pour6",
      "unit": "cubic yards",
      "formula": "the sixth pour: round(ft3Pour6 / 27, 3). 0 while that pour is not complete, and so 0 while no pour is complete"
    },
    {
      "name": "bagsWholePour1",
      "unit": "bags",
      "formula": "the first pour: ceil(round(ft3Pour1 / bagYield, 2)). 0 while that pour is not complete, and so 0 while no pour is complete, and 0 while the yield is not typed"
    },
    {
      "name": "bagsWholePour2",
      "unit": "bags",
      "formula": "the second pour: ceil(round(ft3Pour2 / bagYield, 2)). 0 while that pour is not complete, and so 0 while no pour is complete, and 0 while the yield is not typed"
    },
    {
      "name": "bagsWholePour3",
      "unit": "bags",
      "formula": "the third pour: ceil(round(ft3Pour3 / bagYield, 2)). 0 while that pour is not complete, and so 0 while no pour is complete, and 0 while the yield is not typed"
    },
    {
      "name": "bagsWholePour4",
      "unit": "bags",
      "formula": "the fourth pour: ceil(round(ft3Pour4 / bagYield, 2)). 0 while that pour is not complete, and so 0 while no pour is complete, and 0 while the yield is not typed"
    },
    {
      "name": "bagsWholePour5",
      "unit": "bags",
      "formula": "the fifth pour: ceil(round(ft3Pour5 / bagYield, 2)). 0 while that pour is not complete, and so 0 while no pour is complete, and 0 while the yield is not typed"
    },
    {
      "name": "bagsWholePour6",
      "unit": "bags",
      "formula": "the sixth pour: ceil(round(ft3Pour6 / bagYield, 2)). 0 while that pour is not complete, and so 0 while no pour is complete, and 0 while the yield is not typed"
    },
    {
      "name": "ft3WithWastePour1",
      "unit": "cubic feet",
      "formula": "the first pour: round(ft3Pour1 + round(ft3Pour1 x wastePct / 100, 2), 2). 0 while that pour is not complete, and so 0 while no pour is complete"
    },
    {
      "name": "ft3WithWastePour2",
      "unit": "cubic feet",
      "formula": "the second pour: round(ft3Pour2 + round(ft3Pour2 x wastePct / 100, 2), 2). 0 while that pour is not complete, and so 0 while no pour is complete"
    },
    {
      "name": "ft3WithWastePour3",
      "unit": "cubic feet",
      "formula": "the third pour: round(ft3Pour3 + round(ft3Pour3 x wastePct / 100, 2), 2). 0 while that pour is not complete, and so 0 while no pour is complete"
    },
    {
      "name": "ft3WithWastePour4",
      "unit": "cubic feet",
      "formula": "the fourth pour: round(ft3Pour4 + round(ft3Pour4 x wastePct / 100, 2), 2). 0 while that pour is not complete, and so 0 while no pour is complete"
    },
    {
      "name": "ft3WithWastePour5",
      "unit": "cubic feet",
      "formula": "the fifth pour: round(ft3Pour5 + round(ft3Pour5 x wastePct / 100, 2), 2). 0 while that pour is not complete, and so 0 while no pour is complete"
    },
    {
      "name": "ft3WithWastePour6",
      "unit": "cubic feet",
      "formula": "the sixth pour: round(ft3Pour6 + round(ft3Pour6 x wastePct / 100, 2), 2). 0 while that pour is not complete, and so 0 while no pour is complete"
    },
    {
      "name": "totalFt3",
      "unit": "cubic feet",
      "formula": "the cubic feet of every COMPLETE pour, added and rounded to two decimals. 0 while no pour is complete"
    },
    {
      "name": "totalYd3",
      "unit": "cubic yards",
      "formula": "round(totalFt3 / 27, 3). 0 while no pour is complete"
    },
    {
      "name": "bagsExact",
      "unit": "bags",
      "formula": "round(totalFt3 / bagYield, 2). 0 while the yield is not typed, and 0 while no pour is complete"
    },
    {
      "name": "bagsWhole",
      "unit": "bags",
      "formula": "ceil(bagsExact), the whole order's volume taken up ONCE. 0 while the yield is not typed, and 0 while no pour is complete"
    },
    {
      "name": "bagsWholeByRow",
      "unit": "bags",
      "formula": "the whole-bag counts of the complete pours, added: each pour taken up on its own. It is at least bagsWhole and can stand a bag or two past it, because a ceiling taken per row and a ceiling taken once are two different roundings of one volume. 0 while the yield is not typed, and 0 while no pour is complete"
    },
    {
      "name": "wasteFt3",
      "unit": "cubic feet",
      "formula": "round(totalFt3 x wastePct / 100, 2): what the allowance adds to the order in the unit the geometry is in. 0 while no pour is complete, and 0 where the allowance is blank or nothing"
    },
    {
      "name": "totalFt3WithWaste",
      "unit": "cubic feet",
      "formula": "round(totalFt3 + wasteFt3, 2). 0 while no pour is complete"
    },
    {
      "name": "totalYd3WithWaste",
      "unit": "cubic yards",
      "formula": "round(totalFt3WithWaste / 27, 3). 0 while no pour is complete"
    },
    {
      "name": "bagsWithWasteExact",
      "unit": "bags",
      "formula": "round(totalFt3WithWaste / bagYield, 2). 0 while the yield is not typed, and 0 while no pour is complete"
    },
    {
      "name": "bagsWholeWithWaste",
      "unit": "bags",
      "formula": "ceil(bagsWithWasteExact). It is taken from the allowance-applied VOLUME and never from a bag count that has already been rounded up. 0 while the yield is not typed, and 0 while no pour is complete"
    },
    {
      "name": "bagsWholeWithWasteByRow",
      "unit": "bags",
      "formula": "the allowance-applied whole-bag counts of the complete pours, added: each pour taken up on its own with its own allowance in. It is at least bagsWholeWithWaste and can stand a bag or two past it, for the same reason bagsWholeByRow can. 0 while the yield is not typed, and 0 while no pour is complete"
    },
    {
      "name": "bagsAddedByAllowance",
      "unit": "bags",
      "formula": "bagsWholeWithWaste - bagsWhole: the whole bags the allowance adds, which is what the page prints beside the allowance as typed. 0 while the yield is not typed, and 0 while no pour is complete"
    },
    {
      "name": "bagsAddedByAllowanceByRow",
      "unit": "bags",
      "formula": "bagsWholeWithWasteByRow - bagsWholeByRow: the whole bags the allowance adds when each pour is taken up on its own. 0 while the yield is not typed, and 0 while no pour is complete"
    },
    {
      "name": "ft3Slabs",
      "unit": "cubic feet",
      "formula": "the cubic feet of the complete pours whose shape is slab, added and rounded to two decimals, both entry modes together. 0 while no pour is complete"
    },
    {
      "name": "ft3Footings",
      "unit": "cubic feet",
      "formula": "the cubic feet of the complete pours whose shape is footing, added and rounded to two decimals. 0 while no pour is complete"
    },
    {
      "name": "ft3Columns",
      "unit": "cubic feet",
      "formula": "the cubic feet of the complete pours whose shape is column, added and rounded to two decimals. 0 while no pour is complete"
    },
    {
      "name": "yd3Slabs",
      "unit": "cubic yards",
      "formula": "round(ft3Slabs / 27, 3). 0 while no pour is complete"
    },
    {
      "name": "yd3Footings",
      "unit": "cubic yards",
      "formula": "round(ft3Footings / 27, 3). 0 while no pour is complete"
    },
    {
      "name": "yd3Columns",
      "unit": "cubic yards",
      "formula": "round(ft3Columns / 27, 3). 0 while no pour is complete"
    },
    {
      "name": "bagYieldTyped",
      "unit": "cubic feet a bag",
      "formula": "the yield as the caller typed it, held inside 0.1 to 2; 0 while the yield is not typed. It is echoed so that a caller can see which figure the bag counts were divided by, and it is the caller's own figure in both directions"
    },
    {
      "name": "wastePctTyped",
      "unit": "percent",
      "formula": "the allowance as the caller typed it, held inside 0 to 50 and to TWO decimals, which is what rounding.percentages states and what the engine does; 0 where it is blank. The two readings disagreed until 2026-10-24 (round 1, M6) and no sweep could separate them, because the control steps in halves and every value on that step is exact at one decimal"
    },
    {
      "name": "waiting",
      "unit": "true or false",
      "formula": "true while any started pour wants a dimension its own shape and entry mode need, OR while the yield is not typed, OR while no pour on the order is complete. While it is true the page prints NO headline figure - every volume and bag count in the glance, the table's foot and the allowance rows reads `not yet` - and the glance carries, above the figures, the sentence naming what the totals wait on. A completed pour's own row still prints its own volume. The figures in this endpoint are the arithmetic rather than the printing: a volume nobody has typed dimensions for is nothing, and `waiting` is how a caller knows the difference between a nothing that was computed and a nothing nobody has finished typing"
    }
  ],
  "formula": [
    "shape = slab, footing or column, read case-insensitively and by prefix; an unrecognised value reads as slab, which is the option the control shows",
    "mode = area when the slab's entry mode names an area, lw otherwise; a footing and a column have no mode",
    "qty = the item count, blank or under one read as one, held to 1 to 99 and rounded whole",
    "unit cubic feet, slab typed as length and width = round(length x width x thickness / 12, 2), the thickness being in inches and twelve inches making the foot",
    "unit cubic feet, slab typed as an area = round(area x thickness / 12, 2). The two modes are one geometry: 20 ft x 24 ft x 4 in and 480 sq ft x 4 in are the same 160.00 cubic feet, and the page asserts that identity at every state it sweeps",
    "unit cubic feet, footing = round(run x width / 12 x depth / 12, 2), the run in feet and the width and depth in inches",
    "unit cubic feet, column = round(3.141593 x diameter / 24 x diameter / 24 x height, 2). The diameter is in inches, so dividing it by 24 is halving it to a radius and dividing by twelve to put it in feet, in one step. Pi is taken to six decimals, which is the figure the page's own working prints, so the printed expression and the engine are one arithmetic",
    "a pour's cubic feet = round(unit cubic feet x qty, 2)",
    "cubic yards = round(cubic feet / 27, 3), twenty-seven cubic feet making the cubic yard",
    "bags as the division gives them = round(cubic feet / the cubic feet one bag fills, 2)",
    "whole bags = ceil(bags as the division gives them). Half a bag is not sold",
    "what the allowance adds = round(cubic feet x the allowance percent / 100, 2)",
    "cubic feet with the allowance in = round(cubic feet + what the allowance adds, 2); the allowance-applied bag count is taken from THAT volume and never from an already rounded bag count",
    "the order's cubic feet = the complete pours' cubic feet added, then rounded to two decimals",
    "THE ONE DISAGREEMENT THE SHEET OWNS OUTRIGHT: the order's whole-bag figure is the ceiling of the whole order's volume divided by the yield, while each pour's own whole-bag figure is the ceiling of that pour alone, so the rows can foot to a bag or two past the order line. Both figures are printed, the page says which is which, and neither is corrected into the other",
    "COMPLETENESS is per pour and per entry mode: a started pour (a name typed, a shape named, or any dimension its own shape and entry mode USE above nothing - a dimension the shape and mode do not use is read as nothing before the test) is complete when every dimension its own shape and mode need is above nothing. An incomplete pour contributes nothing to the order and its row prints what was typed and no computed figure",
    "waiting = any started pour incomplete, or the yield not typed, or no pour complete"
  ],
  "identities": [
    "a pour's cubic yards x 27 equals its cubic feet, to the rounding of the yardage, and the same holds for the order and for the allowance-applied figures; the page prints the division beside each one",
    "the complete pours' cubic feet add to totalFt3 by construction: the order is the sum of its rows and there is no second, independent reading of the order to reconcile against",
    "ft3Slabs + ft3Footings + ft3Columns equals totalFt3 wherever no rounding of the three parts has moved a cent of volume, because every complete pour has exactly one of the three shapes",
    "bagsWhole is at least bagsExact and under bagsExact + 1, which is what a ceiling is",
    "bagsWholeByRow is at least bagsWhole, and the two can differ by a bag or two: that is the per-row ceiling against the once-only ceiling, and it is printed rather than hidden",
    "totalFt3WithWaste is at least totalFt3, and equals it exactly where the allowance is nothing",
    "bagsWholeWithWaste is at least bagsWhole, because the allowance-applied volume is at least the volume",
    "wasteFt3 equals totalFt3WithWaste - totalFt3 to the rounding of the two decimals both are held to"
  ],
  "example": {
    "note": "Four pours on one order: a 20 ft by 24 ft garage pad at 4 inches, a patio the yard quoted as 480 square feet at the same 4 inches - the same area typed the other way, which has to foot to the same volume - a 40 ft run of 12 inch by 36 inch deck footings, and three 4 ft piers in 10 inch tube. The bag in the reader's hand prints 0.60 cubic feet, and the reader works to a 10 percent allowance.",
    "inputs": {
      "pourCount": 4,
      "bagYield": 0.6,
      "wastePct": 10,
      "pours": [
        {
          "name": "Garage pad",
          "shape": "slab",
          "slabBy": "lw",
          "dimA": 20,
          "dimB": 24,
          "dimC": 4,
          "qty": 1
        },
        {
          "name": "Patio quoted as square feet",
          "shape": "slab",
          "slabBy": "area",
          "dimA": 480,
          "dimB": 0,
          "dimC": 4,
          "qty": 1
        },
        {
          "name": "Deck footings",
          "shape": "footing",
          "slabBy": "lw",
          "dimA": 40,
          "dimB": 12,
          "dimC": 36,
          "qty": 1
        },
        {
          "name": "Porch piers",
          "shape": "column",
          "slabBy": "lw",
          "dimA": 4,
          "dimB": 10,
          "dimC": 0,
          "qty": 3
        }
      ]
    },
    "outputs": {
      "poursOnOrder": 4,
      "poursStarted": 4,
      "poursComplete": 4,
      "poursCounted": 4,
      "itemsTotal": 6,
      "ft3Pour1": 160,
      "ft3Pour2": 160,
      "ft3Pour3": 120,
      "ft3Pour4": 6.54,
      "ft3Pour5": 0,
      "ft3Pour6": 0,
      "yd3Pour1": 5.926,
      "yd3Pour2": 5.926,
      "yd3Pour3": 4.444,
      "yd3Pour4": 0.242,
      "yd3Pour5": 0,
      "yd3Pour6": 0,
      "bagsWholePour1": 267,
      "bagsWholePour2": 267,
      "bagsWholePour3": 200,
      "bagsWholePour4": 11,
      "bagsWholePour5": 0,
      "bagsWholePour6": 0,
      "ft3WithWastePour1": 176,
      "ft3WithWastePour2": 176,
      "ft3WithWastePour3": 132,
      "ft3WithWastePour4": 7.19,
      "ft3WithWastePour5": 0,
      "ft3WithWastePour6": 0,
      "totalFt3": 446.54,
      "totalYd3": 16.539,
      "bagsExact": 744.23,
      "bagsWhole": 745,
      "bagsWholeByRow": 745,
      "wasteFt3": 44.65,
      "totalFt3WithWaste": 491.19,
      "totalYd3WithWaste": 18.192,
      "bagsWithWasteExact": 818.65,
      "bagsWholeWithWaste": 819,
      "bagsWholeWithWasteByRow": 820,
      "bagsAddedByAllowance": 74,
      "bagsAddedByAllowanceByRow": 75,
      "ft3Slabs": 320,
      "ft3Footings": 120,
      "ft3Columns": 6.54,
      "yd3Slabs": 11.852,
      "yd3Footings": 4.444,
      "yd3Columns": 0.242,
      "bagYieldTyped": 0.6,
      "wastePctTyped": 10,
      "waiting": false
    }
  },
  "not_covered": [
    "What any dimension should be. No thickness, no depth, no width, no diameter, no spacing and no dimension of any kind is supplied, suggested, defaulted or called usual here, for any pour, any job or any product, and nothing this endpoint returns is a specification anyone builds to.",
    "Anything structural: loads, spans, reinforcement, rebar, mesh, bearing, retaining work, frost depth, footings sized to anything, or whether a dimension the caller typed is adequate for anything at all.",
    "Any code or standard, and any statement that anything meets a requirement. No ACI, no IRC, no IBC, no local code, no inspection, no approval.",
    "Mix design: no proportion, no water-cement ratio, no slump, no aggregate, no admixture, no fibre, no air entrainment.",
    "Strength and time: no psi, no cure time, no set time, no weather rule, no finishing or curing method.",
    "What a bag yields. The cubic feet one bag fills is the caller's own reading of the bag in their hand, and this endpoint holds no yield for any brand, product or mix.",
    "What a waste allowance should be. The allowance is the caller's own practice, and no figure of that kind is held here.",
    "Any brand, product or supplier, any price, any availability and any affiliate link. There is no money figure in this endpoint at all.",
    "Pumping, placing, finishing, handling, how a pour is made, or what equipment it wants.",
    "Any comparison with a supplier's calculator, a manufacturer's table or any other application. This endpoint describes its own arithmetic and says nothing about anyone else's."
  ],
  "no_advice": "Arithmetic on figures the caller types. It recommends no dimension, no quantity, no product, no method and no price, it asks for nothing that identifies anybody, and it converts rather than specifies."
}
