{
  "name": "Terrazzo pour quantities and batch ledger",
  "page": "https://otherworldlabs.com/terrazzo-mix-ratio-log/",
  "endpoint": "https://otherworldlabs.com/terrazzo-mix-ratio-log/api.json",
  "question": "For one terrazzo job of up to six pours, how much volume does each pour come to at its area and finished thickness, how much does it come to with the installer's own waste allowance added, how does that volume split into matrix and aggregate at the two part figures the installer copies off the system's own data sheet, and how many batches of that installer's own mixer is it?",
  "answers": "one job at a time, up to six pours; the page keeps no history and this endpoint stores nothing",
  "version": "2026-10-11a",
  "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",
  "the_ratio_is_an_input": "matrixParts and aggregateParts are INPUTS and never outputs. This calculation supplies no ratio, carries no default and no example ratio, and does not check or correct the two figures given to it: an epoxy terrazzo ratio is the resin system's own data sheet and a cement terrazzo ratio is the job's own specification, and neither is knowable here. Both ship empty on the page, and with either of them empty every split output below is null while the volume, waste and batch outputs are returned as they stand - and the two per-batch split figures, matrixPerBatchGal and aggregatePerBatchGal, are ledger outputs that need a pour with a volume as well, which their own lines state (review round 1, B-1).",
  "the_page_ships_a_worked_example": "The PAGE beside this endpoint ships its two pour cards filled in - Lobby bay 1 at 480 sq ft and Lobby bay 2 at 260 sq ft, both at 0.375 in with a tenth for waste - and its mixer volume at 11 gal, which is the worked example below. It has to: the markup bakes the page's own answer into it so an agent reading the HTML gets figures rather than labels, and a page that shipped those cards blank would answer nothing until its script ran. So the page keeps a rule this endpoint has no output for: a figure the page prints carries a marker naming each shipped figure IT rests on, and a sentence in front of the figures counts the cards it is about. WHAT COUNTS AS RESTING ON A SHIPPED FIGURE, stated exactly, because the page's first two answers to it were both too narrow: a pour card's printed volume rests on a figure this page shipped when ANY ONE of the three figures that volume is worked from - the area, the finished thickness, the waste allowance - is still the figure this page shipped in that card. Not all three at once: that was the rule until the closing round, and it left a reader who cleared the waste box on the two shipped cards looking at a volume worked out of this page's own 480 sq ft and 0.375 in with no marker on it and nothing in front of it, which is this very sentence being false of the page. The marker is per figure and not per state (review round 4, B-1, which found one marker string built for the whole state and appended to all five of the page's headline figures). Which figures rest on what: the volume with the waste allowance, matrixGal and aggregateGal are added over the pours that HAVE A VOLUME, so they rest on those cards and not on the mixer volume, which does not enter them; the seven ledger outputs are about the newest pour with a volume and are divided by the mixer volume, so they rest on that one card and that one figure. The ratio is in neither list: matrixGal, aggregateGal and the per-batch figures are NULL until both part figures are typed, so no figure the page prints is ever waiting on the ratio, and the sentence that says the ratio is still blank is the ratio warning's rather than a marker on a figure. NO OUTPUT VALUE CHANGES because of it - the arithmetic of a shipped figure is the arithmetic of the same figure typed by a reader, and an agent reproducing these outputs can ignore the rule entirely. It is a rule about what the page SAYS beside a figure, and it is here so that an agent reading the endpoint beside the page is not surprised by the marker. The comparison is of the figures and not of the person: a card retyped to 480 sq ft reads as holding that shipped figure again, and a figure this page ships in a box - its 0.375 in among them - can be the figure a reader would have typed into that box himself, so a card a reader filled in entirely himself can carry the marker. The page says what the boxes read as rather than whose figures they are, because it cannot know, and it says that in the same block. Added at S12 after the S11(b) agent-as-user pass, which filled the first input block from the top, left the cards as they loaded, and was shown five bold unmarked figures about this page's own example; widened by the closing round to the test above.",
  "scope": "Quantities only. This calculation supplies no ratio and no product figure of any kind, and it returns nothing, states nothing and implies nothing about how a floor is placed, mixed, finished or protected. It is not a submittal and it is not a statement that anything meets anybody's specification.",
  "units": {
    "area": "square feet",
    "thickness": "inches",
    "volume": "cubic feet, and US gallons by the constant below",
    "gallonsPerCubicFoot": 7.48052,
    "note": "Every ROW's gallons figure is that row's own cubic-feet figure times 7.48052, and every cubic-feet figure derived from gallons is that gallons figure divided by it, so a reader recomputing a ROW uses the constant the engine used. A JOB FOOTING is NOT a converted figure: finishedGal, wasteGal and withWasteGal across the record are their column's own rounded ROW gallons ADDED AS PRINTED, as the outputs list defines them, and finishedCuFt and withWasteCuFt are their column's rounded row cubic feet added the same way. The two readings are a tenth of a gallon apart in about a third of states, because each row was rounded before it was added: review round 3, b-3, found this first, and the closing round re-measured it over this page's own current sweep (gates.json's 12 families at seed 20261011, widened to the 4,492-state floor) rather than quote a past round's count against a gates.json that no longer exists (closing round, m-4): finishedGal away from round(finishedCuFt x 7.48052, 1) in 1367 of the 4,442 states with a footing to compare, and withWasteGal away from round(withWasteCuFt x 7.48052, 1) in 1371 of the same 4,442 - for instance two identical pours of 480 sq ft at 0.375 in with a 10 per cent allowance return withWasteCuFt 33.000 and withWasteGal 246.8, where 33.000 x 7.48052 rounds to 246.9. So a reader or an agent recomputing a footing ADDS THE PRINTED ROWS; converting the job's cubic feet instead reproduces neither the page nor this endpoint. Nothing is returned in pounds or kilograms: a figure by weight would need a product's density and no product's numbers appear anywhere in this calculation."
  },
  "rounding": {
    "function": "round(x, n) = Math.round(x * 10^n) / 10^n on the double, which puts a half toward POSITIVE INFINITY: round(-1.25, 1) is -1.2 and not -1.3. That is NOT half away from zero. The two forms differ only on a negative half, and NO OUTPUT OF THIS CALCULATION REACHES ONE (review round 2, m-1, which corrects the claim this line carried): the only signed outputs are recordedAgainstWorkedMatrixGal and recordedAgainstWorkedAggregateGal, and both operands of each are already kept to a tenth of a gallon - the recorded figures by the field rule, the worked figures by this same rounding - so their difference is a multiple of a tenth and lands on no half-tenth. The rule is written down because it is the rule the engine applies and a reimplementation that rounded the other way would disagree with it somewhere, not because a state of this page turns on it. Every other figure this calculation returns is non-negative, where the two forms agree.",
    "cubicFeet": "three decimals",
    "gallons": "one decimal",
    "parts": "one decimal, as typed",
    "percentages": "one decimal",
    "counts": "whole: poursEntered, poursWithVolume, poursRecorded and newestFullBatches are counts and newestFullBatches is a floor rather than a rounding, which is why newestPartialGal exists",
    "order": "Each line is computed from the figure the line before it printed, rounded, rather than from an unrounded carry: the finished cubic feet are rounded to three decimals before they are turned into gallons, and the gallons of the volume with waste are taken from the rounded with-waste cubic feet. So a reader who recomputes any ROW from the figures printed beside it gets the figure printed on it. The same rule is why a JOB FOOTING is its column added rather than its own conversion (review round 3, b-3, and units.note above): the rows were rounded before they were added, so adding as printed and converting the total are two different figures and the one this calculation returns is the first."
  },
  "field_rule": {
    "fields": ["area", "thickness", "wastePct", "usedMatrixGal", "usedAggGal", "batchGallons", "matrixParts", "aggregateParts"],
    "rule": "One rule for every numeric field, and the page's engine is written from this paragraph. (0) The figure is FIRST rounded to the precision that field is kept to - whole square feet, four decimals of an inch, whole per cent, a tenth of a gallon, a tenth of a part - and the rounded figure is what the three cases below are read against: a 0.05 typed into a field kept to a tenth is 0.1, which is inside the range its control offers and is used. (1) Blank, whitespace-only or anything that does not read as a number: NOT GIVEN, and no output that would need it is returned. (2) A figure over the top of the range the page's own control offers: brought down to that top, used at that top, and the page prints a note naming BOTH numbers, what you typed and what the record uses. (3) A figure below the smallest figure the control offers: NOT GIVEN, with a note naming what the box reads as. Zero is case (3) for every field whose floor is above zero, and a negative figure is case (3) for all of them. There is no fourth case: this calculation never works from a figure no control offers.",
    "consequence": "A pour HAS A VOLUME only when both its area and its finished thickness are given; without both, that pour contributes nothing and returns nothing. A blank waste allowance is nothing added, so the volume with waste is then the finished volume. Without batchGallons there is no batch count and no ledger. Without BOTH part figures there is no split: matrixGal, aggregateGal, matrixPerBatchGal, aggregatePerBatchGal and both difference outputs are null, and the volume, the waste and the batch outputs are unaffected. The SEVEN LEDGER outputs - newestFullBatches, newestPartialGal, newestPartialFillPct, matrixPerBatchGal, aggregatePerBatchGal, newestLedgerMatrixGal and newestLedgerAggregateGal (review round 3, m-3: this sentence said five and then named seven, which is M10's class) - need one more thing than the split does: a pour that HAS A VOLUME. With the parts and the mixer volume given and not one pour carrying both an area and a finished thickness, every one of them is null, because there is nothing to batch. Review round 1, B-1 found this paragraph and two others stating the condition for the two per-batch figures as parts-plus-mixer, which is a state the page returns null in."
  },

  "inputs": [
    { "name": "pourCount", "type": "integer", "unit": "pour rows", "required": false, "range": "1 to 6 from the page's own control, step 1", "note": "How many pour rows this record holds. The calculation reads the first pourCount members of pours and ignores the rest, so a row the reader has hidden again keeps what was typed in it without counting anywhere. The page's own select always sends a figure; where none is sent - a caller of this endpoint, or a workbook handing the engine a job - a blank or unreadable figure reads as THE NUMBER OF POUR ROWS SUPPLIED, capped at six, because reading it as one would silently drop every pour after the first." },
    { "name": "batchGallons", "type": "number", "unit": "US gallons", "required": false, "range": "1 to 100 from the page's own control, step 0.5", "note": "What one batch of the installer's own mixer usably holds, off its plate or its fill line, and not the drum's rated capacity unless that is what is filled. Kept to one decimal. Not given, newestFullBatches, newestPartialGal, newestPartialFillPct, matrixPerBatchGal and aggregatePerBatchGal are all null." },
    { "name": "systemAsWritten", "type": "string", "unit": "none", "required": false, "note": "The system name exactly as the data sheet writes it. Free text, cut at 60 characters, copied and never interpreted: nothing is computed from it and nothing here reads it as a product. It is returned in no output; it exists so the printed sheet says which system the figures were worked for." },
    { "name": "matrixParts", "type": "number", "unit": "parts", "required": false, "range": "0.1 to 20 from the page's own control, step 0.1", "note": "The matrix side of the ratio, as the installer's own data sheet or job specification writes it. AN INPUT, never an output: see the_ratio_is_an_input above. Ships empty on the page. Kept to one decimal. Nothing here supplies it, suggests it, prints an example of it or judges it against any system or specification; what it IS subject to is field_rule, the same rule as every other numeric field, so a figure over 20 is brought down to 20 and used at 20 with both numbers said in a note (review round 4, B-4: this note read 'never corrected', which is false in exactly that state and in the page's own words two screens from a note naming what it used)." },
    { "name": "aggregateParts", "type": "number", "unit": "parts", "required": false, "range": "0.1 to 20 from the page's own control, step 0.1", "note": "The aggregate side of the same ratio, in the order the data sheet gives it. An input, never an output, ships empty, kept to one decimal, judged against nothing, and subject to field_rule exactly as matrixParts is (B-4). No ordering between the two parts is assumed or enforced: either side may be the larger, because that is the data sheet's business and not this calculation's." },
    { "name": "pours[].label", "type": "string", "unit": "none", "required": false, "note": "The installer's own name for the bay. Free text, cut at 40 characters, trimmed. Nothing is computed from it. It is joined to the row's own position to make the row's name, so a note about a pour names something the form can be found by." },
    { "name": "pours[].area", "type": "integer", "unit": "square feet", "required": false, "range": "1 to 20000 from the page's own control, step 1", "note": "The area of that bay off the installer's own measure, in whole square feet. A fraction is rounded to the nearest whole. Not given, that pour has no volume at all." },
    { "name": "pours[].thickness", "type": "number", "unit": "inches", "required": false, "range": "0.125 to 1 from the page's own control, step 0.0625, which is the sixteenth of an inch a terrazzo floor is specified in", "note": "The finished thickness that pour is placed to. Kept to four decimals and taken as typed: a figure off the sixteenth is NOT snapped to one, because the figure is the reader's. Not given, that pour has no volume at all." },
    { "name": "pours[].wastePct", "type": "integer", "unit": "per cent", "required": false, "range": "0 to 25 from the page's own control, step 1", "note": "The installer's own waste allowance for that pour, from that installer's own past pours. There is no default, no typical figure and no recommendation anywhere in this calculation. Blank is nothing added, and the page says so on the row." },
    { "name": "pours[].usedMatrixGal", "type": "number", "unit": "US gallons", "required": false, "range": "0 to 2000 from the page's own control, step 0.1", "note": "What was actually drawn of the matrix for that pour, written down off the floor afterwards. Blank until it is recorded. It is one of a PAIR: with only one of the two recorded figures on a row, this calculation returns neither for that row and the row's differences are null." },
    { "name": "pours[].usedAggGal", "type": "number", "unit": "US gallons", "required": false, "range": "0 to 2000 from the page's own control, step 0.1", "note": "What was actually drawn of the aggregate for that pour, the other half of the pair above, under the same rule." }
  ],
  "row_rules": [
    "A pour row HAS A VOLUME once it has both an area and a finished thickness. Nothing else on the row can give it one.",
    "A pour row is RECORDED once it HAS A VOLUME and carries both recorded figures. One of the two is not a reading of what went in, and this calculation returns neither. Both of them on a row with no volume is not a recorded pour either: there is no area and no finished thickness to set them against, so poursRecorded does not count that row, no recorded total includes those figures, and the page prints a dash in that row's recorded cells with every other cell on the row and says in a row note why they are dashed. Review round 1, B-3: this rule's first line said \"once it has both recorded figures\", the page's own table believed that line, and the result was two figures on a row and a dash in the total of their own column.",
    "The waste allowance is added to the finished volume, and every figure after it is worked from the volume with it in: the split, the batch count and the ledger are all of the volume WITH waste.",
    "The matrix is the volume with waste times matrixParts divided by the two parts added. The aggregate is what is LEFT of the volume with waste after the matrix, so the two always add back to the volume with waste and the tenth of a gallon that rounding leaves falls on the aggregate. The same rule splits one batch.",
    "The batch count is a floor: newestFullBatches whole batches and then newestPartialGal left over, worked in tenths of a gallon so the count and the remainder are exact. A pour that divides exactly returns newestPartialGal 0 and no part-full row.",
    "newestFullBatches, newestPartialGal, newestPartialFillPct and the ledger are for the NEWEST pour that has a volume, which is the last such row in pours. Every other output is over every pour that has a volume.",
    "A pour has TWO honest readings of its own split and this calculation returns both, rounding neither into the other. matrixGal is the pour divided once. newestLedgerMatrixGal is what the pour's batches carry, which is each full batch's charge rounded to a tenth of a gallon, added over the batches, plus the part-full batch's own charge. The two agree to a tenth on an ordinary pour and can sit far apart where the batch is small and the batches are many - twelve thousand one-gallon batches at a tenth of a gallon's precision is a measurable difference, and it is a fact about that batch size rather than an error. The page prints both figures in the ledger's footing and names the difference in a note whenever there is one."
  ],
  "outputs": [
    { "name": "poursEntered", "unit": "pour rows", "formula": "pourCount, brought inside 1 to 6" },
    { "name": "poursWithVolume", "unit": "pour rows", "formula": "the number of those rows with both an area and a finished thickness" },
    { "name": "poursRecorded", "unit": "pour rows", "formula": "the number of rows with a volume that also carry both recorded figures" },
    { "name": "totalParts", "unit": "parts", "formula": "matrixParts + aggregateParts to one decimal; null unless both are given" },
    { "name": "finishedCuFt", "unit": "cubic feet", "formula": "sum over the rows with a volume of round(area x thickness / 12, 3); null when no row has a volume" },
    { "name": "finishedGal", "unit": "US gallons", "formula": "sum over those rows of round(that row's finished cubic feet x 7.48052, 1)" },
    { "name": "wasteGal", "unit": "US gallons", "formula": "sum over those rows of round(round(finished cubic feet x wastePct / 100, 3) x 7.48052, 1); the waste allowance as its own figure" },
    { "name": "withWasteCuFt", "unit": "cubic feet", "formula": "sum over those rows of round(finished cubic feet + waste cubic feet, 3)" },
    { "name": "withWasteGal", "unit": "US gallons", "formula": "sum over those rows of round(that row's with-waste cubic feet x 7.48052, 1). This is the figure the split, the batch count and the ledger are all worked from" },
    { "name": "matrixGal", "unit": "US gallons", "formula": "sum over those rows of round(that row's with-waste gallons x matrixParts / totalParts, 1); null unless both part figures are given" },
    { "name": "aggregateGal", "unit": "US gallons", "formula": "sum over those rows of (that row's with-waste gallons less that row's matrix gallons); null unless both part figures are given. matrixGal + aggregateGal equals withWasteGal exactly, by the remainder rule" },
    { "name": "newestFullBatches", "unit": "batches", "formula": "floor(newest row's with-waste gallons / batchGallons), worked in tenths; null without a mixer volume or without a row with a volume" },
    { "name": "newestPartialGal", "unit": "US gallons", "formula": "the newest row's with-waste gallons less newestFullBatches x batchGallons, worked in tenths; 0 when the pour divides exactly; null without a mixer volume or without a row with a volume, the same condition newestFullBatches carries" },
    { "name": "newestPartialFillPct", "unit": "per cent", "formula": "round(newestPartialGal / batchGallons x 100, 1). It is under 100 by construction, because a remainder smaller than one batch is what it is; null without a mixer volume or without a row with a volume" },
    { "name": "matrixPerBatchGal", "unit": "US gallons", "formula": "round(batchGallons x matrixParts / totalParts, 1): what one full batch carries of matrix. Null unless both part figures and a mixer volume are given AND the record holds a pour with a volume: this is a LEDGER output, and the whole ledger block waits on the newest pour that has an area and a finished thickness, which is the same condition newestFullBatches and newestLedgerMatrixGal carry in their own lines. The figure is a fact about the mixer and the ratio alone, so returning it before a pour exists would be arithmetically defensible, and the page does not: it prints no batch figure at all until there is something to batch, and this endpoint answers with the page. Review round 1, B-1: the three paragraphs that stated this condition as parts-plus-mixer were the wrong side of the disagreement, not the engine" },
    { "name": "aggregatePerBatchGal", "unit": "US gallons", "formula": "batchGallons less matrixPerBatchGal: what one full batch carries of aggregate, by the same remainder rule. Null in exactly the states matrixPerBatchGal is null in, this one included: the two are nulled together, so the identity matrixPerBatchGal + aggregatePerBatchGal equals batchGallons is never half-returned" },
    { "name": "newestLedgerMatrixGal", "unit": "US gallons", "formula": "the newest row's ledger matrix column, added as printed: newestFullBatches x matrixPerBatchGal plus the part-full batch's own matrix charge, each of them rounded to a tenth before it is added. Null without a mixer volume, without a row with a volume or without both part figures" },
    { "name": "newestLedgerAggregateGal", "unit": "US gallons", "formula": "the same for the aggregate column. newestLedgerMatrixGal + newestLedgerAggregateGal equals the newest row's with-waste gallons exactly, because every ledger entry's aggregate is that entry's own remainder" },
    { "name": "recordedMatrixGal", "unit": "US gallons", "formula": "sum of usedMatrixGal over the recorded rows; null when no row is recorded" },
    { "name": "recordedAggregateGal", "unit": "US gallons", "formula": "sum of usedAggGal over the recorded rows; null when no row is recorded" },
    { "name": "recordedAgainstWorkedMatrixGal", "unit": "US gallons", "formula": "recordedMatrixGal less the matrix this calculation works out for THOSE SAME recorded rows, SIGNED and returned negative where less went in than was worked out; null when no row is recorded or either part figure is missing. It is deliberately not the difference against matrixGal: a job recorded on one of three pours must not be set against the whole job's figure" },
    { "name": "recordedAgainstWorkedAggregateGal", "unit": "US gallons", "formula": "the same for the aggregate, under the same rule and with the same sign convention" }
  ],
  "formula": [
    "read every numeric field by the field_rule above: each is either a figure inside the range its own control offers, or not given",
    "totalParts = matrixParts + aggregateParts, to one decimal, where both are given",
    "for each of the first pourCount rows: it has a volume if both area and thickness are given",
    "for each row with a volume: cuFt = round(area x thickness / 12, 3)",
    "for each row with a volume: gal = round(cuFt x 7.48052, 1)",
    "for each row with a volume: wasteCuFt = round(cuFt x wastePct / 100, 3); wasteGal = round(wasteCuFt x 7.48052, 1)",
    "for each row with a volume: withWasteCuFt = round(cuFt + wasteCuFt, 3); withWasteGal = round(withWasteCuFt x 7.48052, 1)",
    "for each row with a volume, where a mixer volume is given: fullBatches = floor(withWasteGal / batchGallons) in tenths; partialGal = withWasteGal - fullBatches x batchGallons in tenths; partialFillPct = round(partialGal / batchGallons x 100, 1)",
    "for each row with a volume, where both part figures are given: matrixGal = round(withWasteGal x matrixParts / totalParts, 1); aggGal = withWasteGal - matrixGal; matrixCuFt = round(matrixGal / 7.48052, 3); aggCuFt = round(aggGal / 7.48052, 3)",
    "the job's figures are the column footings of the rows with a volume, added as printed",
    "the ledger is the newest row with a volume: one entry per full batch, each carrying matrixPerBatchGal and aggregatePerBatchGal, then one part-full entry carrying partialGal split by the same rule. Past 24 full batches the page prints the first 12 as rows of their own and one row standing for the rest, because every full batch carries an identical charge; the entries and their total are unchanged by that",
    "the recorded figures are added over the recorded rows only, and each difference is the recorded sum less the worked-out sum for those same rows"
  ],
  "identities": [
    "matrixGal + aggregateGal equals withWasteGal exactly, because the aggregate on every row is the remainder after the matrix",
    "matrixPerBatchGal + aggregatePerBatchGal equals batchGallons, by the same rule on one batch",
    "newestFullBatches x batchGallons + newestPartialGal equals the newest row's with-waste gallons, exactly, because both are kept in tenths",
    "0 is at most newestPartialGal and newestPartialGal is under batchGallons, so newestPartialFillPct is inside 0 to 100",
    "withWasteGal is at least finishedGal, and the two are equal exactly where every waste allowance on the record ADDS NOTHING TO ITS ROW'S ROUNDED CUBIC FEET - that is, where every row's waste cubic feet round to 0.000 at the three decimals this calculation keeps them to. That INCLUDES a waste allowance typed, non-zero and legal: one pour of 1 sq ft at 0.125 in with a 1 per cent allowance returns finishedGal 0.1, wasteGal 0.0 and withWasteGal 0.1. It is NOT the same as the waste GALLONS rounding to nothing, which is the reading to avoid: one pour of 1 sq ft at 0.375 in with a 10 per cent allowance returns wasteCuFt 0.003, wasteGal 0.0 and yet finishedGal 0.2 against withWasteGal 0.3, because the gallons of each volume are taken from that volume's own rounded cubic feet (see rounding.order) and 0.034 cu ft is a tenth of a gallon more than 0.031. Review round 3, b-4: this line said 'equal exactly where every waste allowance is nothing', which the first state disproves, and the inequality was the only half of it the harness checked; the condition above is the engine's own and is asserted over every swept state",
    "the ledger's gallons column, added over its entries, equals the newest row's with-waste gallons",
    "newestLedgerMatrixGal + newestLedgerAggregateGal equals that same figure, so the ledger's two material columns account for the whole pour even where neither of them equals the pour's own split of it",
    "every one of these is asserted by the page's own test harness over every state the shared generator reaches"
  ],
  "example": {
    "note": "the job the page ships filled in, so this endpoint and the page answer with the same figures. Two pours, a mixer volume, and the two part figures deliberately EMPTY, which is the page's waiting state: the volumes, the waste and the batch counts are returned and every split output is null.",
    "inputs": {
      "pourCount": 2,
      "batchGallons": 11,
      "systemAsWritten": "",
      "matrixParts": "",
      "aggregateParts": "",
      "pours": [
        { "label": "Lobby bay 1", "area": 480, "thickness": 0.375, "wastePct": 10, "usedMatrixGal": "", "usedAggGal": "" },
        { "label": "Lobby bay 2", "area": 260, "thickness": 0.375, "wastePct": 10, "usedMatrixGal": "", "usedAggGal": "" }
      ]
    },
    "outputs": {
      "poursEntered": 2,
      "poursWithVolume": 2,
      "poursRecorded": 0,
      "totalParts": null,
      "finishedCuFt": 23.125,
      "finishedGal": 173,
      "wasteGal": 17.3,
      "withWasteCuFt": 25.438,
      "withWasteGal": 190.3,
      "matrixGal": null,
      "aggregateGal": null,
      "newestFullBatches": 6,
      "newestPartialGal": 0.9,
      "newestPartialFillPct": 8.2,
      "matrixPerBatchGal": null,
      "aggregatePerBatchGal": null,
      "newestLedgerMatrixGal": null,
      "newestLedgerAggregateGal": null,
      "recordedMatrixGal": null,
      "recordedAggregateGal": null,
      "recordedAgainstWorkedMatrixGal": null,
      "recordedAgainstWorkedAggregateGal": null
    }
  },
  "not_covered": [
    "The ratio. It is an input here and it is the one figure this calculation will never supply, default, suggest, illustrate or check. An epoxy terrazzo ratio belongs to the resin system's own data sheet and a cement terrazzo ratio to the job's own specification.",
    "Anything about how a floor is placed, mixed, finished or protected, and anything about what any product does. No figure here is about a product, and none is by weight: a weight would need a density, and no product's numbers appear anywhere in this calculation.",
    "Whether a quantity is enough. This is arithmetic on an area, a thickness, a waste allowance and a ratio supplied to it; it promises no outcome on any floor and it is not a check on anybody's order.",
    "Money. No price, no cost per square foot, no labour and no waste charge: nothing in this calculation has a currency in it.",
    "The submittal package. A commercial job's record is the form the general contractor and the architect ask for, and this is not that form and is not a statement that anything meets anybody's specification.",
    "Any history. One job at a time; the page stores nothing between visits and this endpoint stores nothing at all.",
    "Anything about who may do this work. No licence, no certification and no qualification is recorded, asked for or implied."
  ],
  "no_advice": "This endpoint returns arithmetic on figures supplied to it. It recommends no ratio, no waste allowance, no quantity to order and no course of action, and it makes no judgment about any floor, any product or any person's work."
}
